内核入门

内核入门

取自 西邮linux

http://xiyoulinux.cn/wiki/index.php?title=%E5%86%85%E6%A0%B8%E5%85%A5%E9%97%A8

目录

[隐藏]
<script type="text/javascript"></script>

[编辑] 走近Linux内核

作者:[王聪]

 

不要理会任何一个告诉你内核开发是困难,特别或者不同的人。它是一个大的程序,而且bug修复或驱动编写是一个最佳起点。它也没有什么魔力,也不是使用只有留着络腮胡的老手才能读懂的语言编写。

──Alan Cox

 

[编辑] 简介

这篇文章是专门写给那些对Linux内核感兴趣,却又不知道如何着手去读懂那么多代码的内核新手。也许你刚刚了解Linux,又急于探索Linux的内部秘密;也许你是一个Linux开发者,熟悉应用程序的开发,又雄心勃勃准备 向内核世界进发。那么这篇文章正是你需要的,它会带你走进内核的世界,伴你渡过危险的沼泽。通过分享我们自 己的经历,希望有更多的人能够加入到Linux内核开发者行列。

内核开发向来被视为非常神秘的工作,仿佛只有传说中的留着长长的络腮胡的黑客们才能从事它。其实不然,Linux内核的开发和其它大型项目没有多少差别,只不过它的调试确实有点特别,需要一些特别的技巧。不要恐慌(Don't Panic!),只要你下功夫,你也能参与内核的开发,它的确是一件非常好玩的事。

[编辑] 需要准备什么

当然,你首先要有一台可供支配的电脑,最好装有Linux。如果可以,最好再有一台专门供你调试代码的机器,因为没人能保证调试内核的过程中不会让你的文件系统崩溃。或者,至少有一块专门给调试内核使用的硬盘。

最好还有一个固定的互联网接口,毕竟Linux内核开发是在网络上进行的,而且你也会经常在互联网上搜索一些有用的信息。

如果你是一位超级geek的话,再准备一根双机串口线,它能帮助你从一台机器上“聆听”另一台机器上内核运行中的“抱怨”。嗯,有点像是外科医生给病人听诊,这看起来很酷,不是吗?

如果你准备在一台非计算机设备上调试你的内核(这没什么奇怪的,Linux早已经被移植到千奇百怪的系统上),那么你还需要准备相应的硬件,或者它的模拟器,或者其它一些工具。如果你有在非计算机设备上调试Linux内核的经验,请在这里自由添加相应的内容。

[编辑] 开始

我们假设上面的东西你都准备好了,整装待发,现在可以正式进军内核了。当然了,如果你对Linux上的开发已经很熟悉了,你可以安全地跳过这一节。好了,出发,水手们!

[编辑] 1. 精通C语言编程

不是我们一味推崇C语言,而是C语言的的确确太适合做内核开发了。C语言的诞生源于编写Unix内核代码,它精练的设计哲学确实做到了这一点。甚至有人这样评价C语言──“它联合了汇编的所有威力。”如果你还不懂C,赶快去学吧。

如果你是一名编程新手,不推荐用C作为你的入门语言,原因如下:

  • 编程新手最需要了解的是编程的概念和对编程的基本认识,而过多的接触C语言往往会把你引出这一目的,会让你把注意力集中到一些奇怪的语言特性上,而不是编程语言本身。
  • 编程新手往往对计算机了解不够深刻,不清楚计算机的内部结构,而C语言恰恰就是和计算机内存/编码/CPU打交道,最起码,调试那些“隐晦”的错误时如此。(想想你是不是没有把一个指向指针的指针的指针指向正确的位置。)
  • 学好C语言需要下很大的功夫,最起码不能低于两年。(当然如果你不打算学好那得另说了。)


所以,最好先学一门比较简单的编程语言作为铺垫。不妨试一下Python,它比Java还要简单。当然了,这并非绝对,因人而异。如果你真的决定开始学习C语言,那么推荐的入门书籍仍然是K&R的《The C Programming Language》。过去这么多年了,它仍然被奉为入门的首选,可见其有多么经典。

不过仅仅了解C的语法,能编写一些小的程序是远远不够的。你必须能够熟练地操纵C语言,了解它的一些缺陷和陷阱,让它变成你的利器。有句话说得好:“C语言就像一把刻刀,简单,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能驾驭它的人。”读一读《C Traps and Pitfalls》和《Expert C Programming》吧,它们能让你有一个大的提升,成为一名C语言高手。

如果碰巧你是一位C++的推崇者,那么下面的一些引用或许能说服你开发Linux内核不使用C++(摘自LKML FAQ)。

   Linus在2004年说:
   In fact, in Linux we did try C++ once already, back in 1992.
   It sucks. Trust me - writing kernel code in C++ is a BLOODY STUPID IDEA.
   他认为:
   C++编译器是不可靠的,1992年的时候更糟,有一些基础性的东西没有改变:
C++的异常处理是broken(不知道怎么翻译这个词好)的,对内核来说它更是broken。
任何一个喜欢把内存分配藏到你背后的编译器或者语言,都不是你编写内核的好的选择。
你可以用C来编写OO代码,而不用C++的一些“废话”。

 

   Andrew D. Balsa如是说:
   Linux一开始的时候gcc还没有很好的C++实现,而且当时C程序员比C++程序员要多。

 

   Richard E. Gooch 解释到:
   在Linux诞生之前,也有内核在g++下编译,但是人们抱怨它的性能。据证明,把C代码放到g++下编译
   会产生更糟糕的代码。它不应该有差别,但的的确确有!

 

[编辑] 2. 熟悉常用的工具
[编辑] 掌握至少一种编辑器

掌握一种你喜欢的编辑器是非常有必要的,它能为你节省很多时间。在Linux上,最著名的编辑器莫过于emacs和vi了。一些内核开发者介绍,他们大多数人就是在使用这两种编辑器中的一种。可能一开始你并不能适应这种环境,没关系,熟练之后你的效率会有质的飞跃。

  • vi

在内核开发中使用vi有如下好处:
1. 占用内存少,加载速度快; 2. 高度可定制化,经配置的vi可以很好地重映射命令按键; 3. 可以自动补齐一些函数名和变量名; 4. 可以和ctags很好地配合使用,通过ctrl+]能很快定位函数的定义位置。

