linux内核学习
文章平均质量分 78
cug_fish_2009
算法、linux内核
展开
-
linux内核学习(2)继续翻译...
<br />之前我将~/README文件给粗略的翻译了一下,果真阿,通过阅读,我发现效果不错哦~。README文件中有这段文字:<br /> There are various README files in the Documentation/ subdirectory:<br /> these typically contain kernel-specific installation notes for some <br /> drivers for example. See原创 2011-01-02 12:48:00 · 3095 阅读 · 0 评论 -
linux内核学习(15)内核编程基本功之内核同步与自旋锁spinlock_t
<br />Pro-I、内核同步与自旋锁:<br />1、为什么要使用内核同步?<br />同步使得共享数据结构(相对应的代码块—临界区)可以有节奏的被读/写。主要是由于内核控制路径的改变,而且它的改变是随机的。那么我们所要做的就是要保证在任意时刻只有一个内核控制路径处于临界区。如果在单CPU的情况下,只需禁止内核抢占即可实现不会发生内核控制路线的改变,如果在多CPU的情况下,就需要用到自旋锁了,它可以保证多个CPU的运行轨迹同步。当要进入临界区时,一定要得到关于这块临界区的锁,如果已经锁住,说明已经有CP原创 2011-01-09 12:18:00 · 3731 阅读 · 0 评论 -
linux内核学习(16)设备模型第一层
<br />设备模型第一层:<br /> <br />一、重要结构体概述:<br /> <br />1、kobject对象:<br />struct kobject { <br />const char *name; //名字<br />struct list_head entry; //作为父对象的链表节点<br />struct kobject *parent; //父对象<br />struct kset *kset; //属于哪个对象集合<br />struct kobj_type *ktype;原创 2011-01-09 17:06:00 · 1495 阅读 · 0 评论 -
linux内核学习(13)我们开始慢慢地往上爬...
<br />这个题目取得好,好像底层离我们越来越远了,因为内核在一步一步脱壳,很快漂亮的形状就会展现在我们眼前,在这之前,我们得屏气凝神,静静地等待这一时刻的到来。进入真实内核的第一个文件是arch/x86/kernel/head_32.S。<br /><br />/*<br /> * 32-bit kernel entrypoint; only used by the boot CPU. On entry,<br /> * %esi points to the real-mode code as a 3原创 2011-01-08 10:15:00 · 1957 阅读 · 0 评论 -
linux内核学习(17)内核编程基本功之内核链表list_entry
<br />内核中链表的使用非常广泛,这里将linux/list.h中的部分,也是最常用的宏定义给总结了。<br /><br />Pro-III、内核链表:<br /> <br />1、定义+初始化:<br />#define LIST_HEAD_INIT(name) { &(name), &(name) }<br />#define LIST_HEAD(name) /<br />struct list_head name = LIST_HEAD_INIT(name)<br /> <br />static原创 2011-01-09 20:38:00 · 1505 阅读 · 0 评论 -
linux内核学习(18)设备模型之第一层sysfs关系图
<br />很就没跟大家聊天了,上次聊还是分析完内核启动全过程的事情。这几次发的都是我目前学习设备模型的心得,把它都总结了起来,然后放到博客中供大家学习与探讨。<br /><br />如果你还记得当时分析到了driver_init()这个函数,那么太好了,因为下面的内容就是对这个函数进行简要分析的。如果你没关注过,那么也不用太那个什么,因为这个函数和内核启动全过程基本没什么联系,看看它在哪里就知道了。drivers/base/init.c文件中,看看目录就知道,我们开始进入设备模型这块内容了,而base/这原创 2011-01-10 09:37:00 · 2775 阅读 · 0 评论 -
linux内核学习(19)内核编程基本功之内核同步与互斥锁mutex
<br />Pro-II、内核同步与互斥锁:<br />1、理解互斥锁?<br />互斥锁的使用也是保持内核临界区的同步的,互斥锁可以说源于信号量,信号量设置计数器可以容许n个进程并发的访问临界区,而互斥锁不行,只能容许每次一个进程访问,也就是计数器值为1的信号量,可以这么理解。互斥锁和自旋锁有不同(显然的),互斥锁在中断处理程序中和可延迟函数中都不能使用,因为它是可以睡眠的,只能在进程上下文或者软中断上下文才能使用。<br /><br /><br />2、如何实现互斥锁?<br /><br /><br /原创 2011-01-10 11:07:00 · 2216 阅读 · 0 评论 -
linux内核学习(22)设备模型之第二层bus_register
<br />注册总线。<br /><br />来自:dirvers/base/bus.c:<br />int bus_register(struct bus_type *bus)<br />{<br /> int retval;<br /> struct bus_type_private *priv;<br /><br /> priv = kzalloc(sizeof(struct bus_type_private), GFP_KERNEL); <br /> if (原创 2011-02-24 22:27:00 · 1378 阅读 · 0 评论 -
linux内核学习(23)设备模型之第二层driver_register
<br />终于说到最后一个注册了,今天也是年末了,可是我依然战斗在一线的感觉!说完这个,我也得放松一会儿。学习内核也接近大半个月了,收获颇多,不过还有太多东西需要我在继续努力了,虽然博客的流量不是很理想,表明关注我博客的网友不是很多,但是我相信,就会在不久,linux成为千家万户都在关注的对象时,我博客将成为初学者很好的入门资料,这也是我写这些文章的一个出发点,希望以后在来回味自己走过linux的路程时有所感慨!<br /><br />来自:drivers/base/driver.c:<br />int原创 2011-02-27 17:59:00 · 1617 阅读 · 6 评论 -
linux内核学习(21)设备模型之第二层device_register
<br />这篇文章将那个3个注册函数说说,把整个设备模型框架搭建起来,当然,是重点部分了。在这之前希望你已经懂得总线、设备、驱动的数据结构及其里面的有关数据结构。关于调用的函数,如果显示为粗体,那么在下面我有分析。<br /><br />来自:drivers/base/core.c<br />int device_register(struct device *dev)<br />{<br /> device_initialize(dev);<br />//初始化设备<br /> return原创 2011-02-23 10:40:00 · 1621 阅读 · 0 评论 -
linux内核学习(14)好无聊的代码
<br />现在我们还在关于机器代码里晃悠呢,昨天分析了arch/x86/kernel/head_32.S里面的代码,汇编的时代已经过去了,现在起,代码都是C的,很爽啊。我们离大本营越来越近了,设备模型就在前方不远处,不过还没继续分析完,估计你还在迷糊,在哪里呢?呵呵,很快的,这一切会在一瞬间就走完,不要太过于留恋太多无聊的东西。现在该是时候跳到昨天说的那里了。<br /><br />来自arch/x86/kernel/head32.c:<br />void __init i386_start_kernel原创 2011-01-08 18:12:00 · 1561 阅读 · 0 评论 -
linux内核学习(12)启动全过程概述之三
<br />进入了vmlinux内核映像部分,就进入了arch/x86/compressed/head_32.S。这个文件主要工作就是解压了,将真正的内核给释放出来,不过还得把这个文件分析完,内核才能出世。<br /><br />来自arch/x86/compressed/head_32.S:<br /><br />........省略了头文件......<br /><br />__HEAD<br />ENTRY(startup_32)<br /> cld /*di,si++*/<原创 2011-01-07 17:16:00 · 1432 阅读 · 0 评论 -
linux内核学习(11)启动全过程概述之二
<br />这次该进入main函数了,在arch/x86/boot/main.c中。<br /><br />void main(void)<br />{<br /> /* First, copy the boot header into the "zeropage" */<br /> copy_boot_params(); # 将hdr的参数拷贝到结构体boot_params.hdr中,在文件boot/bootparam.h里<br /><br />原创 2011-01-07 14:13:00 · 1853 阅读 · 0 评论 -
linux内核学习(3)我在寻找中...
<br />通过翻译README文件,至少我知道了Documentation目录很重要,那个目录里包含了linux设计的各个方面。其实按照习惯,我应该直接学习Documentation目录里的东西,但是考虑到README文件还有些内容没有深入分析,还不敢下手,我得将README文件看完才行!<br />条目:<br />1、WHAT IS LINUX?(介绍一下,没什么看的)<br />2、ON WHAT HARDWARE DOES IT RUN?(关于跑在哪些arch上,sorry,我没兴原创 2011-01-02 16:19:00 · 1343 阅读 · 0 评论 -
linux内核学习(4)老法子---
<br />我又回来了,上次不是说到~Documentation/kbuild/kconfig.txt中去看看吗,顾名思义,就是配置文件。先别急,我发现这个kbuild目录下面有个也有个00-INDEX文件,显然,肯定又是将该目录下文件作用的,应该先瞅瞅这个。<br />00-INDEX<br /> - this file: info on the kernel build process<br />kbuild.txt<br /> - developer information原创 2011-01-02 21:52:00 · 2982 阅读 · 0 评论 -
linux内核学习(6)Kbuild Makefile语法分析
<br />实际文档位置:linux-2.6.XX.yy/Documentation/kbuild/makefiles.txt,此为翻译稿。<br /><br />*******************************************************************************<br />Linux内核的Makefile<br /><br />=== 目录<br /><br /> === 1 概述<br /> === 2 用户与作用<转载 2011-01-04 09:46:00 · 5461 阅读 · 0 评论 -
linux内核学习(7)粗略走走kbuild Makefile编译流程
<br />今天看Makefile文件,我头大了,此Makefile非彼Makefile,里面多了很多内置命令,比如origin、patsubst等等啦,这些都没听说过,更可恶的是,连网上都没有,可见,这是一件多么伤人的事情,分析这样的,真是让人折寿啊!没办法,大半天都没找出个头绪来,于是我也没什么办法了,只好利用跟踪的分析方法,就是按照安装的步骤来,通过make命令来找到突破口。这种方法的确好使。没用多久,我就稍微有了点头绪,也算今天没白白浪费掉。<br /><br />先来个“make原创 2011-01-04 12:40:00 · 10938 阅读 · 1 评论 -
linux内核学习(8)如何生成vmlinux?简单走走
<br />我们应该了解,内核编译出vmlinux还不算数,最后这个ELF格式的文件会被压缩成bzImage。不过那无关紧要。这次我要说说vmlinux的产生流程,当然只是简单走走,里面kbuild复杂语法,连Makefile自带的很多规则都是比较复杂的,恐怕要全部搞懂,得费很大劲,毕竟这对于我研究的方向没有多大帮助。我们知道要产生可执行文件要经过这样几个步骤:xx.c->xx.o、xx.o->xx,即先编译在链接,最终xx就是我们要的文件,那么内核源代码怎么有序的形成这样的模式呢,靠的就是kb原创 2011-01-04 15:48:00 · 12068 阅读 · 1 评论 -
linux内核学习(5)山重水复疑无路*
<br />上次说到00-INDEX文件,然后把kbuild.txt说完,但是我们的还有多么遥远。说到这儿,肯定很多看了我文章的朋友会想,你到底想干嘛,对,我也疑惑!这样的分析是否正确,不过,对于没多少见识的初学者---我,来讲,好像这样的分析方法更好,至少我环节把握得还不错,先把主要知识点给揪出来,然后在各个击破,我喜欢这样的思路。每个人看待和解决的方式不一样,这是非常正常的。那么还有个问题,我必须要在这里说了,我的最终目标是什么?当然了,目标有是好的,目标也要分长和短吧!<br /><br原创 2011-01-03 09:40:00 · 1733 阅读 · 0 评论 -
linux内核学习,从README开始!
<br />一个初学者如何可以在浩瀚的linux海洋里找到自己的小舟,遨游其中。我就是在寻觅的其中一员,希望你也是。接触linux内核,学习源代码,学习大师们的杰作,这就是我的原动力,网上太多如何学习linux源代码的方法,可能适合一部分人,每个人都有自己的方法。而我,经过很常时间的思考,于是下定决心,先攻破晦涩的英语这关,因为代码注释都是英文。我希望和有兴趣的初学者一起完成我们的遨游,那是无比的快乐和幸福!我英语只过了4级,翻译得很烂,只是将我以为必要的翻译了,希望有爱好者能有时间将它补充完整原创 2011-01-02 12:28:00 · 4601 阅读 · 2 评论 -
linux内核学习(9)启动全过程概述之内核映像结构
<br />启动过程这块内容还蛮多的,因此得慢慢来分析,在此之前我也收集到了很多资料,这里将这些整理加上自己的一些理解。好不容易啊,总算开始内核源代码之旅了,我们要珍惜这来之不易的这个时刻。<br /><br />要得到内核结构,我们有很多种方法,比如查看kbuild Makefile、Documentation,但是我选择了在网络上找,因为我们关注的重点是在于怎么分析源代码,特别是后面要分析设备驱动那块。<br /><br />我们以bzImage大内核映像为例,它由setup.elf和vml原创 2011-01-06 12:14:00 · 2471 阅读 · 0 评论 -
linux内核学习(10)启动全过程概述之一
<br />下面这段时间,我要好好分析一下内核启动过程的源代码,怎么来分析,而且更好的和网友们进行交流,我想,最好的方式莫过于采用赵炯博士编著的《linux内核完全注释》一书的编写规范。将中文注释夹杂在代码中是最好的方式了吧。我将采用分段注释,以免代码太长导致读了后面的忘记了前面的,在其中会有些重要的知识点也是我们要好好学习的。<br /><br />要找到第一个源代码文件不是太困难,它就是始源,注意我们这里全是在x86机器上,内核版本为2.6.36.2。那么arch/x86/boot目录则是我原创 2011-01-07 10:10:00 · 2735 阅读 · 0 评论 -
linux内核学习(20)设备模型第二层之一
<br />设备模型第二层也是非常重要的一层,为各种设备打好了基础,由于我之前在分析的过程中发现,如果每个细节都一起抠,可能很难将设备模型的概貌理解清楚,因此,我将采用从整体到局部的方法分析设备模型第二层,还是因为里面的东西太过于复杂。那么我们将哪些给踢掉呢,当然为了将设备模型的重点给捋出来,我可是费了不少功夫。<br /><br />我们将设备模型中关于sysfs、class 、attribute、电源管理等给踢掉,剩下的基本就简单多了,等我们将重点分析完后,在回过头来分析这每个部分,那将非常简单了。好了原创 2011-02-22 13:04:00 · 1353 阅读 · 0 评论