Linux内核完全注释:第二章 Linux内核体系结构
Linux内核体系结构
Linux内核模式
- 操作系统内核结构模式分为整体式的单内核结构和层次式的微内核结构。
- Linux0.11为单内核结构,后期的Linux一如既往的是单内核结构,但是其吸收了微内核结构的优点。
- 单内核结构中操作系统提供服务的流程为:
- int 0x80系统调用使CPU从用户态陷入内核态
- 根据参数值调用特定的系统调用服务程序
- 这些服务程序根据需要再调用底层的支持函数以完成特定的功能
Linux内核体系结构
上图为内核五大模块的依赖关系,其中所有模块都依赖于进程调度模块,原因如下:
因为所有模块都需要使用进程调度模块来挂起或重新运行他们的进程
另外虚拟文件系统也是Linux中很关键的思想:为何能做到一切皆文件呢?插入的U盘、鼠标、键盘等设备都可以看作文件,如何做到的这一点呢?就是通过虚拟文件系统!
Linux内核源代码的目录结构
- Linux:是主目录,里面包含一个makefile,用于检测哪个文件被修改过,从而指定文件编译
- boot:
- 从名字就能看出来,是引导启动程序
- 功能:加电时引导内核启动
- bootsect.s磁盘引导块程序,PC机加点ROM BIOS自检后,被BIOS加载到内存0x7c00出进行执行
- setup.s读取机器的硬件配置参数,并将内核模块system移动到适当的内存位置处
- head.s会被编译连接在system模块的最前部分,主要进行硬件设备的探测位置和内存管理页面的初始设置工作
- fs:文件系统
- 可以分为:高速缓存区管理、底层文件操作、文件数据访问、文件系统高层函数
- 所有对文件的访问都需要先读到高速缓存区里,管理高速缓存区的文件是buffer.c
- 缓存思想是计算机发展历史上少有的伟大思想
- include头文件主目录
- include下的头文件主要是给内核和用户程序使用
- asm存放与计算机硬件体系结构有关的文件
- linux存放linux专用的头文件
- sys存放文件状态、进程、系统数据类型等有关的头文件
- init内核初始化程序目录
- 该目录下只有一个main函数用于执行所有初始化工作,然后移动到用户模式创建新进程,并在控制台上运行shell程序
- main函数执行流程:根据机器内存设置缓冲区->硬件的初始化工作(包括人工创建第一个任务task0,并设置中断允许标志)->用户态->第一次调用fork,用于运行init(),在其中设置控制台环境->生成一个子进程来运行shell
- kernel内核程序:
- 仅仅举例示意一下:包括,系统硬件异常处理,进程中止的系统调用,fork,内核使用的时间函数,printk内核专用信息显示函数,sched.c调度,system_call.s系统调用的接口处理过程
- 子目录:blk_dev:
- 硬件数据块读写的底层驱动函数,软盘数据块的读写驱动函数
- 子目录chr_dev:
- 提供了对串行端口rs-232,tty,键盘和终端控制台设备的驱动
- tty字符设备的读写
- 串行接口的中断处理程序
- 异步串行通信芯片初始化
- 键盘中断处理过程
- 协处理器仿真
- math_emulate()是中断int7调用的c函数
- 当机器中没有数学协处理器,而CPU却执行了协处理器的指令时,就会引发该中断,从而实现仿真。
- 内核库函数lib
- 用于用户编程调用包括malloc,_exit,close(fd),dup(),open(),write(),execve(),wait()等待子进程状态,setsid()创建会话,以及所有在include/string.h中实现的所有字符串操作函数
- 内存管理程序目录mm:
- page.s包括内存页面异常中断处理程序
- memory.c包括内存初始化函数
- 编译内核工具程序tools:
- 用于将各个编译模块连接合并
如果觉得写的不错,对读者有帮助,可以给笔者点个赞,鼓励一下哦~