大多数Linux发行版本默认安装了vimtutor这个快捷的入门教程,其学习模式是边操作边学习。你可以在30分钟内学习到vim编辑器(vi的拓展版本,功能强大)的所有基础特性。要使用vimtutor,在SHELL下输入:

$ vimtutor en

如果了解更多的vi使用说明,请参考:《Learning the vi Editor, Sixth Edition》, L.Lamb, O'Reilly

  • emacs

emacs的优点如下:

1. Lisp扩展可以大幅度提高效率; 2. 和etags的良好整合; 3. 按键组合更具指导性。
更多的emacs使用知识请参考:《Learning GNU Emacs, Third Edition》, Debra Cameron, James Elliott and Marc Loy, 2004, O'Reilly

[编辑] 熟悉Linux命令行工具

内核开发者一般都在命令行下面工作,是的,图形界面有时会让事情变得更糟,对内核开发尤为如此。你应该能在命令行下面进行一些简单的工作,比如:编译程序,提交补丁,控制版本,收发邮件等。一些常用的命令行技巧会有帮助,所以也不妨去了解一些shell编程知识。下面仅介绍一些常用的:

  • gcc

gcc是GNU提供的优秀的软件之一,其性能不亚于任何商业编译器。它具有惊人的可移植性,而它也号称其最优化功能非常强大,所以Linux内核就是采用了gcc作为编译器(Compiler)。gcc的选项这里无法一一列举,只能介绍一些常用的选项。
-o filename:这可能是你最常用的一个选项了。它用来产生以指定名字的可执行输出文件。如果不指定文件名,gcc产生默认的a.out。

-c: 只编译(Compile)不连接(Link),产生以.o结尾的目标文件,目标文件中存放着目标代码。当然它也可以同时编译多个文件。

   $ gcc -c hello.c

-Idir: 要求gcc在搜寻头文件时除了默认的目录/usr/include,也要到指定的目录dir中去找。比如,编译test.c时要用到/home/myname/test.h,我们可以:

