看兴趣了,喜欢就多看点,不喜欢就少看点。读内核让人受益是肯定的,你写linux应用程序,却不懂linux那和写VC没啥区别,就像不懂JVM机制的JAVA工程师就肯定算不上精通。
‘贰’ Linux内核源代码导读的图书目录
1.1 保护模式
1.1.1 分页机制
1.1.2 分段机制
1.2 系统门
1.3 x86的寄存器
1.4 典型的PC系统结构简介 2.1 AT&T与Intel汇编语法比较
2.2 gcc内嵌汇编
2.3 同步与互斥
2.3.1 原子操作
2.3.2 信号量
2.3.3 自旋锁
2.3.4 RCU机制
2.3.5 percpu变量
2.4 内存屏障
2.4.1 编译器引起的内存屏障
2.4.2 缓存引起的内存屏障
2.4.3 乱序执行引起的内存屏障
2.5 高级语言的函数调用规范 3.1 Linux内核编译概述
3.2 内核编译过程分析
3.3 内核链接脚本分析 4.1 BIOS启动阶段
4.2 实模式setup阶段
4.3 保护模式startup_32
4.4 内核启动start_kernel()
4.5 内核启动时的参数传递
4.5.1 内核参数处理
4.5.2 模块参数处理 5.1 内存地址空间
5.1.1 物理内存地址空间
5.1.2 虚拟地址空间
5.2 内存管理的基本数据结构
5.2.1 物理内存页面描述符
5.2.2 内存管理区
5.2.3 非一致性内存管理
5.3 内存管理初始化
5.3.1 bootmemalloctor的初始化
5.3.2 页表初始化
5.3.3 内存管理结构的初始化
5.4 内存的分配与回收
5.4.1 伙伴算法
5.4.2 SLUB分配器 6.1 中断的分类
6.2 中断的初始化
6.2.1 异常初始化
6.2.2 中断的初始化
6.2.3 中断请求服务队列的初始化
6.3 中断与异常处理
6.3.1 特权转换与堆栈变化
6.3.2 中断处理
6.3.3 异常处理
6.4 软件中断与延迟函数
6.4.1 softirq
6.4.2 tasklet
6.5 中断与异常返回
6.6 中断优先级回顾
6.7 关于高级可编程中断控制器
6.7.1 APIC初始化 7.1 信号机制的管理结构
7.2 信号发送
7.3 信号处理 9.1 clocksource对象
9.1.1 clocksource概述
9.1.2 clocksource初始化
9.2 tickless机制
9.2.1 tickless由来
9.2.2 clockeventdevice对象概述
9.2.3 clockeventdevice对象的初始化
9.3 High-ResolutionTimers
9.3.1 High-ResolutionTimers管理结构
9.3.2 High-ResolutionTimers初始化
9.3.3 High-ResolutionTimers操作
9.4 时钟中断处理
9.4.1 时钟维护
9.4.2 进程时间信息统计
9.5 软件定时器
9.5.1 基本管理结构
9.5.2 初始化
9.5.3 注册与过期处理 10.1 进程描述符
10.1.1 进程状态
10.1.2 进程标识
10.1.3 进程的亲缘关系
10.1.4 进程的内核态堆栈
10.1.5 进程的虚拟内存布局
10.1.6 进程的文件信息
10.2 进程的建立
10.2.1 建立子进程的task_struct对象
10.2.2 子进程的内存区域
10.2.3 子进程的内核态堆栈
10.2.4 0号进程的建立
10.3 进程切换
10.4 进程的退出
10.4.1 do_exit函数
10.4.2 task_struct结构的删除
10.4.3 通知父进程
10.5 do_wait()函数
10.6 程序的加载 11.1 早期的调度器
11.2 CFS调度器的虚拟时钟
11.3 CFS调度器的基本管理结构
11.4 CFS调度器对象
11.5 CFS调度操作
11.5.1 update_curr()函数
11.5.2 scheler_tick()函数
11.5.3 put_prev_task_fair()函数
11.5.4 pick_next_task()函数
11.5.5 等待和唤醒操作
11.5.6 nice系统调用 12.1 Ext2的磁盘结构
12.2 Ext2的内存结构
12.3 虚拟文件系统的管理结构
12.3.1 文件系统对象
12.3.2 VFS的超级块
12.3.3 VFS的inode结构
12.3.4 VFS的文件对象
12.3.5 VFS的目录对象
12.3.6 VFS在进程中的文件结构
12.4 文件系统的挂载
12.5 路径定位
12.6 文件打开与关闭
12.7 文件读写
12.7.1 缓冲区管理
12.7.2 文件读写操作分析 13.1 准确定位同名宏及结构体
13.2 准确定位同名函数
13.3 利用linkmap文件定位全局变量
13.4 准确定位函数调用线索
13.5 SystemTap在代码分析中的使用
‘叁’ 有没有Linux内核源码指导书籍
1.《Linux内核设计与实现》
本书重在原理。适合入门的最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。
2.《深入理解Linux内核》
此书比上一本多了些细节。是Linux内核黑客在推荐图书时的首选。写的比较简单易懂,适合刚刚接触LINUX内核的。
此书图表很多,形象地给出了关键数据结构的定义,与《Linux内核源代码情景分析》相比,本书内容紧凑,不会一个问题讲解动辄上百页,有提纲挈领的功用,但是深度上要逊于《Linux内核源代码情景分析》。
3.《LINUX设备驱动程序(第3版)》
这书强调动手实践!但它是讲解“设备驱动”的,不是最核心的东西,而且有些东西没硬件的话无法实践,可能更适合驱动开发的程序员吧
其中关于同步与互斥、内存分配的部分,感觉很不错。
4.《Linux内核源代码情景分析》
好,很经典,是浙大教授毛德操写的,可惜成书于2001年之后一直没有更新。分上下册。
很多是基于2.4内核讲解的需要注意。如果学习的话也建议学习2.6,2.6跟2.4比发生了很多显着改善,应该学习的。
全书内容博大精深,不是非常好懂,对细节问题描述比较清晰。但是感觉对内核的整体感觉不够强。另外缺少网络部分的分析。觉得不是很适合初学者。
5.《Linux内核源代码分析》
点评:面对中高级,这本书很好,对了解操作系统是一本不可多得的好书。
6. 《LINUXKERNEL技术手册》
参考手册,很薄,值得一看。
7.《深入Linux内核架构》
这本书针对的是比较新的内核版本2.6.24;内容比较全面,深入浅出。
如果没有对Linux内核的初步结构的认识,那么会看得比较吃力。建议可以一边去翻在国内已经闻名已经久的四本Linux内核着作(《Linux内核原代码情景分析》、《Linux内核设计与实现》、《深入理解Linux内核》、《Linux设备驱动程序》),再一边看这本书,把这本书当作一个补充或者当作一个内核框架图谱说明书来阅读,收效会更好。
8.《Linux内核完全注释》
主要描述和注释了Linux0.11内核全部源代码。对于初学Linux内核操作系统的人来讲,该书能够引领读者快速入门,并且能全面了解一个简单操作系统的工作机理。对于进一步学习现在的Linux内核具有非常大的指导作用。对于学习嵌入式应用的技术人员来讲,通过《完全注释》一书的学习也能迅速融入嵌入式应用领域。
9.《Orange S:一个操作系统的实现》
从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程。
‘肆’ Linux内核源码剖析的介绍
《Linux内核源码剖析》是由樊东东,莫澜编着,机械工业出版社于2011年1月1日出版的一本书籍。本书详细论述了Linux内核2.6.20版本中TCP/IP的实现。书中给出了大量的源代码,通过对源代码的详细注释,帮助读者掌握TCP/IP的实现。本书根据协议栈层次,从驱动层逐步论述到传输层,包括驱动的实现、接口层的输入输出、IP层的输入输出以及IP选项的处理、邻居子系统、路由、套接口及传输层等内容,全书基本涵盖了网络体系架构全部的知识点。特别是TCP,包括TCP连接的建立和终止、输入与输出,以及拥塞控制的实现。
‘伍’ 跪求强淫解答Linux网络内核源码导读问题。
定义结构体类型S 定义指向结构体S的指针P 把s的首地址赋值给指针
‘陆’ 怎么开始读Linux内核源码
本人是一名 android display方面的工程师,结合实际工作经验聊聊(观点未必正确)
1. 准备工作:选择什么样的版本,使用什么样的工具,这个需要考虑好。
如果是要参考书的话,kernel版本一般都应该选择和书里面同步的版本,不要去选择最新的版本。因为最新的版本,各种改动比较多,反而对不上书了。
工具问题,你可以选择windows下的source insight,也可以选择linux下vim+ctags;
2. 第一遍浏览,我建议是先把kernel里面的 start_kernel() 函数里面的东西看清楚(不一定看明白),看看这个过程中,出现了什么玩意,有哪些分支,并将分支初略的画出一张图来(当然,我自己并没做到这一点,有点讽刺了)。
这里面最重要的几个地方,我个人认为,应该搞明白mole机制,它是怎么通过编译链接脚本放在特定的区域,然后系统起来后,又是如何去(按照什么规则)去加载这些模块;
应该搞明白sysfs系统,这个对于驱动和用户空间的连接,有非常大的作用;
系统调用的open()应该走一遭,看看用户空间到kernel之间参数是如何传递,又是怎么通过vfs系统,把open的动作最终落实到某一个驱动的open()上去的;
对kernel启动过程中,内存的分配算法,是怎么从伙伴算法切换到最终的算法上,也应该略有耳闻;对fork()函数的过程有所明白。
对kernel中基本的数据结构实现过程、锁机制实现过程要有概念:
这一部分,总结起来,应该看的路线是:
start_kernel()
mole_init() 宏实现 // 看这个的时候,强烈建议,把makefile真正的意图弄明白
open() 系统调用
fork() 系统调用
sysfs 框架实现
双链表是如何实现的;
锁最终是依靠什么来保证的?(其实还是硬件来保证的)
对于数据结构和锁这部分,就按照《Linux内核设计与实现》里面的东西挨个挨个看。有兴趣,自己也可以实现一个双链表公共API,随便哪个项目,一旦用上,直接抛进去,也未尝不可。
第一遍浏览,窃以为,上面这几部分看明白后,kernel的代码对你依然很难,但已经不再有神秘的面纱。
后续,你想研究某个模块,直接快速定位到那边去就行。
3. 在完全用眼睛看完上面这部分内容后,kernel的路或许找到了,但是,万里长征的第一步,并没有迈出。这个时候,动手是很重要的了。
网上有各种方法,比如说,去kernel maillist里面订阅bug,然后自己试着解bug,此方法可取,而且是非常好。这里会遇到一个问题是,我们该怎么调试?
有人是架各种虚拟机或者多台物理机一起开干,这个可以有。(但是本人动手能力确实有限,这个没干成,本人是后面借助了公司的开发板)
如果你也像我一样,动手能力不足,如果你恰巧是手机或者类似手机开发公司的,你可以直接使用公司的开发机,通过串口log,将printk()的级别设置为3,把你需要的信息打印出来;
如果你是学生或者爱好者,可以花500左右人民币,去淘宝上买一个开发板,也是带串口的,所有的debug信息都是通过串口打印出来,保存到一个Log文件中,然后分析;
至于买什么样的板子,你可以随便选择,经典的s3c2440也行,高端点的树莓派,或者全志什么的,都可以。(不推荐全志,他们添加和修改硬件比较多,驱动也许不好搞)
4. 选择你喜欢的模块,进行深入研究,通过log打印,反复推敲,这个时候,bug是最好的导师。多关注kernel/Documents/ 目录下的文档。
你需要注意的是,一定要把该模块无关的东西砍掉,否则,生命是有限的,而代码是无限的。
最后一句话是,在用眼睛看完后,思考过后,还得动手,然后再思考。否则,只读的话,仅能扫盲。
‘柒’ Linux内核源代码导读的介绍
本书根据最新的2.6.24内核为基础。在讲述方式上,本书注重实例分析,尽量在讨论“如何做”的基础上,深入讨论为什么要这么做,从而实现本书的写作宗旨:“授人以渔”。在内容安排上,本书包含以下章节x86硬件基础;基础知识;Linux内核Makefile分析;Linux内核启动;内存管理;中断和异常处理;系统调用;信号机制在类UNIX系统中;时钟机制;进程管理;调度器;文件系统;常用内核分析方法。
‘捌’ 如何读懂linux内核源码
Linux的内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux目录下的东西就是内核源代码。
对于源代码的阅读,要想比较顺利,事先最好对源代码的知识背景有一定的了解。对于linux内核源代码来讲,我认为,基本要求是:1、操作系统的基本知识; 2、对C语言比较熟悉,最好要有汇编语言的知识和GNU C对标准C的扩展的知识的了解。
另外在阅读之前,还应该知道Linux内核源代码的整体分布情况。我们知道现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。看一下Linux内核源代码就可看出,各个目录大致对应了这些方面。Linux内核源代码的组成如下(假设相对于linux目录):
arch 这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。
include 这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。
init 此目录包含核心启动代码。
mm 此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/-/mm目录下,如对应于X86的就是arch/i386/mm/fault.c 。
drivers 系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。
ipc 此目录包含了核心的进程间通讯代码。
moles 此目录包含已建好可动态加载的模块。
fs Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。
kernel 主要核心代码。同时与处理器结构相关代码都放在arch/-/kernel目录下。
net 核心的网络部分代码。里面的每个子目录对应于网络的一个方面。
lib 此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/-/lib/目录下。
scripts 此目录包含用于配置核心的脚本文件。
Documentation 此目录是一些文档,起参考作用。
‘玖’ 如何查看 linux 内核源代码
Linux的内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux目录下的东西就是内核源代码。
对于源代码的阅读,要想比较顺利,事先最好对源代码的知识背景有一定的了解。对于linux内核源代码来讲,我认为,基本要求是:1、操作系统的基本知识;2、对C语言比较熟悉,最好要有汇编语言的知识和GNU C对标准C的扩展的知识的了解。另外在阅读之前,还应该知道Linux内核源代码的整体分布情况。我们知道现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。看一下Linux内核源代码就可看出,各个目录大致对应了这些方面。Linux内核源代码的组成如下(假设相对于linux目录):
arch 这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。
include 这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。
init 此目录包含核心启动代码。
mm 此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是arch/i386/mm/fault.c 。
drivers 系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。
ipc 此目录包含了核心的进程间通讯代码。
moles 此目录包含已建好可动态加载的模块。
fs Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。
kernel 主要核心代码。同时与处理器结构相关代码都放在arch/*/kernel目录下。
net 核心的网络部分代码。里面的每个子目录对应于网络的一个方面。
lib 此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。
scripts此目录包含用于配置核心的脚本文件。
Documentation 此目录是一些文档,起参考作用。
俗话说:“工欲善其事,必先利其器”。 阅读象Linux核心代码这样的复杂程序令人望而生畏。它象一个越滚越大的雪球,阅读核心某个部分经常要用到好几个其他的相关文件,不久你将会忘记你原来在干什么。所以没有一个好的工具是不行的。由于大部分爱好者对于Window平台比较熟悉,并且还是常用Window系列平台,所以在此我介绍一个Window下的一个工具软件:Source Insight。这是一个有30天免费期的软件,可以从www.sourcedyn.com下载。安装非常简单,和别的安装一样,双击安装文件名,然后按提示进行就可以了。安装完成后,就可启动该程序。这个软件使用起来非常简单,是一个阅读源代码的好工具。它的使用简单介绍如下:先选择Project菜单下的new,新建一个工程,输入工程名,接着要求你把欲读的源代码加入(可以整个目录加)后,该软件就分析你所加的源代码。分析完后,就可以进行阅读了。对于打开的阅读文件,如果想看某一变量的定义,先把光标定位于该变量,然后点击工具条上的相应选项,该变量的定义就显示出来。对于函数的定义与实现也可以同样操作。别的功能在这里就不说了,有兴趣的朋友可以装一个Source Insight,那样你阅读源代码的效率会有很大提高的。怎么样,试试吧!
‘拾’ Linux内核源代码导读的作者简介
李云华,是一名内核技术的狂热爱好者,长期从事操作系统内核、计算机网络、设备驱动程序、以及嵌入系统方面的开发和研究。拥有丰富的设备驱动开发、网络优化、内核及驱动移植、嵌入式系统构建等方面的开发经验。对Windows内核驱动及Linux内核驱动均有丰富的开发经验及心得体会。