Linux内核结构详解教程
Linux内核模块讲解

29
内核模块的参数
声明一个数组参数: module_param_array(name,type,num,perm); name 数组的名子(也是参数名) type 数组元素的类型 num 是数组元素的个数,模块加载者拒绝比数组能放下的多的值。 2.6.9传递数组个数变量名,2.6.11传递数组个数变量的地址。 perm 是通常的权限值. 如果数组参数在加载时设置。
11
Linux的内核模块(相关命令)
内核模块的加载 #insmod module_name 内核模块的卸载 当我们不需要内核模块了,为了减少系统资源的开销,需要卸载时使 用命令 #rmmod module_name 或者 #modprobe –r module_name 查看系统已经加载的模块 #lsmod 查看系统已经加载的模块信息 #modinfo
操作系统的代码高度紧密,所有的模块都在同一块寻址空间内运行
2.
微内核(Micro kernel)
微内核本身只提供最基本的操作系统的功能,比如进程调度与消息传 递等 其他的功能由其独立的模块提供,每个独立的功能模块都可以是一个 进程。
当我们需要使用某个功能的时候,我们只需要在运行的操作系统里安 装这个模块,并且运行对应服务,当这个功能不再需要的时候,我们 可以停止这个服务,这样这个功能模块将不占据系统内存和处理器的 资源,而不会破坏当前的系统正常运
18
内核模块说明
写内核程序需要注意:
19
内核模块的makefile
obj-m := hello.o KERNELDIR := /lib/modules/2.6.20/build PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
Linux设备驱动程序原理及框架-内核模块入门篇

Linux设备驱动程序原理及框架-内核模块入门篇内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块内核模块介绍Linux采用的是整体式的内核结构,这种结构采用的是整体式的内核结构,采用的是整体式的内核结构的内核一般不能动态的增加新的功能。
为此,的内核一般不能动态的增加新的功能。
为此,Linux提供了一种全新的机制,叫(可安装) 提供了一种全新的机制,可安装) 提供了一种全新的机制模块” )。
利用这个机制“模块”(module)。
利用这个机制,可以)。
利用这个机制,根据需要,根据需要,在不必对内核重新编译链接的条件将可安装模块动态的插入运行中的内核,下,将可安装模块动态的插入运行中的内核,成为内核的一个有机组成部分;成为内核的一个有机组成部分;或者从内核移走已经安装的模块。
正是这种机制,走已经安装的模块。
正是这种机制,使得内核的内存映像保持最小,的内存映像保持最小,但却具有很大的灵活性和可扩充性。
和可扩充性。
内核模块内核模块介绍可安装模块是可以在系统运行时动态地安装和卸载的内核软件。
严格来说,卸载的内核软件。
严格来说,这种软件的作用并不限于设备驱动,并不限于设备驱动,例如有些文件系统就是以可安装模块的形式实现的。
但是,另一方面,可安装模块的形式实现的。
但是,另一方面,它主要用来实现设备驱动程序或者与设备驱动密切相关的部分(如文件系统等)。
密切相关的部分(如文件系统等)。
课程内容内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块应用层加载模块操作过程内核引导的过程中,会识别出所有已经安装的硬件设备,内核引导的过程中,会识别出所有已经安装的硬件设备,并且创建好该系统中的硬件设备的列表树:文件系统。
且创建好该系统中的硬件设备的列表树:/sys 文件系统。
(udev 服务就是通过读取该文件系统内容来创建必要的设备文件的。
)。
教你如何学习linux内核