$ gcc -I/home/myname test.c -o test

-On: 最优化选项。后面的n越大最优化程度越大。一般最常用的是-O2。-O0是不优化,这也是默认的。

   $ gcc -O2 -o foo foo.c


-Wall/-w: -Wall将打开所有警告,而-w将关闭所有警告。在编译C程序时,强烈建议你加上-Wall选项,因为gcc给出的很多警告都是相当有用的。当然还有折中的选择,具体请参阅man手册。
-W: 打开一些额外的警告。
-S:用来产生相应的汇编源文件,默认的文件名是filename.s

  • make

make是一个通用的工程管理工具,它可以“自动化编译”,极大地提高了软件开发的效率。make的使用是根据预先设定的规则来运行的,这些设定的规则记录在一个文件中,即makefile。

make命令的格式是:

   make [ -f makefile ] [ option ] ... target ...

-c dir :将指定目录设为make开始运行后的工作目录。 -f filename :将指定的文件作为makefile -k :使make尽可能地编译,即使命令调用返回一个错误,make也不会停止运行。这个功能很有用,例如,当需要移植的时候;你可以创建尽可能多的目标文件,然后可以在不用等待中间文件创建的同时,移植到不能创建的文件处。

makefile的书写规则是一个大的话题,我们在这里难以展开论述。[这里]有一篇介绍makefile书写的Howto,不妨仔细读一下。要对make进行更深入的了解,请参考《Managing Projects with GNU make》一书。

 

  • grep

grep用来在文件中查找一个给定的字符串模式,比如可以快速定位函数或结构体定义。它还可以自动匹配一些正则表达式,非常强大。比如:你要搜索task_struct的定义, 你可以:

   $grep -r task_struct * | less

-r选项或许是你需要的,它可以帮你扫描源代码树中的所有源代码文件。查看grep的man手册来了解更多信息。

 

  • diff/patch

如果你在维护包含很多源文件的一个大型项目,每次更新后都推出完整的源程序是不太可行的,所以最好就用patch程序来更新原来的程序。这样,当你的程序升级时,你只要推出源文件对应的patch文件,其他人就能通过执行patch来使用那个patch文件,以获得最新版本的程序。
比如我们有一个程序foo,我们把它更新为bar,我们可以用diff程序这样产生patch文件:

   $diff -u foo bar > foo.patch


-u参数指定使用特殊的diff输出格式,否则得到的patch格式怪异,一般人都没法看懂。foo.patch就包含了描述foo和bar不同的信息,我们将用这个文件来更新。

提示:一定要注意diff命令后面的文件名顺序,一定是旧的文件在前,新的文件在后!
接下来,我们用patch来更新:

   $patch foo < foo.patch

使用过某个patch文件后,若要再次使用该patch文件,patch程序会产生警告信息:询问是否以-R方式执行,-R将还原文件。这样很好,防止进行了误操作。当然,有时你想更新的是整个目录中的所有源文件,比如foo和bar两个目录,我们可以:

   $diff -cr foo bar >foo.patch
   $patch -p0 < foo.patch


diff的-c参数表示输出上下文格式,-r参数表示递归的比较两个目录。 -p0告诉patch程序被更新的文件的路径名并没改变。
diffstat是一个很有用的工具,它可以列出patch 所引起的变更的统计(加入或移出的代码行)。输出关于patch的信息,执行:

$diffstat -p1 foo.patch

更多选项请参阅patch和diff的使用手册。

[编辑] 3. 良好的英文阅读能力和表达能力

不管是在Linux内核中,还是在Linux大多数应用程序中,文档基本上都是用英语写成的,到目前为止,大多数还没有对应的汉语翻译。而且Linux内核黑客之间也是用英语交流的,虽然他们可能来自世界各地。熟练地驾驭英文肯定让你受益非浅。
引用ESR在《如何成为一名黑客》一文中的话:

   “当前英语有着比其他语言丰富得多的技术词汇,因此是一个对于工作来说相当好的工具。基于类似的原因,
   英文技术书籍的翻译通常不令人满意(如果有翻译的话)。”


