走向高手之路Linux系统内核技术解读

2016-01-29 17:35 5 1 收藏

走向高手之路Linux系统内核技术解读,走向高手之路 Linux系统内核技术解读

【 tulaoshi.com - Linux 】

    针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制;

  一.核心源程序的文件组织:

  1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心。

本文基于稳定的2.2.5源代码,第二部分的实现平台为 Redhat Linux 6.0。

  2.核心源程序的文件按树形结构进行组织,在源程序树的最上层你会看到这样一些目录:

●Arch :arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。PC机一般都基于此目录;

●Include: include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在 include/linux子目录下,与 intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/linux/)

●Init: 这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的一个非常好的起点。

●Mm :这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于arch/*/mm/,例如arch/i386/mm/Fault.c

●Kernel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中;

●Drivers: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ide(ide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。它不仅初始化硬盘,也初始化网络,因为安装nfs文件系统的时候需要网络其他: 如, Lib放置核心的库代码; Net,核心与网络相关的代码; Ipc,这个目录包含核心的进程间通讯的代码; Fs ,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,例如fat和ext2;

Scripts, 此目录包含用于配置核心的脚本文件等。

    一般,在每个目录下,都有一个 .depend 文件和一个 Makefile 文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;而且,在有的目录下还有Readme 文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解;


  二.解读实战:为你的内核增加一个系统调用

虽然,Linux 的内核源码用树形结构组织得非常合理、科学,把功能相关联的文件都放在同一个子目录下,这样使得程序更具可读性。然而,Linux 的内核源码实在是太大而且非常复杂,即便采用了很合理的文件组织方法,在不同目录下的文件之间还是有很多的关联,分析核心的一部分代码通常会要查看其它的几个相关的文件,而且可能这些文件还不在同一个子目录下。

体系的庞大复杂和文件之间关联的错综复杂,可能就是很多人对其望而生畏的主要原因。当然,这种令人生畏的劳动所带来的回报也是非常令人着迷的:你不仅可以从中学到很多的计算机的底层的知识(如下面将讲到的系统的引导),体会到整个操作系统体系结构的精妙和在解决某个具体细节问题时,算法的巧妙;而且更重要的是:在源码的分析过程中,你就会被一点一点地、潜移默化地专业化;甚至,只要分析十分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。

为了使读者能更好的体会到这一特点,下面举了一个具体的内核分析实例,希望能通过这个实例,使读者对 Linux的内核的组织有些具体的认识,从中读者也可以学到一些对内核的分析方法。

以下即为分析实例:

【一】操作平台:

硬件:cpu intel Pentium II ;

软件:Redhat Linux 6.0; 内核版本2.2.5

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/linux/)

[1] [2] [3] [4] [5]   

来源:https://www.tulaoshi.com/n/20160129/1502057.html

延伸阅读
1.引言 从事Linux环境工作2年有余,一直懵懵懂懂,1年前拜读了《莱昂氏UNIX源代码分析》一书,感觉自己的学习道路漫漫且修远。最近受chinaunix的精华文帖启发,拟将近来的部分内核调用分析笔记拿出来与各前辈先进共同探讨学习,以壮个人学习之路。 本部分主要讲述的是文件I/O操作的2.6.11内核版本实现,包括了主要的数据结构、宏定义和函数...
标签: PHP
  二、编写漂亮的代码   1.将后台程序与前端程序分开   在编写PHP程序时,有些代码是用来处理一些事务,例如操作数据库、进行数学运算等,而另外的一些代码则只是事务处理的结果显示出来,例如一些使用echo语句将结果以HTML的格式显示在Web浏览器上的PHP代码以及那些直接嵌入PHP程序的HTML代码。首先我们应该清晰地...
标签: 电脑入门
Windows 7是微软最新的桌面型客户端操作系统,是基于Windows XP和Vista的优点和缺点而升华出来的新系统,所有服务都得到了加强,新增的安全功能也使之更加可靠。除了基本的系统改进和新服务外,Windows 7提供了更多的安全功能,加强了审计和监控功能以及对远程通信和数据加密的功能,Windows 7还新开发了内部保护机制以加强系统内部安全性...
  1. 要怎麽进行核心的配置? 1.1. 取得原始程序码 你可以经由 ftp 从 ftp.funet.fi 或是 mirror in /pub/OS/Linux/PEOPLE/Linus 取 得原始程序码。也可以到这个节点的 mirror 或其他节点去拿。档案名称一般是以标记 成 linux-x.x.x.tar.gz 为代表,其中的&nb...
标签: PHP
  使用str-replace而不是ereg-replace   习惯使用Perl进行编程的程序员更加愿意使用ereg_replace完成字符串替换工作,因为在PHP中ereg_replace的用法和Perl中模式匹配的用法相近。但是,下面的这段代码证明,使用str_replace 代替 ereg_replace将可以大大提高代码的运行速度。     测试str_replace和ereg_re...

经验教程

884

收藏

19

精华推荐

PHP 高手之路(一)

PHP 高手之路(一)

一针见血的话

Linux 内核的类型

Linux 内核的类型

胡玉丰先生

linux内核编译详解

linux内核编译详解

天子沐沐

微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部