像Linux内核这样庞大而复杂的程序看起来确实让人望而生畏,它象一个很大的球,没有起点和终点。在读源代码的过程中,你会遇到这样的情况,当读到内核的某一部分时又会涉及到其它更多的文件,当返回到原来的地方想继续往下读时,又忘了原来读的内容。在internet上,很多人为此付出了很大的努力,制作出了源代码导航器,这为源代码阅读提供了良好的条件,站点为:http://lxr.linux.no/source,下面给出阅读源代码的一些线索。
1. 系统的启动和初始化
在基于Intel的系统上,当 loadlin.exe
或 LILO把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这一部分,看arch/i386/kernel/head.S
,head.S进行特定结构的设置,然后跳转到init/main.c的main()例程。
2. 内存管理
内存管理的代码主要在/mm,但特定结构的代码在arch/*/mm。缺页中断处理的代码在mm/memory.c
,而内存映射和页高速缓存器的代码在mm/filemap.c。缓冲器高速缓存是在mm/buffer.c
中实现,而交换高速缓存是在mm/swap_state.c
和 mm/swapfile.c中实现。
3. 内核
内核中,特定结构的代码在arch/*/kernel,调度程序在kernel/sched.c,fork的代码在kernel/fork.c,task_struct
数据结构在 include/linux/sched.h中。
4. PCI
PCI
伪驱动程序在 drivers/pci/pci.c ,其定义在include/linux/pci.h。每一种结构都有一些特定的 PCI BIOS
代码, Intel的在arch/alpha/kernel/bios32.c。
5. 进程间通信
所有System V IPC
对象权限都包含在 ipc_perm
数据结构中,这可以在
include/linux/ipc.h中找到。 System V
消息是在 ipc/msg.c中实现,
共享内存在 ipc/shm.c中,信号量在
ipc/sem.c中,管道在 ipc/pipe.c中实现。
6. 中断处理
内核的中断处理代码是几乎所有的微处理器所特有的。中断处理代码在
arch/i386/kernel/irq.c中,其定义子在 include/asm-i386/irq.h中。
7. 设备驱动程序
Linux内核源代码的很多行是设备驱动程序。Linux设备驱动程序的所有源代码都保存在/driver,根据类型可进一步划分为:
/block
块设备驱动程序如ide(在ide.c)。如果你想看包含文件系统的所有设备是如何被初始化的,你应当看drivers/block/genhd.c中的device_setup(),device_setup()不仅初始化了硬盘,当一个网络安装nfs文件系统时,它也初始化网络。块设备包含了基于IDE和SCSI的设备。
/char
这是看字符设备(如tty,串口及鼠标等)驱动程序的地方。
/cdrom
Linux的所有CDROM代码都在这儿,如在这儿可以找到Soundblaster CDROM的驱动程序。注意ide
CD的驱动程序是 ide-cd.c,放在drivers/block,SCSI CD的驱动程序是scsi.c,放在drivers/scsi。
/pci
这是PCI伪驱动程序的源代码,在这里可以看到PCI子系统是如何被映射和初始化的。
/scsi
在这里可以找到所有的SCSI代码及Linux所支持的scsi设备的所有设备驱动程序。
/net
在这里可以找到网络设备驱动程序,如DECChip 21040 PCI
以太网驱动程序在tulip.c中。
/sound
这是所有声卡驱动程序的所在地。
8. 文件系统
EXT2
文件系统的源代码全部在 fs/ext2/
目录下,而其数据结构的定义在 include/linux/ext2_fs.h, ext2_fs_i.h
及 ext2_fs_sb.h中。虚拟文件系统的数据结构在 include/linux/fs.h中描述,而代码是在fs/*中。缓冲区高速缓存与更新内核的守护进程的实现是在
fs/buffer.c中。
8. 网络
网络代码保存在/net中,大部分的include文件在include/net下,BSD套节口代码在net/socket.c中,IP
第4版本的套节口代码在net/ipv4/af_inet.c。一般的协议支持代码(包括sk_buff
处理例程)在net/core下,TCP/IP联网代码在net/ipv4下,网络设备驱动程序在/drivers/net下。
9. 模块
内核模块的代码部分在内核中,部分在模块包中,前者全部在kernel/modules.c中,而数据结构和内核守护进程kerneld的信息分别在include/linux/module.h和include/linux/kerneld.h
中。如果你想看ELF目标文件的结构,它位于include/linux/elf.h中。
分享到:
相关推荐
### Linux内核源代码情景分析概述 #### 一、引言 《Linux内核源代码情景分析》是一本深入探讨Linux内核工作机制的专业书籍。本书的作者毛德操以其丰富的经验和技术深度,引领读者深入了解Linux内核的工作原理,并...
大多数Linux爱好者在阅读Linux内核源代码时会产生这样的困惑,我们很少能找到针对Linux操作系统,甚至某个单独的内核模块,在设计和开发方面的文档。仅有Linux社区的一些高手们对一些关键算法或者一些设计考虑的讨论...
《Linux内核源代码漫游》是一本深入浅出地介绍Linux内核源代码的重要书籍,它不仅为那些希望深入了解Linux内核机制的专业人士提供了宝贵的资源,也为那些想要入门Linux内核开发的新手们打开了大门。本书的核心目标...
大多数Linux爱好者在阅读Linux内核源代码时会产生这样的困惑,我们很少能找到针对Linux操作系统,甚至某个单独的内核模块,在设计和开发方面的文档。仅有Linux社区的一些高手们对一些关键算法或者一些设计考虑的讨论...
本文档旨在为 Linux 新手提供一个详细的 Linux 内核编译指南,帮助他们从基础开始学习 Linux 系统。编译内核对于 Linux 新手来说可能有一些困难,但通过本文档的指导,读者可以轻松地完成内核编译过程。 安装内核 ...
对于Linux内核新手而言,探索这一复杂的操作系统核心无疑是一项充满挑战的任务。本文旨在为初学者提供一份详尽的指导,帮助他们理解学习Linux内核所需的基础知识、常见误区以及推荐的学习资源。 #### 基础知识要求 ...
- 选择需要下载的Linux内核版本,找到源代码的压缩文件进行下载。 5. Linux内核的开发历史:Linux内核由芬兰黑客林纳斯·托瓦兹(Linus Torvalds)最初为了在英特尔x86架构上提供一个自由的类Unix操作系统而开发。...
### Linux内核设计与实现知识点概述 #### 一、Linux内核...无论是作为Linux内核爱好者还是普通程序员,甚至是初次接触Linux内核的新手,都能够从学习中获益匪浅。希望以上知识点能够为大家提供有价值的信息和支持。
通过阅读和分析这些源代码,可以深入理解Linux如何处理中断、进程管理、内存分配以及与其他硬件设备的交互。 `Linux内核完全注释V2.pdf`是赵炯的著作,这本书详尽地注释了Linux内核的源码,使得非专业程序员也能...
1. **构建可调试的内核**:首先,你需要从源代码构建一个包含调试信息的Linux内核。这可以通过配置`make menuconfig`时选择`CONFIG_DEBUG_INFO`选项来实现。 2. **配置QEMU**:启动QEMU时,需要指定内核映像和初始...
Linux内核中的补丁通常是相对于保存内核源代码目录的父目录生成的,这意味着`patch`文件中的文件路径包含了它所基于的内核源文件目录的名字。如果这些路径与本地机器上的内核源代码目录名称不一致,则需要调整`patch...
1. **下载源代码**:访问Linux内核的官方源码网站或者其他可信源下载Linux内核3.0.4的压缩包。通常推荐从官方网站下载以确保代码的安全性和完整性。 - 命令示例:`wget ...
《莱昂氏Linux源代码分析》是一份深入探讨Linux内核源代码的宝贵资料,它为读者揭示了操作系统内核的奥秘。这份压缩包包含了作者对Linux内核的精心研究,旨在帮助开发者、系统管理员以及对操作系统底层原理感兴趣的...
- **目标读者**:适合那些对Linux内核感兴趣的开发者,无论是希望了解Linux内核工作原理的新手还是想要深入探索内核编程的高级用户。 #### 2. Hello, World 示例 - **基本结构**:一个简单的Linux内核模块通常包含...
1. 获取源代码:你需要从Linux官方仓库(如kernel.org)或发行版的上游仓库获取最新的内核源代码。这可以通过git工具完成,例如运行`git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git`...