“Linus Torvalds,一个芬兰人,用英语注释他的代码(很明显这对他来说不是凑巧)。他流利的英语成为

   他能够管理全球范围的Linux开发人员社区的重要因素。这是一个值得学习的例子。”


如果你不懂实用性的英语,赶快去学习吧。

[编辑] 进阶

如果你能来到这里,那说明你已经是一名合格的Unix/Linux程序员了。但是,如果你要成为一名内核程序员,还需要下面的一些知识。

[编辑] 1. 理解操作系统原理

内核是操作系统的核心和灵魂,要理解内核的原理和运作,必须具备基本的操作系统知识。操作系统课上的一些理论性的东西很有帮助,比如信号量的定义和使用,死锁的预防,内存页面的置换等等。列举如下:

  • 1. 进程管理

进程的定义和PCB,进程和线程的区别,进程的三个基本状态及它们之间的转换关系,进程的同步,竞争和死锁,进程间通信

  • 2. 内存管理

分页式管理,分段式管理,虚拟内存的概念,页面置换算法,内存分配算法

  • 3. 设备管理

中断的概念,中断处理,I/O控制方式,缓冲区管理,设备驱动,磁盘调度和高速缓存

  • 4. 文件管理

文件的概念,文件的管理,文件系统

  • 5. 系统调用

系统调用的概念,系统调用的处理,系统调用类型

关于操作系统理论方面的书籍,推荐Andrew S. Tanenbaum编写的《Operating Systems: Design and Implementation》一书。

[编辑] 2. 一些硬件知识

由于内核本身的特殊性,一些时候你不得不和计算机硬件打交道,尤其是CPU。以i386为例说明:

  • 常用寄存器,常见指令
  • 实模式和保护模式
  • 分段和分页机制
  • TSS和任务管理
  • 中断机制
  • 时钟机制
  • 高速缓存

关于Intel CPU最权威的资料莫过于Intel的官方手册,它们可以在Intel网站上免费[下载] 。其实你只要读一下System Programming Guide就够了。

如果你在做嵌入式Linux或者Linux设备驱动,相关的硬件知识更是必须的,可惜这里无法一一列举。

[编辑] 3. 其它

你还需要足够的耐心和一些运气,毕竟内核调试不像用户程序那么容易,一些bug让整个社区好几天都食不甘味了。用户程序的调试经验或许有用,但用处不大。这就更要求你对内核本身有足够多的了解了,实际上,你对内核越是了解,bug就越容易清除。

最后,你可能还需要一些想像力。没错,Linux内核开发者有着丰富的想像力,他们经常使用一些“神来之笔”来解决令旁人苦恼的问题,或者为内核添加一项新奇的功能来让内核运行更流畅。

推荐相关书籍:

  • 《Linux内核完全剖析》

讲述Linux 0.11版的源代码,是一个不错的起点。

  • Understanding the Linux Kernel, 3rd Edition

中文版是《深入理解Linux内核》,第三版即将上市。第三版主要是讲解2.6版的内核,保持了前两版的风格,是深入学习内核的必读书籍。

  • Linux Kernel Development, 2nd Edition

中文版是《Linux内核开发》。其内容朴实,风格简练,便于整体把握Linux内核架构。当了解操作系统原理后,便可阅读这本书。

  • The Linux Kernel Primer - A Top Down Approach For x86 and PowerPC Architectures

中文版是《Linux内核编程》,此书最大的特色是能够把x86和ppc两个平台结合起来讲述内核,从用户程序讲起,深入到内核,而且每章后面还配有练习题。

  • Linux Device Drivers, 3rd Edition

中文译本是《Linux设备驱动程序》,该书是设备驱动开发的最好工具书。其中的例子对于内核开发者来讲是最好的启蒙教材。

  • 《Linux操作系统原理与应用 》

陈老师写的一本不错的内核书籍,从原理、设计思想的角度对Linux操作系统的核心内容进行全面的阐述。

  • 《Linux内核情景分析》

本书采取类似于英语教学中行之有效的情景会话的教学方法,全面深入地剖析了Linux 2.4.0内核源代码,并对Linux核心的独特优点和需要进一步改进的问题作了精辟的评述。 全书分上下两册。一些有用的链接:

