Linux内核入门 西邮.doc_第1页
Linux内核入门 西邮.doc_第2页
Linux内核入门 西邮.doc_第3页
Linux内核入门 西邮.doc_第4页
Linux内核入门 西邮.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

走近Linux内核作者:王聪 不要理会任何一个告诉你内核开发是困难,特别或者不同的人。它是一个大的程序,而且bug修复或驱动编写是一个最佳起点。它也没有什么魔力,也不是使用只有留着络腮胡的老手才能读懂的语言编写。Alan Cox 编辑 简介这篇文章是专门写给那些对Linux内核感兴趣,却又不知道如何着手去读懂那么多代码的内核新手。也许你刚刚了解Linux,又急于探索Linux的内部秘密;也许你是一个Linux开发者,熟悉应用程序的开发,又雄心勃勃准备 向内核世界进发。那么这篇文章正是你需要的,它会带你走进内核的世界,伴你渡过危险的沼泽。通过分享我们自 己的经历,希望有更多的人能够加入到Linux内核开发者行列。内核开发向来被视为非常神秘的工作,仿佛只有传说中的留着长长的络腮胡的黑客们才能从事它。其实不然,Linux内核的开发和其它大型项目没有多少差别,只不过它的调试确实有点特别,需要一些特别的技巧。不要恐慌(Dont 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, OReilly emacs emacs的优点如下:1. Lisp扩展可以大幅度提高效率; 2. 和etags的良好整合; 3. 按键组合更具指导性。 更多的emacs使用知识请参考:Learning GNU Emacs, Third Edition, Debra Cameron, James Elliott and Marc Loy, 2004, OReilly编辑 熟悉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 -p0 cscope.listcscope -bkq -i cscope.list或者使用 cscope-indexer -r 生成cscope的索引文件ctags -R现在我们启动cscope就可以方便的阅读内核源码了:cscope -R其中我们可以方便快速的搜索我们想要的结构体定义,内数定义。 在vim中ctags的简单使用 1) 进入进入vim后,用:tag func_name跳到函数func_name2) 看函数(identifier)想进入光标所在的函数,用CTRL + 3) 回退回退用CTRL + T查找标识符:tag write_找到以write_开头的标识符,如果有多个,继续按,直到找到想要的。如果想跳到包含block的标识符:tag /block然后用来选择。这里/就是告诉vimblock是一个pattern。如果想在以write_开头的标识符中选择一下,:tselect /write_这里,表示开头,同理,$表示末尾。多个同名的标识符如果某个函数有多个定义,:tag命令会跳到第一个,如果当前文件有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论