教你如何学习linux内核毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件。
基本上,Linux 内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件。
对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都不过分。
我们去香港,通过海关的时候,总会有免费的地图和各种指南拿,有了它们在手里我们才不至于无头苍蝇般迷惘的行走在陌生的街道上。
即使在内地出去旅游的时候一般来说也总是会首先找份地图,当然了,这时就是要去买了,拿是拿不到的,不同的地方有不同的特色,只不过有的特色是服务,有的特色是索取。
Kconfig和Makefile就是Linux Kernel迷宫里的地图。
地图引导我们去认识一个城市,而Kconfig 和Makefile则可以让我们了解一个Kernel目录下面的结构。
我们每次浏览kernel寻找属于自己的那一段代码时,都应该首先看看目录下的这两个文件。
利用Kconfig和Makefile寻找目标代码就像利用地图寻找目的地一样,我们需要利用Kconfig和Makefile来寻找所要研究的目标代码。
比如我们打算研究U盘驱动的实现,因为U盘是一种storage设备,所以我们应该先进入到drivers/usb/storage/目录。
但是该目录下的文件很多,那么究竟哪些文件才是我们需要关注的?这时就有必要先去阅读Kconfig和Makefile文件。
对于Kconfig文件,我们可以看到下面的选项。
config USB_STORAGE_DATAFABbool "Datafab Compact Flash Reader support (EXPERIMENTAL)"depends on USB_STORAGE && EXPERIMENTALhelpSupport for certain Datafab CompactFlash readers.Datafab has a web page at </>.显然,这个选项和我们的目的没有关系。
电子科技大学 UNIX_Linux操作系统内核结构6章

一个进程的上下文包括五个方面: ①、被进程正文所定义的进程状态 ②、进程所使用的全局变量和数据结构的值 ③、机器寄存器的值 ④、进程表项proc结构和user结构中的值 ⑤、用户堆栈和核心堆栈中的值
“执行一个进程”——指系统在该进程的上下文中执行, 也就是进程的上下文确定和限制了进程的运行环境和空间。
可以随进程状态的变化而在内外存之间交换的进程控制信 息中的其余部分。
为了方便进程映像在内外之间交换,UNIX系统中把进程非 常驻内存部分作为一个整体,占用连续的存贮区,其顺序是: 首先是user结构(进程扩充控制块)和核心栈,然后是数据段 和用户栈。
16
进程user结构和核心栈合并构成进程的“本进程数据区— —ppda区(per process data area)。
15
在进程映像占用的内存被分配给其他进程之前,不但该进 程的程序和数据需要调出内存,该进程的控制信息也被调出内 存。但为了该进程能够再次被调入内存,内存中需要保留一部 分必要的信息,这就把进程控制信息也分成了常驻内存和非常 驻内存两部分: 常驻内存控制信息块
是系统需要经常查询以及恢复整个进程映象时所不可缺少 的信息。 非常驻内存控制信息块
7
3、进程的解释
在UNIX系统中进程的概念包含什么意义?
在较高级的方面 进程是一个重要的组织概念。可以把计算机系统看作是若
干进程组合的活动。进程是系统中活动的实体,它可以生成和 消灭,申请和释放资源,可以相互合作和竞争,而真正活动的 部件如处理机和外部设备则是看不见的。
在较低级方面 进程是不活动的实体,而处理机则是活动的,处理机的任
核心从一个进程转到另一个进程执行时,叫做“上下文切
换”,也就是系统从一个进程上下文确定的环境换到另一个进
linux分层设计体系结构