[编辑] 结束语

讲了这么多了,现在该轮到你了。如果你对上面的知识还有没全部掌握,那么不妨从你不熟悉的地方入手,一步步去了解和熟悉Linux内核。如果你是一位高手,对Linux内核有初步的了解和认识,不妨去动手写一些驱动程序或者内核模块,尝试对Linux内核做一些自己的修改。如果可以,加入Linux内核邮件列表,看看里面的内核黑客在做些什么,试着帮他们测试新的内核,修复一些bug。

祝你在Linux内核世界走得更远!

[编辑] 关于Linux内核学习的误区

(转自:chinaunix,作者:albcamus)
先说句正经的:其实我没资格写这篇文章,因为自己也就一两个月以来才开始有所领悟的。因此,这里与其说是关于Linux内核学习的经验,不如说是自己的教训吧,希望不要扔鸡蛋砸我^_^

常常有人问:我想学习内核,需要什么基础吗?Linus Torvalds本人是这样回答的:你必须使用过Linux。 这个……还是有点太泛了吧,我想下面几个基础可能还是需要的,尽管不一定必需:

1, 关于操作系统理论的最初级的知识。不需要通读并理解《操作系统概念》《现代操作系统》等巨著,但总要知道分时(time-shared)和实时(real-time)的区别是什么,进程是个什么东西,CPU和系统总线、内存的关系(很粗略即可),等等。

2, 关于C语言。不需要已经很精通C语言,只要能熟练编写C程序,能看懂链表、散列表等数据结构的C实现,用过gcc编译器,就可以了。当然,如果已经精通C语言显然是大占便宜的。

3, 关于CPU的知识。这块儿可以在学习内核过程中补,但这样的话你就需要看讲解很详细的书,比方后面将会提到的《情景分析》。你是否熟悉 Intel 80386 CPU?尝试着回答这几个问题来判断一下:1)说出80386的中断门和陷阱门的区别;2)说出保护模式与实模式的区别;3)多处理器机器上,普通的读-改-写回一块内存这样的动作,为什么需要特殊的手段来保护。等等。讲解基于其它CPU的Linux内核的书,目前好象只有一本《IA64Linux内核:设计与实现》──也还是Intel的,其它都是讲解基于IA32的。

以上算是知识方面吧,如果还要再补充一条,我想就是:动手编译过内核。

好了,我们接下来走。好多人装上Linux之后,第一件事找到内核源码所在的路径,打开一个C程序文件,开始哗哗哗翻页,看看大名鼎鼎的 Linux内核代码到底长啥模样──然后关闭。这是可理解的,但却不是学习的方法。刚开始,必须从读书入手。至少要对内核有一个 Overview之后,才有可能带着问题去试图阅读源代码本身。下面就讲一下我读过的几本书:

1, 《Linux内核设计与实现》,英文名Linux Kernel Development(所以有人叫它LKD),机械工业出版社,¥35, 美国Robert Love著,陈莉君译者。 评说:
  此书是当今首屈一指的入门最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。这本书讲解浅显易懂,全书没有列举一条汇编语句,但是给出了整个Linux操作系统2.6内核的概观,使你能通过阅读迅速获得一个overview。而且对内核中较为混乱的部分(如下半部),它的讲解是最透彻的。对没怎么深入内核的人来说,这是强烈推荐的一本书。
翻译:翻译水平、负责任程度都不错,但是印刷存在一些错误。买了此书的朋友可以参考我在Linux高级应用版的《Linux内核设计与实现中文版勘误》: http://bbs.chinaunix.net/forum/viewtopic.php?t=541234 另外,此书2005年有了第二版,目前尚无中译本面世。我就是对照着2nd-en勘误1st-cn的。

