linux内核源码 进程,详解:Linux内核源代码
前面总结了关于Linux内核结构的学习,接下来我们一起学习Linux内核源代码。
第一:多版本的内核源代码
对不同的内核版本,系统调用一般是相同的。新版本也许可以增加一个新的系统调用,但旧的系统调用将依然不变,这对于保持向后兼容是非常必要的—一个新的内核版本不能打破常规的过程。在大多数情况下,设备文件将仍然相同,而另一方面,版本之间的内部接口有所变化。
Linux内核源代码有一个简单的数字系统,任何偶数内核(如2.0.30)是一个稳定的版本,而奇数内核(如2.1.42)是正在发展中的内核。这本书是基于稳定的2.4.16
源代码树。发展中的内核总是有最新的特点,支持最新的设备,尽管它们还不稳定,也不是你所想要的,但它们是发展最新而又稳定的内核的基础。
目前,较新而又稳定的内核版本是2.2.x和2.4.x,因为版本之间稍有差别,因此,如果你想让一个新驱动程序模块既支持2.2.x,也支持2.4.x,就需要根据内核版本对模块进行条件编译。
对内核源代码的修改是以补丁文件的形式发布的。patch实用程序用来对内核源文件进行一系列的修订,例如,如果你有2.4.9内核源代码,而你想移到2.4.16,你可以获得2.4.16的补丁文件,应用patch来修订2.4.9源文件。例如:
$ cd /usr/src/linux
$ patch -p1 < patch-2.4.16
第二:Linux内核源代码的结构
Linux内核源代码位于/usr/src/linux目录下,其结构分布如图1.3所示,每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系。下面是对每一个目录的简单描述。
include/子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其它模块重建内核。
init/ 子目录包含了内核的初始化代码,这是内核开始工作的起点。
arch/子目录包含了所有硬件结构特定的内核代码,如图1.3,arch/ 子目录下有i386和alpha模块等等。
drivers/ 目录包含了内核中所有的设备驱动程序,如块设备,scsi 设备驱动程序等等。
fs/ 目录包含了所有文件系统的代码,如:ext2, vfat模块的代码等等。
net/ 目录包含了内核的连网代码。
mm/ 目录包含了所有的内存管理代码。
ipc/ 目录包含了进程间通信的代码。
kernel/
目录包含了主内核代码
图1.3 显示了八个目录,即 init, kernel, mm, ipc,
drivers, fs, arch 及 net 的包含文件都在"include/" 目录下。在Linux内核中包含了 drivers, fs, arch及 net 模块,这就使得Linux内核既不是一个层次式结构,也不是一个微内核结构,而是一个“整体式”结构。因为系统调用可以直接调用内核层,因此,该结构使得整个系统具有较高的性能,其缺点是内核修改起来比较困难,除非遵循严格的规则和编码标准。
在图1.3中所显示的模块结构,代表了一种工作分配单元,利用这种结构,我们期望Linus
Torvalds能维护和增强内核的核心服务,即,init/, kernel/, mm/及 ipc/,其它的模块drivers, fs, arch及net 也可以作为工作单元,例如,可以分配一组人对块文件系统进行维护和进一步的开发,而另一组人对scsi文件系统进行完善。图1.3类似于Linux的自愿者开发队伍一起工作来增强和扩展整个系统的框架。
Linux源代码的分布结构
第三: 从何处开始阅读源代码
像Linux内核这样庞大而复杂的程序看起来确实让人望而生畏,它象一个很大的球,没有起点和终点。在读源代码的过程中,你会遇到这样的情况,当读到内核的某一部分时又会涉及到其它更多的文件,当返回到原来的地方想继续往下读时,又忘了原来读的内容。在internet上,很多人为此付出了很大的努力,制作出了源代码导航器,这为源代码阅读提供了良好的条件,站点为:,下面给出阅读源代码的一些线索。
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 syslogd 源码,syslogd 详解二
相关博文: syslogd 详解一 syslogd 详解三 1. 前言 上一篇博文中详细了分析了syslogd的架构,解析了syslogd的调用过程,以及syslog.conf 的详细使用方法,这一篇 ...
- linux mdadm 源码,mdadm详解
Part I. RAID基础(引用) RAID 是冗余磁盘阵列(Redundant Array of Inexpensive Disk)的简称.它是把多个磁盘组成一个阵列,当作单一磁盘使用.它将数据 ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...
- Android 源码编译详解【合集篇】
Android 源码编译详解[一]:服务器硬件配置及机型推荐 做 Android系统开发多年,开发环境都是入职就搭建好了,入职时拿个账号密码就直接开始搞开发了,年初换了新公司,所有的项目都是刚起步,一 ...
- Android四大组件之bindService源码实现详解
Android四大组件之bindService源码实现详解 Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 Android四大组件之bindServic ...
- linux下sort命令使用详解---linux将文本文件内容加以排序命令
转载自:http://www.cnblogs.com/hitwtx/archive/2011/12/03/2274592.html linux下sort命令使用详解---linux将文本文件内容加以排 ...
- linux下测试ftp传输,linux下ftp命令使用详解---linux文件传输ftp命令
linux下ftp命令使用详解---linux文件传输ftp命令 上一篇 / 下一篇 2010-12-18 09:15:35 / 个人分类:Linux ftp(file transfer proto ...
- Linux初始化内存盘黑屏,详解linux内存磁盘初始化技术.doc
详解linux内存磁盘初始化技术 详解linux内存磁盘初始化技术 /5502266.html 关键词: HYPERLINK "/tag/initrd" \n _blankinit ...
- jsp漂亮的登录界面源码_【案例+源码】详解MVC框架模式及其应用
案例+源码]详解MVC框架模式及其应用 写在开头: 首先我们需要知道,框架模式.模式.开发模式是三种不同的概念,但他们的目的都一样:解耦! 1.关于MVC框架模型 MVC是三个单词的缩写: M,Mod ...
- 使用Gin框架集成JWT,源码、详解、面试问题
使用Gin框架集成JWT,源码.详解.面试问题 一.什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). ...
最新文章
- BoneCP 学习笔记
- 互联网金融产品做第三方支付平台托管需要注意什么?
- Java对象的创建过程
- 手机客户端测试点(全)
- 托福试卷真题_托福反复考,反复不过百,你还不知道是谁的问题吗?
- 消费者行为分析_消费者行为分析-是否点击广告?
- 作品2:资源管理器EX(原味浏览图片)
- CCIE考试现在需要面试了
- 80多个Ajax解决方案
- devc 能优化吗_小网站能做seo优化吗?如何为小公司网站做seo优化?
- python ocr 识别 开源_OCR识别-python版(一)
- 安卓硬件模拟大师_安卓虚拟大师 可以手机运行免root带xp框架模拟器
- springboot 发送短信
- 嵌入式编程与PC编程有何区别
- 做个程序员到底好不好
- HashMap的底层原理你真的知道?
- 在只有一个网线的前提下,实现两个电脑之间的局域网通信(伽卡他卡电子教室通信)...
- Vim中如何全选复制粘贴
- 细致教程:从安装到实战手把手教你玩懂Nacos
- 如何判断网页是否更新??