linux分层设计体系结构Linux是一种开源的操作系统,其设计采用了分层的体系结构。
这种设计使得Linux具有高度的灵活性和可扩展性,同时也方便了系统的维护和管理。
本文将详细介绍Linux的分层设计体系结构。
在Linux的分层设计中,最底层是硬件层。
硬件层包括计算机的各种硬件设备,如处理器、内存、硬盘、网络接口等。
Linux通过设备驱动程序来管理和控制这些硬件设备,使其能够与操作系统进行交互。
在硬件层之上是内核层。
内核是操作系统的核心,负责管理系统的资源和提供各种系统服务。
Linux的内核是一个单独的模块,可以独立于其他软件进行开发和维护。
内核提供了各种系统调用接口,以及对进程、文件系统、网络和设备的管理和控制功能。
在内核层之上是库层。
库是一组共享的代码和函数,可以为应用程序提供常用的功能和服务。
Linux提供了许多不同的库,如C库、数学库、网络库等。
这些库可以被开发人员用来开发应用程序,提高开发效率和代码复用性。
在库层之上是应用层。
应用层包括各种应用程序和工具,如文本编辑器、图形界面、网络浏览器等。
这些应用程序可以通过系统调用接口与内核进行交互,并利用库提供的功能来实现各种任务和操作。
除了以上四个层次外,Linux还有其他一些重要的组件和模块。
例如,系统初始化和启动过程中,会加载引导程序和初始化程序;文件系统是用来组织和管理文件和目录的;网络协议栈是用来实现网络通信的;系统服务是用来提供各种系统功能和服务的。
这些组件和模块与其他层次之间相互关联,共同构成了Linux的完整体系结构。
Linux的分层设计体系结构具有许多优点。
首先,分层设计使得系统的各个组件和模块之间相互独立,可以分别进行开发、测试和维护,提高了开发和维护效率。
其次,分层设计使得系统的各个层次之间的接口清晰明确,方便了系统的扩展和升级。
此外,分层设计还提高了系统的稳定性和可靠性,一旦某个层次出现问题,不会对其他层次造成影响。
Linux的分层设计体系结构是一种高效、灵活和可扩展的设计方式。
Linux内核数据结构之kfifo详解

Linux内核数据结构之kfifo详解本⽂分析的原代码版本: 2.6.24.4kfifo的定义⽂件: kernel/kfifo.ckfifo的头⽂件: include/linux/kfifo.h kfifo是内核⾥⾯的⼀个First In First Out数据结构,它采⽤环形循环队列的数据结构来实现,提供⼀个⽆边界的字节流服务,并且使⽤并⾏⽆锁编程技术,即当它⽤于只有⼀个⼊队线程和⼀个出队线程的场情时,两个线程可以并发操作,⽽不需要任何加锁⾏为,就可以保证kfifo的线程安全。
下⽂着重于代码剖析,各部分代码后⾯有关键点说明,同时可参考注释进⾏理解:struct kfifo {unsigned char *buffer; /* the buffer holding the data : ⽤于存放数据的缓存 */unsigned int size; /* the size of the allocated buffer : 空间的⼤⼩,在初化时将它向上扩展成2的幂,为了⾼效的进⾏与操作取余,后⾯会详解 */unsigned int in; /* data is added at offset (in % size) :如果使⽤不能保证任何时间最多只有⼀个读线程和写线程,需要使⽤该lock实施同步*/unsigned int out; /* data is extracted from off. (out % size) :⼀起构成⼀个循环队列。
in指向buffer中队头,⽽且out指向buffer中的队尾 */spinlock_t *lock; /* protects concurrent modifications :⽤于put和get过程中加锁防⽌并发*/}; 以上是kfifo的数据结构,kfifo主要提供了如下操作: //根据给定buffer创建⼀个kfifostruct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,gfp_t gfp_mask, spinlock_t *lock);//给定size分配buffer和kfifostruct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,spinlock_t *lock);//释放kfifo空间void kfifo_free(struct kfifo *fifo);//向kfifo中添加数据unsigned int kfifo_put(struct kfifo *fifo,const unsigned char *buffer, unsigned int len);//从kfifo中取数据unsigned int kfifo_get(struct kfifo *fifo,unsigned char *buffer, unsigned int len); //获取kfifo中有数据的buffer⼤⼩ unsigned int kfifo_len(struct kfifo *fifo);(1)初始化部分:/* 创建队列 */struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,gfp_t gfp_mask, spinlock_t *lock){struct kfifo *fifo;/* size must be a power of 2 :判断是否为2的幂*/BUG_ON(!is_power_of_2(size));fifo = kmalloc(sizeof(struct kfifo), gfp_mask);if (!fifo)return ERR_PTR(-ENOMEM);fifo->buffer = buffer;fifo->size = size;fifo->in = fifo->out = 0;fifo->lock = lock;return fifo;}/* 分配空间 */struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask, spinlock_t *lock){unsigned char *buffer;struct kfifo *ret;if (!is_power_of_2(size)) { /*判断是否为2的幂 */BUG_ON(size > 0x80000000);size = roundup_pow_of_two(size); /* 如果不是则向上扩展成2的幂 */}buffer = kmalloc(size, gfp_mask);if (!buffer)return ERR_PTR(-ENOMEM);ret = kfifo_init(buffer, size, gfp_mask, lock);if (IS_ERR(ret))kfree(buffer);return ret;}巧妙点①:保证buffer size为2的幂 通常循环队列⼊队和出队操作要不断的对size 进⾏求余,⼀般采⽤ mInOffset % size(其他类似) 的⽅法,但是乘、除和求余等会执⾏多次加法器运算,它们没有单纯的加法运算效率⾼,更没有位运算效率⾼。
Linux Kernel 0.11学习

