by pascal4123(http://pascal4123.cublog.cn)
图2.8 Linux 内核源代码目录结构
linux
├─ boot 系统引导汇编程序
├─ fs 文件系统
├─ include 头文件(*.h)
│ ├─ asm 与CPU 体系结构相关的部分
│ ├─ linux Linux 内核专用部分
│ └─ sys 系统数据结构部分
├─ init 内核初始化程序
├─ kernel 内核进程调度、信号处理、系统调用等程序
│ ├─ blk_drv 块设备驱动程序
│ ├─ chr_drv 字符设备驱动程序
│ └─ math 数学协处理器仿真处理程序
├─ lib 内核库函数
├─ mm 内存管理程序
└─ tools 生成内核Image 文件的工具程序
注意3种地址空间的映射:进程虚拟地址,CPU的线形地址空间,实际物理内存地址
linux采用intel cpu的内存分页管理机制(1页4k物理内存),使用虚拟线形地址和实际物理地址映射的方法让同时执行的程序共同使用有限的内存。使用这种方法,每个执行中的程序可以使用比实际内存大得多的地址空间。
linux0.11虚拟地址空间是4G=64M*64, 每个任务(进程)有64M虚拟地址空间,最多64个任务.
每个虚拟地址空间,头部是代码区,紧接着数据区,尾部是堆栈区.
boot目录下有3个汇编文件,是内核源文件中最先被编译的程序。
主要功能是计算机上电时阴道内核启动,将内核代码加载到内存中,并作进入32位保护模式前的系统初始化工作。
bootsect.s,setup.s 需要as86来编译,使用的是as86汇编语言格式,head.s需要as编译,使用的是AT&T格式的汇编。
bootsect.s 磁盘引导块程序,编译后驻留在磁盘第一个扇区MBR。pc上电bios自检后,被bios加载到地址0x7c00处执行。
setup.s 读取机器的硬件配置参数,并把内核模块system移到合适的内存地址。
head.s 被编译连接在system模块的最前部分,做硬件探测工作,和内存管理的初始配置工作。
fs文件系统目录
包含了17个文件,诸如
buffer.c 对内存高速缓冲区的处理
file_table.c 定义了文件句柄
ioctrl.c 定义了io控制功能
exec.c exec函数簇
fcntl.c 文件i/o控制
open.c 修改,创建文件
char_dev.c 定义了字符设备读写函数
pipe.c 定义了管道读取
file_dev.c 文件读写函数
block_dev.c 块读写
truncate.c 删除文件时释放文件占用的设备空间
inode.c i节点操作
bitmap.c i节点和逻辑数据块
super.c 超级块
文件系统程序本身并不直接跟块设备的驱动打交道,而是通过高速缓冲区。
所有对文件系统中数据的访问,都需要首先读取到高速缓冲区.
include头文件主目录kernel目录下有12个代码文件
asm.s 处理系统硬件异常引起的中断,在中断处理过程中,分别调用traps.c的处理函数
exit.c 处理进程终止的调用
fork.c 使用了2个c函数:find_empty_process, copy_process
mktime.c 时间函数mktime()
panic.c 显示内核出错信息并停机
printk.c 内核专用打印函数printk
sched.c 调度
signal.c 信号处理
sys.c 很多系统函数
system_calls.c INT 0x80 调用的系统处理
vsprintf.c 字符串格式化函数
阅读(808) | 评论(0) | 转发(1) |