![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
kernel
文章平均质量分 78
轩动day
intel_do_flush_locked failed: Invalid argument
展开
-
Linux RCU队列(3)树形RCU队列实现代码分析
经过之前的分析基本清楚了整个RCU的结构体,下面就通过分代码来解读RCU的实现。void synchronize_rcu(void){ if (!rcu_scheduler_active) return; wait_rcu_gp(call_rcu);}当rcu_scheduler_active变量将会在第一个任务创建之前由0转换为1.当这个变量等于0的时候,RCU可以假设当前原创 2014-12-02 00:13:52 · 2048 阅读 · 0 评论 -
Linux RCU队列(1)经典RCU队列实现
RCU全称Read Copy Update,这是一种对读写锁的优化。当所有对相关数据结构的操作时读者行为时,则通过最高层次的禁止线程调度就可以了,如果需要对这个队列进行写操作,那么可以先将原来的数值复制一份出来,然后对复制出来的数据进行处理,最后在适当的时机进行更新。而更新的适当时机则是所有的处理器上都进行了一次线程切换之后,因为只有这样才能保证整个所有的处理器上的读者都释放了相应的资源。 s原创 2014-12-01 23:55:58 · 1466 阅读 · 0 评论 -
Linux RCU队列(2)树形RCU队列实现
因为只用一个全局锁在多处理器系统中会造成很严重的锁竞争问题,一种有效的途径是将锁竞争关系变为一种层次关系(如图1)。图中四个rcu_node结构体都有自己的锁,因此处理器0和处理器1之间将会先竞争底层的锁然后在竞争高层的锁,其他处理器也一样。在grace period期间,只有获取了底层的锁的处理器才有机会获取高层的锁,也就是说只有每对处理器中的最后一个才能够记录相应的grace period转入原创 2014-12-02 00:02:39 · 1640 阅读 · 0 评论 -
Linux内核可加载模块基础(1)
内核模块是一个在需要时能够被加载到内核内存空间代码片段,在合适的时候也可以从内核中移除。内核模块和.so的最大的差别是内核模块一定是被加载到内核空间中的,而so文件(共享对象文件)则可能被加载到用户空间。正因为内核模块的动态加载功能使得在不重启的情况下扩展系统的功能成为可能。用户可以通过lsmod命令来查看已经加载到内核中的模块信息,这个命令会获取/proc/modules文件中的信息(内核版原创 2014-12-20 18:55:05 · 781 阅读 · 0 评论 -
Linux内核可加载模块基础(2)
file_operations结构体定义在linux/fs.h文件中,并且包含一系列函数指针这些函数指针最终都会由驱动程序实现的函数来进行填充(由于之前的驱动都只有两个函数,一个在加载时被调用,而另一个则在卸载的时候被调用)。文件操作体结构通用函数如下所示:struct file_operations { struct module *owner; loff_t(*llseek) (st原创 2014-12-21 08:36:47 · 642 阅读 · 0 评论 -
grub 0.97
在操作系统启动的初期,首先将PC指向磁盘的第一个块。这个区域大小为512字节,被称作MBR。这512字节组织性很好,包含了一些磁盘的基本参数和一些用于启动的代码。当然启动初期和文件系统是毫不相干的,因为文件系统和启动存在一个鸡生蛋和蛋生鸡的问题。举个很简单的例子,系统启动需要通过磁盘读取相应的执行文件,假如需要通文件系统来读取系统加载文件的话,那么先要找到文件系统以及文件系统依赖项。然而要找到文件原创 2015-02-01 09:00:17 · 930 阅读 · 0 评论