(第一章)att汇编语法格式的笔记1寄存器引用寄存器引用要在寄存器号前加% 例如:mov %eax,%ebx2操作数顺序操作数排列是从源(左)到目的的(右) 例如:mov % eax(源),%ebx(目的)3 常数/立即数的格式使用立即数。
要在数前面加$,例如:mov $4,%ebx (变量前加$则表示该变量数值对应的地址);符号常数直接引用,如mov value,% ebx,引用符号地址在符号齐前加$,如mov $value,%ebx4 操作数长度操作数长度用加在指令后面的符号表示,b=byte(8bit) w=word(16bit) l=long(32bit),如movw %ax,%bx5跳转在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在 Intel 格式中则不需要。
6远跳转远程转移指令和远程子调用指令的操作码,在AT&T 汇编格式中为"ljump" 和"lcall",7远程返回指令8内存操作数的寻址方式计算方法是:base + index(索引)*scale(比例因子) + disp(偏移地址)例子:9 内嵌汇编9.1 内嵌汇编格式:_asm_("asm statements":outputs:intput:registers-modified);这四个字段的含义是:asm statements -是汇编语句表达式,AT&T 的结构, 每新行都是分开的。
outputs - 修饰符一定要用引号引起来, 用逗号分隔,输出的寄存器inputs - 修饰符一定要用引号引起来, 用逗号分隔,输入的寄存器registers-modified - 名字用逗号分隔,汇编代码会修改的寄存器outputs,inputs,register-modified都是可选参数,以冒号隔开,且一次以0~9编号,如outputs 的寄存器是0号,inputs寄存器是1号,往后依次类推。
linux操作系统的基本体系结构