2, 《Linux内核源代码情景分析》上、下。毛德操、胡希明著,浙江大学出版社,上册¥80,下册¥70.评说:

 本书是基于2.4.0内核的,比较早,也没听说会出第二版。上册讲解内存管理、中断、异常与系统调用、进程控制、文件系统与传统 Unix IPC;下册讲
 解socket、设备驱动、SMP和引导。关于这套书的评价褒贬不一,我个人认为其深度是同类著作中最优秀的。本书基于 Intel IA32体系,由于厚度
 大,很多体系上的知识都捎带讲解了,所以如果你想深入了解内核的工作机制而又不非常熟悉Intel  CPU的体系构造,本书是最合适的。缺点是:版
 本较老,没有TCP/IP协议栈部分(它讲的socket只是Unix域协议的),图表太少,不适合初学者入门。还有就是对学生朋友来说,可能书价偏
 高,这样的话可以考虑先买上册,因为上册是核心部分,下册一大部分都在讲具体PCI/ISA/USB设备的驱动。


翻译:没什么翻译,作者是国人,而且行文流畅。本人书桌上诸多计算机经典图书当中,这套是唯一又经典又无阅读障碍的。
www.linuxforum.net内核版好多朋友已经把这书读到六七遍了,我很惭愧,上册差不多读熟了,下册就SMP部分还看过──但这就花费了整整1年的时间,还有好多弄不懂的。这里顺便说明另外一个研究内核常见的误区:目标太庞大。要知道Linux内核(最新的2.6.13) bzip2压缩之后37M,解压缩之后244M,根本不是哪个人能够吃透的。即使是内核的核心开发团队中,恐怕也只Linus Torvalds、 Alan Cox、David Miller、Ingo Molnar寥寥数人会有比较全面的了解,其它人都是做自己专门的部分。 我自己来说,目前已经决定放弃内存管理的全部(slab层、LRU、rbtree等)、文件系统部分、外设驱动部分,暂时也没打算弄IA32以外的其它体系的部分。

3, 《深入理解Linux内核》第二版。中国电力出版社。也是陈莉君译。此书是Linux内核黑客在推荐图书时的首选。 评说:

 此书C版的converse兄送了我一本第一版,因此就没买第二版,比较后悔。因此只就第一版说一说,第一版基于2.2,第二版2.4 。我见O'Reilly官
 方主页上说第三版的英文版将于2005年11月出版,也不知咱们何时才能见到。此书图表很多,形象地给出了关键数据结构的定义,与《情景分析》相
 比,本书内容紧凑,不会一个问题讲解动辄上百页,有提纲挈领的功用,但是深度上要逊于《情景分析》。



4, 其它的几本书。市面上能见到的其它的Linux内核的图书,象《Linux设备驱动程序》、《Linux内核源代码完全注释》以及新出的《Linux内核分析及编程》等。
《Linux设备驱动程序》第二版是基于2.4的,中文翻译不错,中国电力出版。这书强调动手实践,但它是讲解“设备驱动”的,不是最核心的东西,而且有些东西没硬件的话无法实践,可能更适合驱动开发的程序员吧,不太适合那些For fun and profit的人。此书有第三版英文版,东南大学出版社影印,讲解2.6的,行文流畅,讲解的面也比第二版更广泛,我读过其中关于同步与互斥、内存分配的部分,感觉很不错。

《Linux内核源代码完全注释》(机械工业出版社)是同济大学的博士生赵炯的著作,讲解0.1Linux内核,我没买也没看,有看过的朋友说一说。

《Linux内核分析及编程》(电子工业出版社)是刚刚出版的,国人写的,讲解2.6.11 。很多人说好,但有人说不够系统,我没买,不敢评说。

还有一本清华出的《Linux内核编程指南(第三版)》,原书应该是好书,但是翻译、排版十分糟烂,脱字跳行,根本没法看,我买了一本又扔掉了。

5, 其它资源。 TLDP(The Linux Documentation Project)有大量文档,其中不少是关于内核的,有些是在国外出版过的,象《Linux Kernel Interls》《The Linux Kernel》《Linux Kernel Module Programming Guide》等,作者都是亲身参加开发的人,著作较为可信。 Http://www.linuxforum.net 中国Linux论坛的内核版。该版是研究内核的中文Linux社区中水平最高的,有很多专家级别的牛人,强烈推荐去学习一下(但建议不要问太过分简单的问题,人家脾气再好也会烦的^_^),它的置顶贴简直是一个包罗万象的FAQ,精华区也有很多资料。只可惜太过曲高和寡,人气不是很旺。

