linux内核学习
文章平均质量分 71
qb_2008
可怕的不是无知,而是畏难。
展开
-
linux-2.6.32的编译
虽然一直对linux抱有企图,但直到前几天才开始实际动手。首先是自己编译linux内核。编译在ubuntu 10.04下进行,系统使用的版本是linux-2.6.32-28,自己编译的是linux-2.6.32。现在linux编译配置变得比较傻瓜化,默认会把许多不必要的模原创 2011-09-29 00:38:28 · 2990 阅读 · 0 评论 -
sysfs API总结
sysfs是用于表现设备驱动模型的文件系统,它基于ramfs。要学习linux的设备驱动模型,就要先做好底层工作,总结sysfs提供给外界的API就是其中之一。sysfs文件系统中提供了四类文件的创建与管理,分别是目录、普通文件、软链接文件、二进制文件。目录层次往往代表着设备驱动原创 2011-10-06 11:07:11 · 18764 阅读 · 2 评论 -
linux内核部件分析(六)——设备驱动模型之device
linux的设备驱动模型,是建立在sysfs和kobject之上的,由总线、设备、驱动、类所组成的关系结构。从本节开始,我们将对linux这一设备驱动模型进行深入分析。 头文件是include/linux/device.h,实现在drivers/base目录中。本节要原创 2011-10-07 17:01:14 · 7052 阅读 · 2 评论 -
linux内核部件分析(八)——设备驱动模型之bus
前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起。本节就来看看设备驱动模型中起枢纽作用的bus。本节的头文件在include/linux/device.h和drivers/base/bas原创 2011-10-08 10:56:51 · 6362 阅读 · 0 评论 -
linux内核部件分析(四)——更强的链表klist
前面我们说到过list_head,这是linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种原创 2011-10-05 23:57:37 · 7959 阅读 · 2 评论 -
linux内核部件分析(五)——设备驱动模型的基石kobject
之前我们分析了引用计数kref,总结了sysfs提供的API,并翻译了介绍kobject原理及用法的文档。应该说准备工作做得足够多,kobject的实现怎么都可以看懂了,甚至只需要总结下API就行了。可我还是决定把kobject的实现代码从头分析一遍。一是因为kobject的代码原创 2011-10-06 13:32:38 · 7735 阅读 · 2 评论 -
linux内核部件分析(七)——设备驱动模型之driver
上节我们分析设备驱动模型中的device,主要是drivers/base/core.c,可以说是代码量最大的一个文件。本节要分析的驱动driver,就要相对简单很多。原因也很简单,对于driver,我们能定义的公共部分实在不多,能再sysfs中表达的也很少。本节的分析将围绕dri原创 2011-10-08 01:41:25 · 5354 阅读 · 1 评论 -
linux内核部件分析(十)——设备驱动模型之class
前面看过了设备驱动模型中的bus、device、driver,这三种都是有迹可循的。其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动。但本节要介绍的class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口原创 2011-10-10 03:27:22 · 11788 阅读 · 3 评论 -
linux内核部件分析(九)——设备驱动模型之device-driver
前面我们分析了device、driver、bus三种类型,主要是三者的注册与注销,在sysfs中的目录与属性文件创建等内容。本节就来详细分析下,在设备注册到总线上时,总线是如何为其寻找对应的驱动的;在驱动注册到总线上时,总线又是如何为其寻找对应的设备的。 本节的实现代码原创 2011-10-09 00:55:50 · 5557 阅读 · 2 评论 -
Everything you never wanted to know about kobjects, ksets, and ktypes
要理解kobject抽象及其之上的设备驱动模型并不简单,难点之一就在于,没有一个明显的起点。要处理好kobject,需要理解一些别的类型,而这些类型又是相互引用的。为了让事情简单,我们采用多遍的过程,从模糊的概念出发,逐渐增加细节。为此,这里先对一些相关概念进行定义:—kob翻译 2011-10-05 12:20:30 · 2799 阅读 · 0 评论 -
linux内核中的内存屏障
前言 之前读了关于顺序一致性和缓存一致性讨论的文章,感觉豁然开朗。对linux内核中出现的种种同步和屏障,想做一点总结。缓存一致性 之前一直认为linux中很多东西是用来保证缓存一致性的,其实不是。缓存一致性绝大部分是靠硬件机制实现的,原创 2011-10-02 17:27:30 · 4529 阅读 · 1 评论 -
linux内核的学习方法
经过之前的摸索,对linux内核的学习有一些自己的看法,就列一下自己支持的学习方法:1、要选最新的内核去学。linux内核版本变化太快了。linux 0.11就是一个自己动手写操作系统的范例,而到linux 2.4则发展到百万行级,被移植到各种平台。到2.6呢,linux在这原创 2011-09-29 01:40:35 · 4525 阅读 · 2 评论 -
linux模块编程(一)——加载你的模块
在达到能直接修改linux内核的程度之前,我们写的代码都需要以模块的方式添加到内核中去运行。本节就介绍最简单的模块编写和加载方法。1、首先创建一个目录modules,以存放以后编写的模块。再在其下创建一个子目录hello,最为本节创建模块的位置。2、编写源文件hello.原创 2011-09-29 23:44:51 · 3189 阅读 · 1 评论 -
linux内核部件分析(二)——原子性操作atomic_t
在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的。在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的。为了弥补这一缺点,x86提供了附加的lock前缀,使带lock前缀的读修改写指令也能原子原创 2011-10-02 20:19:16 · 29374 阅读 · 2 评论 -
linux内核部件分析(三)——记录生命周期的kref
kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的原理和实现都非常简单,但要想用好却不容易,或者说kref被创建就是为了跟踪复杂情况下地结构引用销毁情况。所以这里先介绍kref的实现,再介绍其使用规则。原创 2011-10-02 21:21:40 · 15270 阅读 · 4 评论 -
linux模块编程(三)——线程的约会completion
上节中我们已经掌握了创建大量内核线程的能力,可惜线程之间还缺乏配合。要知道学习ITC(inter thread communication),和学习IPC(inter process communication)一样,不是件简单的事情。本节就暂且解释一种最简单的线程同步手段—co原创 2011-09-30 15:18:51 · 12168 阅读 · 3 评论 -
linux模块编程(四)——消息的使者list
通过之前几节,我们已经了解了内核线程的创建方法kthread,内核同步的工具completion。现在我们就来学学内核线程传递消息的方法list。或许大家会说,list不是链表吗。不错,list是链表,但它可以变成承担消息传递的消息队列。消息的发送者把消息放到链表上,并通过同步工原创 2011-10-02 00:43:13 · 3024 阅读 · 4 评论 -
linux内核部件分析(一)——连通世界的list
在linux内核中,有一种通用的双向循环链表,构成了各种队列的基础。链表的结构定义和相关函数均在include/linux/list.h中,下面就来全面的介绍这一链表的各种API。struct list_head { struct list_head *next, *pr原创 2011-10-01 17:43:18 · 6311 阅读 · 3 评论 -
linux模块编程(二)——运行不息的内核线程kthread
上节中,我们成功地编译运行了一个linux模块。可惜的是,它只有两个函数,hello_init在模块加载时调用,hello_exit 在模块卸载时调用。这样下去,模块纵使有天大的本事,也只能压缩在这两个函数中。为了避免这种悲剧发生,本节就来学习一种让模块在加载后能一直运行下去的方原创 2011-09-30 01:23:26 · 19210 阅读 · 3 评论 -
linux内核部件分析(十一)——waitqueue与线程的阻塞
当你必须一个复杂的系统,协调系统的方方面面,灵活地支持各种机制和策略,即使很简单的问题也会变得很复杂。linux绝对就是这样一个复杂的系统。所以我们要理解它,尽量从原理的角度去理解事务的处理流程,尽量避免各种细枝末节的干扰,尽量规避那些足以压垮自己的庞然大物。(尽管细致末节和庞然大物很可能就是linux闪光的地方,但我们还是小心为上。)原理 现在我们来考虑linux中线程的阻塞。它的原创 2011-10-31 02:15:08 · 8665 阅读 · 1 评论