linux操作系统的基本体系结构一、内核(Kernel)Linux操作系统的核心是内核,它负责管理系统资源、控制硬件设备、调度进程和提供基本的系统服务。
Linux内核采用单内核结构,包含了操作系统的大部分核心功能和驱动程序。
内核是操作系统的核心组件,它提供了操作系统运行所必须的基本功能。
Linux内核具有以下特点:1、多任务处理:Linux内核支持多任务处理,可以同时运行多个程序,并实现多个程序之间的切换和管理。
2、硬件管理:Linux内核负责管理硬件设备,与硬件设备交互,控制硬件设备的工作状态。
3、内存管理:Linux内核负责管理系统的内存,包括内存的分配、释放、映射和交换等操作。
4、文件系统:Linux内核支持多种文件系统,包括ext4、NTFS、FAT等,负责文件的读写、管理和保护。
5、进程管理:Linux内核管理系统进程,包括进程的创建、调度、挂起、唤醒和终止等操作。
6、网络通信:Linux内核支持网络通信功能,包括TCP/IP协议栈、网卡驱动等,实现网络数据传输和通信。
二、ShellShell是Linux操作系统的命令解释器,用户通过Shell与操作系统进行交互。
Shell接受用户的命令,并将其转换为对应的系统调用,最终由内核执行。
Linux系统中常用的Shell有Bash、Zsh等,用户可以根据自己的喜好选择不同的Shell。
Shell具有以下功能:1、命令解释:Shell接受用户输入的命令,并将其翻译为操作系统可以执行的命令。
2、执行程序:Shell可以执行各种程序、脚本和命令,包括系统工具、应用程序等。
3、环境控制:Shell可以设置环境变量、别名和路径等,帮助用户管理系统环境。
4、文件处理:Shell可以处理文件操作,包括创建、删除、复制、移动等。
5、脚本编程:Shell支持脚本编程,用户可以编写Shell脚本来自动执行一系列操作。
三、系统工具Linux操作系统提供了丰富的系统工具,帮助用户管理系统和执行各种任务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux内核结构详解教程─────Linux内核教程linux内核就像人的心脏,灵魂,指挥中心。
内核是一个操作系统的核心,它负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定着系统的性能和稳定性。
内核以独占的方式执行最底层任务,保证系统正常运行。
协调多个并发进程,管理进程使用的内存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等等.严格说Linux并不能称做一个完整的操作系统.我们安装时通常所说的Linux,是有很多集合组成的.应称为GNU/Linux.一个Linux内核很少1.2M左右,一张软盘就能放下.内容基础,语言简短简洁红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章及教程基本能满足不同水平的朋友学习。
红联Linux门户: 红联Linux论坛: /bbs红联Linux 论坛大全,所有致力点都体现在这/bbs/rf/linux/07.htm目录Linux内核结构详解Linux内核主要五个子系统详解各个子系统之间的依赖关系系统数据结构Linux的具体结构Linux内核源代码Linux 内核源代码的结构从何处开始阅读源代码海量Linux技术文章Linux内核结构详解发布时间:2006-11-16 19:05:29 Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。
Linux内核主要五个子系统详解发布时间:2006-11-16 19:05:54 1.进程调度(SCHED):控制进程对CPU的访问。
当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。
可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。
Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
2.内存管理(MM)允许多个进程安全的共享主内存区域。
Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。
必要时,操作系统负责在磁盘和内存间交换程序块。
内存管理从逻辑上分为硬件无关部分和硬件有关部分。
硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。
3.虚拟文件系统(VirtualFileSystem,VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。
虚拟文件系统可以分为逻辑文件系统和设备驱动程序。
逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
4.网络接口(NET)提供了对各种网络标准的存取和各种网络硬件的支持。
网络接口可分为网络协议和网络驱动程序。
网络协议部分负责实现每一种可能的网络传输协议。
网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
5.进程间通讯(IPC) 支持进程间各种通信机制。
处于中心位置的进程调度,所有其它的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。
一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。
例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被成功的发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。
其他子系统以相似的理由依赖于进程调度。
各个子系统之间的依赖关系发布时间:2006-11-16 19:06:20 进程调度与内存管理之间的关系:这两个子系统互相依赖。
在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。
进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。
虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK设备。
内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。
当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。
除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。
这些资源包括所有子系统都用到的过程。
例如:分配和释放内存空间的过程,打印警告或错误信息的过程,还有系统的调试例程等等。
系统数据结构发布时间:2006-11-16 19:06:52在linux的内核的实现中,有一些数据结构使用频度较高,他们是:task_struct.Linux内核利用一个数据结构(task_struct)代表一个进程,代表进程的数据结构指针形成了一个task数组(Linux中,任务和进程是相同的术语),这种指针数组有时也称为指针向量。
这个数组的大小由NR_TASKS(默认为512),表明Linux系统中最多能同时运行的进程数目。
当建立新进程的时候,Linux为新进程分配一个task_struct结构,然后将指针保存在task数组中。
调度程序一直维护着一个current指针,他指向当前正在运行的进程。
Mm_struct每个进程的虚拟内存由一个mm_struct结构来代表,该结构实际上包含了当前执行映像的有关信息,并且包含了一组指向vm_area_struct结构的指针,vm_area_struct结构描述了虚拟内存的一个区域。
Inode虚拟文件系统(VFS)中的文件、目录等均由对应的索引节点(inode)代表。
每个VFS索引节点中的内容由文件系统专属的例程提供。
VFS索引节点只存在于内核内存中,实际保存于VFS的索引节点高速缓存中。
如果两个进程用相同的进程打开,则可以共享inade的数据结构,这种共享是通过两个进程中数据块指向相同的inode完成。
Linux的具体结构发布时间:2006-11-16 19:07:17 所谓具体结构是指系统实现的结构。
Linux的具体结构类似于抽象结构,这种对应性是因为抽象结构来源于具体结构,我们的划分没有严格依照源代码的目录结构,且和子系统的分组也不完全匹配,但是,它很接近源代码的目录结构。
尽管前面的讨论的抽象结构显示了各个子系统之间只有很少的依赖关系,但是具体结构的5个子系统之间有高度的依赖关系。
我们可以看出,具体结构中的很多依赖关系并没有在抽象结构中出现。
Linux内核源代码发布时间:2006-11-16 19:07:44 目前,较新而又稳定的内核版本是2.4.x和2.6.x,因为版本不同稍有差别,因此如果你想让一个新的驱动程序既支持2.4.x,又支持2.6.x,就需要根据内核版本进行条件编译,要作到这一点,就要支持宏LINUX_VERSION_CODE,假如内核的版本用a.b.c来表示,这个宏的值就是216a+28b+c。
要用到指定内核版本的值,我们可以用KERNEL_VERSION宏,我们也可以自己去定义它。
对内核的修改用补丁文件的方式发布的。
Patch实用程序用来用来对内核源文件进行一系列的修改。
例如:你有2.2.9的源代码,但想移到2.2.10。
就可以获得2.2.10的补丁文件,应用patch来修改2.2.9源文件。
例如: $ cd /usr/src/linux $ patch -pl < patch-2.2.10Linux 内核源代码的结构发布时间:2006-11-16 19:08:05Linux内核源代码位于/usr/src/linux目录下。
/include子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。
/init 子目录包含了内核的初始化代码,这是内核工作的开始的起点。
/arch子目录包含了所有硬件结构特定的内核代码。
如:i386,alpha/drivers子目录包含了内核中所有的设备驱动程序,如块设备和SCSI设备。
/fs子目录包含了所有的文件系统的代码。
如:ext2,vfat等。
/net子目录包含了内核的连网代码。
/mm子目录包含了所有内存管理代码。
/ipc子目录包含了进程间通信代码。
/kernel子目录包含了主内核代码。
从何处开始阅读源代码发布时间:2006-11-16 19:08:23在Internet,有人制作了源代码导航器,为阅读源代码提供了良好的条件,站点为lxr.linux.no/source。
下面给出阅读源代码的线索:系统的启动和初始化:在基于Intel的系统上,当loadlin.exe或LILO把内核装入到内存并把控制权传递给内核时,内核开始启动。
关于这一部分请看,arch/i386/kernel/head.S,head.S进行特定结构的设置,然后跳转到init/main.c的main()例程。
内存管理:内存管理的代码主要在/mm,但是特定结构的代码在arch/*/mm。
缺页中断处理的代码在/mm/memory.c ,而内存映射和页高速缓存器的代码在/mm/filemap.c 。
缓冲器高速缓存是在/mm/buffer.c 中实现,而交换高速缓存是在mm/swap_state.c和mm/swapfile.c。
内核:内核中,特定结构的代码在arch/*/kernel,调度程序在kernel/sched.c,fork的代码在kernel/fork.c,内核例程处理程序在include/linux/interrupt.h,task_struct数据结构在inlucde/linux/sched.h中。
PCI:PCI伪驱动程序在drivers/pci/pci.c,其定义在inclulde/linux/pci.h。
每一种结构都有一些特定的PCI BIOS代码,Intel的在arch/alpha/kernel/bios32.c中。
进程间通信:所有的SystemVIPC对象权限都包含在ipc_perm数据结构中,这可以在include/linux/ipc.h中找到。
SystemV消息是在ipc/msg.c中实现。
共享内存在ipc/shm.c中实现。
信号量在ipc/sem.c中,管道在/ipc/pipe.c中实现。
中断处理:内核的中断处理代码几乎所有的微处理器特有的。
中断处理代码在arch/i386/kernel/irq.c中,其定义在include/asm-i386/irq.h中。
海量Linux技术文章发布时间:2006-11-15 11:32:55下面是linux技术文章快速入口。