6, 一本不是讲解Linux的书:《现代体系结构上的Unix系统:内核程序员的SMP和Caching技术》,人民邮电出版社2003 版,定价¥39. 本书虽然不是讲解Linux,但是对所有Unix内核都是适用的,适合对SMP和CPU的Cache这些组成原理知识不是很熟的朋友,而且是很多国外牛人推荐的书。中文版翻译非常负责。

还有个很重要的问题:怎样浏览内核源代码。有的朋友喜欢在Windows上工作,用Source Insight;有的在Linux,用 Source Navigator;还有专门浏览源代码的软件,象lxr(Linux Cross Reference);还有用 ctags/ectags/cscope等,这些都是很优秀的软件。我个人用Vim + ctags浏览(参考了www.linuxforum.net内核版wheelz大侠的文档,)。

此外,前边已经提到的一个重要的问题是:你研究内核的目的是什么, 开发? 乐趣?如果是开发,而且是国内做开发,把kernel API熟悉一下就差不太多了(你也知道国内的水平有多差),比方说copy_from_user()、kmalloc()函数等,kernel API在 Internet上找得到,编译内核时也可以用DocBook生成(具体请参考内核源代码包下的README文件);如果是研究,那就差别很大了,需要下很大的苦功:会用kmalloc()绝不说明你懂得Linux内核的虚存管理子系统,正如同会讲汉语不说明你懂中国文化一样。

[编辑] 如何阅读Linux内核

作者:[牛涛]

[编辑] 阅读内核源码的工具

  • 在本地阅读

这里介绍一种阅读内核源代码的工具,名字叫cscope。具体说应该是cscope + vim +ctags。
对于ubuntu用户,你可以直接在命令行上搞定这些软件的安装。
sudo apt-get install cscope
sudo apt-get install ctags
sudo apt-get install vim-full
因为ubuntu系统自带已经安装了vim,所以我们不必安装,但最好还是安装vim-full,这样在vim中打开的源码就有了语法高亮显示,比较容易阅读。安装完vim-full后,我们要修改.vimrc来启用语法高亮:
vim ~/.vimrc
在其中添加
syntax on
这样我们的vim就支持语法高亮显示了。之后我们需要下载一个内核源码包,这个可以在[www.de.kernel.org]上下载。下载下来之后解压,进入内核源码目录,运行cscope,ctags:

find $s -name "*.h"-o -name "*.c" -o -name "*.cc" -name "*.S" >cscope.list
cscope -bkq -i cscope.list

或者使用 cscope-indexer -r 生成cscope的索引文件

ctags -R
现在我们启动cscope就可以方便的阅读内核源码了:
cscope -R
其中我们可以方便快速的搜索我们想要的结构体定义,内数定义。

  • 在vim中ctags的简单使用
1) 进入
进入vim后,用
:tag func_name
跳到函数func_name

2) 看函数(identifier)
想进入光标所在的函数,用
CTRL + ]

3) 回退
回退用
CTRL + T
查找标识符
:tag write_<TAB>
找到以write_开头的标识符,如果有多个,继续按<TAB>,直到找到想要的。
如果想跳到包含block的标识符
:tag /block
然后用<TAB>来选择。
这里'/'就是告诉vim'block'是一个pattern。
如果想在以write_开头的标识符中选择一下,
:tselect /^write_
这里,'^'表示开头,同理,'$'表示末尾。
多个同名的标识符
如果某个函数有多个定义,':tag'命令会跳到第一个,如果当前文件有,则优先用这个。
然后可以跳到下一个同名的
:tnext
跳到第一个
:tfirst
跳到前count个
:[count]tprevious
跳到后count个
:[count]tnext
跳到最后一个
:tlast
你也可以在所有tagname中选择:
:tselect tagname 
  • 在网上阅读

第二个方法是如果我们有网络,我们可以直接在网上浏览linux内核源代码,直接登录http://lxr.linux.no/linux,我们就可以阅读linux内核源代码了。但是如果你的网络环境不好,反应将会很慢,所以还是建议在本地浏览,也就是使用方法一那种方式。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值