![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux内核源代码分析
文章平均质量分 66
KurdtCobain
这个作者很懒,什么都没留下…
展开
-
Linux0.11内核分析一
这一节我们分析从开机加电到执行main函数之前的过程从开机到main函数执行分三步完成,目的是从启动盘加载操作系统程序,完成执行main函数所需要的执行main函数所需要的准备工作 1.启动BIOS,准备实模式下的中断向量表和中断服务程序 2.从启动盘加载操作系统程序到内存,加载操作系统程序的工作就是利用第一步中准备的中断服务程序实现 3.为执行32位的main函数做过渡工作以下的讲解都是围绕原创 2017-05-31 01:30:17 · 984 阅读 · 0 评论 -
编译乱序和执行乱序
编译乱序也就是编译器对访存的执行进行乱序 减少逻辑上不必要的访存 已经尽量提高cache命中率和cpu的load/store单元的工作效率 因此在打开编译器优化以后 看到生成的汇编码并没有严格按照代码的逻辑顺序 怎么解决这个问题 设置编译屏障 barrier(); 这样的话就能解决编译乱序所造成的问题 那么你可能会说 volatile也可以实现这个功能啊 其实在编译乱序的问题上 volatil原创 2017-11-15 14:09:47 · 1700 阅读 · 0 评论 -
原子变量
原子变量适用在共享资源是一个简单的整数值的情况下使用的 完整的锁机制对一个简单的整数来讲就有些浪费 数据定义 atomic_t v; 原子变量保存一个int值 但是不能记录大于24位的整数 使用的是ldrex和strex指令 适用于多核间的并发具体的API如下 void atomic_set(atomic_t *v, int i); atomic_t v = ATOMIC_INIT(原创 2017-11-14 20:48:12 · 2911 阅读 · 0 评论 -
自旋锁
自旋锁主要是为了解决对临界资源的互斥访问 也就是适合在smp或者单cpu可抢占的系统中比如在SMP 多核处理器中的情况 现在的处理器大多是这种类型的 可以使用自旋锁来解决对临界资源互斥访问 当一个CPU在访问自旋锁保护的临界区时 临界区锁被锁上 也就是spin_lock(lock) 将自旋锁置0 这时其他访问此临界区的CPU 或者本地CPU的其他进程想要访问此临界区时会忙等待 直到第一个访原创 2017-11-14 20:47:51 · 388 阅读 · 0 评论 -
线程间同步机制之完成量
完成量主要是用来完成线程间的同步机制 而信号量是为了完成某一资源临界区的同步而使用struct completion { unsigned int done; wait_queue_head_t wait; };这个结构体有两个成语 一个是done 表示已完成 一般初始化为0 还有一个是等待队列 表示一个完成量未唤醒的时候 加入等待队列 struct completion原创 2017-11-14 20:47:04 · 372 阅读 · 0 评论 -
mutex互斥体
linux内核也有正宗的互斥体 并且新的内核多使用mutex互斥体我们这里只介绍怎么使用互斥体定义一个互斥体并且初始化它 struct mutex my_mutex; mutex_init(&my_mutex);然后获取互斥体 extern void mutex_lock(struct mutex *lock); extern int __must_check mutex_lock_int原创 2017-11-14 20:46:28 · 395 阅读 · 0 评论 -
信号量
linux上有很多地方可能导致并发竞态的现象 比如smp多核的时候 不同的处理器上同时执行我们的代码 多个用户进程也能在一起访问我们的代码 还要很多可延迟机制 比如workqueue tasklet以及timer都可能会使得代码在任何时候执行 所以就会导致并发执行代码 访问公共资源导致出现很多问题 对这个问题最明显的应用就是避免使用全局变量 所以为了只能让一个操作在一个时间内只能有一个执行线原创 2017-11-14 20:45:57 · 284 阅读 · 0 评论 -
中断管理之下半部软中断
Linux中断管理中有个非常重要的设计理念就是上下半部机制 上半部就是硬件中断管理 中断设计为上下半部的原因如下 1.硬件中断处理程序以异步方式进行 它会打断其他重要的代码执行 因此为了避免被打断的程序停止时间太长 硬件中断处理程序必须尽快完成 2.硬件中断处理程序通常在关闭中断的情况下执行 关闭中断就是关闭本CPU的所有中断响应 关闭中断后 本地CPU就不能响应所有的中断响应 因此硬件中断处转载 2017-11-14 20:32:17 · 292 阅读 · 0 评论 -
中断上下文简要概述
中断上下文主要是硬件中断上下文 软件中断上下文 和 BH临界区上下文中断上下文你主要分为以下两种情况 (1)执行该中断的处理函数(我们一般称之interrupt handler或者叫做top half),也就是hard interrupt context (2)执行软中断处理函数,执行tasklet函数,执行timer callback函数。(或者统称bottom half),也就是softwa转载 2017-11-14 20:30:52 · 876 阅读 · 0 评论 -
软中断机制之tasklet机制
tasklet也是利用软中断实现的一种下半部机制 软中断的一种变种 运行在软中断上下文中 struct tasklet_struct { struct tasklet_struct *next;//多个tasklet串成一个链表 unsigned long state;//代表此刻tasklet的状态,一般为TASKLET_STATE_SCHED,表示此tasklet已被调原创 2017-11-14 20:18:44 · 551 阅读 · 0 评论 -
workqueue机制
workqueue和其他的bottom half最大的不同是它是运行在进程上下文中的,它可以睡眠,这和其他bottom half机制有本质的不同,大大方便了驱动工程师撰写中断处理代码。当然,驱动模块也可以自己创建一个kernel thread来解决defering work,但是,如果每个driver都创建自己的kernel thread,那么内核线程数量过多,这会影响整体的性能。因此,最好的方法就原创 2017-11-14 20:18:08 · 5347 阅读 · 0 评论 -
POSIX定时器:timer_settime()
最强大的定时器接口来自POSIX时钟系列,其创建、初始化以及删除一个定时器的行动被分为三个不同的函数:timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。创建一个定时器:int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)进转载 2017-06-30 03:13:59 · 600 阅读 · 0 评论 -
Linux0.01内核三之轮转到子进程执行
#define switch_to(n) {\struct {long a,b;} __tmp; \__asm__("cmpl %%ecx,_current\n\t" \ "je 1f\n\t" \ "movw %%dx,%1\n\t" \ "xchgl %%ecx,_current\n\t" \ "ljmp %0\n\t" \ "cmpl %%ecx,_原创 2017-06-19 16:38:20 · 400 阅读 · 0 评论 -
Linux0.11内核分析三之进程调度
Linux进行进程调度一般有两种情况 1.允许进程运行的时间结束 2.进程的运行停止 比如当进程阻塞时需要等待外设提供数据 或者等待其他程序的运行结果 这时就会进行进程调度 这里是执行for(;;) pause(); 最终执行到schedule()函数切换到其他进程运行 这里切换到进程1Linux创建了进程1 后开始进行进程调度static inline _syscall0(int,pau原创 2017-06-07 16:09:29 · 507 阅读 · 0 评论 -
Linux内核0.11分析三之创建子进程
继main函数开启中断和将进程0从0特权级翻转至3特权级后 main函数就调用fork()函数创建子进程/main.cstatic inline _syscall0(int,fork)//内联函数static inline _syscall0(int,pause)static inline _syscall1(int,setup,void *,BIOS)static inline _sysc原创 2017-06-05 22:53:05 · 458 阅读 · 0 评论 -
Linux内核0.11分析二
这节主要讲linux加载操作系统到内存后 经过一系列的准备最终到了执行main函数 这里就分析main函数/* init/main.c */#define DRIVE_INFO (*(struct drive_info *)0x90080)//硬盘参数表 #define ORIG_ROOT_DEV (*(unsigned short *)0x901FC)//根设备号struct drive_i原创 2017-06-05 03:28:58 · 853 阅读 · 0 评论 -
内核定时器
内核的软中断提供了定时器软中断的类型 TIMER_SOFTIRQ 所以我们可以使用这个软中断来实现定时运行我们的程序 内核提供的API和数据结构如下 struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline原创 2017-11-15 14:10:31 · 248 阅读 · 0 评论