![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
kernel
文章平均质量分 88
shaohui973
这个作者很懒,什么都没留下…
展开
-
linux MMU以及初始化过程内存布局
本文以linux-3.14.17(arm)版本的代码来讲述linux从第一行代码运行至start_kernel()的过程。arch/arm/kernel/vm-linux.lds链接脚本定义了kernel image各段的分布,以及定义了一些全局符号,如下图:这个链接脚本同时定义了入口符号stext.stext定义在arch/arm/kernel/head.S92行safe_svcmode_maskall做了些什么?arch/arm/include/asm/assembl原创 2021-06-16 17:57:09 · 2137 阅读 · 3 评论 -
linux kernel同步之mutex
互斥锁,顾名思义,就是互斥的,独占的,只能有一个进程占有锁,其他进程都得等待锁占有者释放互斥锁,才有可能占有锁。以下的内容是基于linux-3.11.1(arm)内核代码来讲解内核中mutex的实现。mutex的定义:linux-3.11.1/include/linux/mutex.h其中, count表示空闲资源的数目,初始值为1,表示只有一个资源可用,即只能一个进程可以用。count: 1 表示可以lockcount: 0 表示锁被某个进程lock了,且没有其他进程来lock原创 2021-06-01 14:19:28 · 723 阅读 · 0 评论 -
linux的用户态堆栈(sp_usr)和内核态堆栈(sp_svc)
在arm linux中,进程的运行处于两种模式之一,要么在用户空间运行(用户模式USR_MODE),要么在内核空间运行(SVC_MODE)。在内核空间时,处于特权模式,在用户空间时,处于普通模式。用户空间运行时和内核空间运行时,所用的堆栈是不同的。本文基于linux-3.11.1代码来学习这两种运行空间下,堆栈是如何运作的(切换)。linux-3.11.1/kernel/fork.cSYSCALL_DEFINE0(fork) -> do_fork() -> copy_proces原创 2021-05-28 18:12:27 · 1904 阅读 · 1 评论 -
linux kernel中的DTS解析到platform_device的注册
在linux内核早期的时候,每个嵌入式系统的板载信息(总线,设备的寄存器地址等)都是hardcode在arch/<cpu>/match-xxx/board-xxx.c之类的文件中,即必须存在这样的c文件,里面定义了板子上的硬件的地址等信息。这样做会造成很多很多的大量相似的没多少用的重复代码。为了解决这个问题,而引入了DTS(device tree source)。每个嵌入式系统的描述硬件信息的DTS文件存放在arch/<cpu>/boot/dts/目录下,比如ast250原创 2021-04-27 16:39:16 · 2227 阅读 · 0 评论 -
linux下non-preempt的RCU实现分析(基于rcu-tree)
本文讲述的是linux 4.7.1下的RCU实现(tree-RCU)。在kernel中,rcu有tiny rcu和tree rcu两种实现,tiny rcu更加简洁,通常用在小型嵌入式系统中,tree rcu则被广泛使用在了server, desktop以及android系统中.RCU(Read-Copy Update),顾名思义就是读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个原创 2021-03-24 15:39:53 · 1367 阅读 · 0 评论 -
ARM下的读写锁rwlock实现
内核同步之读写锁rwlock_t本文讲述的是基于linux 4.7.1版本的。我们先来看读写锁的结构体定义:include/linux/rwlock_types.h这里只考虑raw_lock一个成员。arch/arm/include/asm/spinlock_types.harch_rwlock_t只有一个成员lock.下面,我们来介绍相关的API。1. rwlock_init()这个用来初始化rwlock.include/linux/rwlock.h原创 2021-03-09 16:32:36 · 710 阅读 · 0 评论 -
ARM下的自旋锁spinlock
本文讲述的是linux 4.7.1下ARM architecture的自旋锁spinlock的实现。先来看定义:include/linux/spinlock_types.h我们不考虑CONFIG_DEBUG_LOCK_ALLOC, spinlock_t结构体中只有一个成员struct raw_spinlock rlock. struct raw_spinlock也只有一个成员arch_spinlock_t raw_lock.arch/arm/include/asm/spinlock_ty原创 2021-03-08 17:15:17 · 1189 阅读 · 0 评论 -
linux CFS调度和load balance
内容有点多,文章篇幅长!!!本文讲述的是基于sched entity的cfs调度和load balance,不涉及group的cfs调度和load balance. 代码是基于linux-4.7.1.首先,我们来看一下两个初始化sched_init()和sched_init_smp()。start_kernel() -> sched_init()kernel/sched/core.csched_init()为每个cpu的rq(running queue)初始原创 2021-02-20 09:53:04 · 835 阅读 · 0 评论 -
linux ARM多处理器的启动过程
本文的假设前提: 单CPU(同一个package/socket), 多核multi-core, smp。在smp系统中,primary cpu进入start_kernel()执行。init/main.cboot_cpu_init()将primary cpu设置为active, present, possible, online。setup_arch()将构建machine_desc(单板硬件描述),设置secondary cpu引导方式psci。arch/arm/kernel/s原创 2020-12-04 18:18:51 · 2466 阅读 · 0 评论 -
hamming weight algorithm(汉明算法)以及kernel的实现
hamming weight(汉明权重)算法是一种用于计算字节串中1bit的数目。比如,0b1001 0000,ob0000 0011, 0b1000 0001的汉明权重均为2,ob 1110 0001, 0b1100 1100, 0b1001 1001的汉明权重均为4.汉明权重的算法(32位):int Hamming_weight(uint32_t n ) { n = (n&0x55555555) + ((n>>1)&0x55555555); ...原创 2020-11-11 18:06:08 · 1148 阅读 · 0 评论 -
x86下usb驱动framework
本文讲述的USB驱动,是基于X86架构下的PCI-USB总线下的USB设备驱动,侧重函数调用。架构如下:涉及的几个modules:arch/x86/pci/legacy.cdrivers/usb/host/uhci-hcd.cdrivers/usb/core/usb.c其中arch/x86/pci/legacy.c和drivers/usb/core/usb.c使用了subsys_initcall()来申明初始化的函数存放在initcall4这个段,结合makefile可知,drive原创 2020-09-28 09:28:47 · 595 阅读 · 0 评论 -
linux kernel编译makefile简要介绍(arm)
本文以ast2500evb板子的linux kernel编译来进行。该板子使用的是arm cpu(1176)编译内核的命令参数为make ARCH=arm CROSS_COMPILE=arm-linux-首先来看顶层目录的Makefile.Linux/Makefile588行定义了make的target为vmlinux,但是,要注意了,我们需要明白make是怎么工作的:make程序首先读取-f参数指定的makefile文件或当前目录下的Makefile或makefile文件,并且递归原创 2020-09-07 18:04:52 · 1154 阅读 · 0 评论 -
linux中断处理与NAPI机制
本文以ast2500evb板子(arm1176jzs)为背景来介绍linux中断服务子程序的工作过程。在开始前,我们需要解决1个问题:中断服务子程序的地址如何告知cpu对于这个问题,我们可以从arm1176 手册可以获得: cpu开启了high vectors(默认),则中断向量表的地址为0xFFFF0000。我们再来看代码,代码中的中断向量表定义在哪?Linux/arch/arm/kernel/entry-armv.S 从上图中可知,我们的中断服务代码放在__vector原创 2020-08-25 14:53:20 · 691 阅读 · 0 评论 -
linux kernel之platform driver&device
在驱动程序的模型分层有一层总线基础层(PCI总线,I2C总线,USB总线等),总线层对应实际上的总线,然而,对于嵌入式开发领域而言,有很多SOC芯片内置了各种外设,并比如LCD,UART、audio、摄像头口等等,并没有总线。为了统一驱动架构抽象,所以引入了platform bus这个虚拟的总线模型。本文简要介绍一下platform driver&device怎么工作的,主要是如何发现并注册设备(probe)。在系统上电后,start_kernel() -> rest_init()原创 2020-08-19 10:50:28 · 587 阅读 · 0 评论 -
linux make xxxconfig执行过程
Linux kernel之make xxxconfigLinux kernel编译之前需要做裁剪配置,即需要生成一个.config文件,这个文件定义了很多内核feature或module等配置信息,下图展示了一个示例部分:那么,如何来生成这个.config配置文件?常用的主要方式:make config;make menuconfig;make defconfig;make xconfig;本文,就来说说这个make xxxconfig是怎么run的。首先要读取的原创 2020-08-12 16:21:38 · 2138 阅读 · 0 评论