【Linux0.11代码分析】01 之 代码目录分析
系列文章如下:
系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》
.
1.《【Linux0.11代码分析】01 之 代码目录分析》
2.《【Linux0.11代码分析】02 之 bootsect.s 启动流程》
3.《【Linux0.11代码分析】03 之 setup.s 启动流程》
4.《【Linux0.11代码分析】04 之 head.s 启动流程》
从本文开始,我们来详细分析下,Linux0.11 的代码:
Linux 各版源代码下载地址:
官方下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/
清华大学开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/kernel/
http://www.oldlinux.org/Book-Lite/code-list/pdf/P-all.pdf
Linux0.11
的代码不多,下面我们一一来简单介绍下它的作用:
linux0.11
│ Makefile
├─boot
│ bootsect.s // 磁盘引导程序, 被bios启动子程序加载至0x7c00 (31k)处
│ head.s // 从绝对地址0x00000000开始运行的32位运行启动代码程序,后续将会被将页目录覆盖掉
│ setup.s // 负责从BIOS 中获取系统数据,并将这些数据放到系统内存的适当地方(0x90000-0x901FF)
├─fs // 【文件系统模块】
│ bitmap.c // 创建/释放inode节点,申请/释放block磁盘块
│ block_dev.c // block 块读写函数实现
│ buffer.c // 实现缓冲区高速缓存功能, 实现缓冲区读写函数,及队列操作方法
│ char_dev.c // char 字符设备操作方法实现
│ exec.c // 执行一个新的可执行程序,含解析环境变量和参数字符串函数
│ fcntl.c // 文件控制相关系统调用函数实现
│ file_dev.c // 文件读写函数实现
│ file_table.c // 定义file_table文件表数组
│ inode.c // inode 节点操作方法:获取/等待/上锁/解锁/释放/同步/读/写inode节点
│ ioctl.c // 定义 ioctl_table 操作函数指针表,实现sys_ioctl系统调用
│ Makefile // Makefile 含 编译规则,链接规则,依赖规则
│ namei.c // 检测文件证读写执行权限,查找/获取/打开/创建/删除文件目录项
│ open.c // 文件访问相关函数
│ pipe.c // 创建/读/写 操作函数实现
│ read_write.c // 文件读sys_lseek/sys_read/sys_wirte 定位,读,写 系统调用函数
│ stat.c // 获文件状态相关信息
│ super.c // super 超级块读写函数,卸载/挂载根文件系统
│ truncate.c // 释放指定i节点在设备上占用的所有逻辑块,包括直接块、一次间接块和二次间接块
├─include
│ │ a.out.h // a.out 头文件, 定义了a.out 执行文件格式和一些宏
│ │ const.h // 常数符号头文件, 目前仅定义了inode 节点中i_mode 字段的各标志位
│ │ ctype.h // 字符类型头文件。定义了一些有关字符类型判断和转换的宏
│ │ errno.h // 错误号头文件。包含系统中各种出错号。(Linus 从minix 中引进的)
│ │ fcntl.h // 文件控制头文件,用于文件及其描述符的操作控制常数符号的定义
│ │ signal.h // 信号头文件。定义信号符号常量,信号结构以及信号操作函数原型
│ │ stdarg.h // 标准参数头文件。以宏的形式定义变量参数列表
| | // 主要说明了一个类型(va_list)和三个宏(va_start, va_arg 和va_end),用于vsprintf、vprintf、vfprintf 函数。
│ │ stddef.h // 标准定义头文件。定义了NULL, offsetof(TYPE, MEMBER)
│ │ string.h // 字符串头文件。主要定义了一些有关字符串操作的嵌入函数
│ │ termios.h // 终端输入输出函数头文件。主要定义控制异步通信口的终端接口
│ │ time.h // 时间头文件,定义了标准时间数据结构tm 和一些处理时间函数原型
│ │ unistd.h // Linux 标准头文件。定义了各种符号常数和类型,并申明了各种函数
│ │ utime.h // 用户时间头文件。定义了访问和修改时间结构以及utime()原型
│ ├─asm
│ │ io.h // io 头文件。定义硬件端口输入/输出宏汇编语句
│ │ memory.h // 内存拷贝头文件。含有memcpy()嵌入式汇编宏函数
│ │ segment.h // 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数
│ │ system.h // 系统头文件。以宏的形式定义了许多有关设置或修改 描述符/中断门等的嵌入式汇编子程序
│ ├─linux
│ │ config.h // 内核配置头文件。定义键盘语言和硬盘类型(HD_TYPE)可选项
│ │ fs.h // 文件系统头文件。定义文件表结构(file,buffer_head,m_inode 等)
│ │ hdreg.h // 硬盘参数头文件。定义访问硬盘寄存器端口,状态码,分区表等信息
│ │ head.h // head 头文件,定义了段描述符的简单结构,和几个选择符常量
│ │ kernel.h // 内核头文件, 含有一些内核常用函数的原形定义
│ │ mm.h // 内存管理头文件, 含有页面大小定义和一些页面释放函数原型
│ │ sched.h // 调度程序头文件,定义了任务结构task_struct,初始任务0的数据,以及有关描述符参数设置和获取的嵌入式汇编函数宏语句
│ │ sys.h // 文件系统头文件。定义文件表结构(file,buffer_head,m_inode 等)
│ │ tty.h // tty 头文件,定义了有关tty_io,串行通信方面的参数、常数
│ └─sys
│ stat.h // 文件状态头文件,含有文件或文件系统状态结构stat{}和常量
│ times.h // 定义了进程中运行时间结构tms 以及times()函数原型
│ types.h // 类型头文件。定义了基本的系统数据类型。
│ utsname.h // 系统名称结构头文件
│ wait.h // 等待调用头文件。定义系统调用wait()和waitpid()及相关常数符号。
├─init
│ main.c // 内核主程序
├─kernel
│ │ asm.s // 【异常】包括大部分的硬件故障(或出错)处理的底层次代码
│ │ exit.c // 【进程调度模块】挂机waitpid/终止exit/杀死kill/发送sig信号/释放release等进程相关操作
│ │ fork.c // 【进程调度模块】复制创建子程序,含mem\寄存器拷贝等动作
│ │ mktime.c // 【时间】计算从1970年1月1日0日开始到当前的时间
│ │ panic.c // 【异常】内核崩溃处理函数
│ │ printk.c // 【日志】Printk 实现函数
│ │ sched.c // 【进程调度模块】调度程序相关函数 以及部分系统调用实现
│ │ signal.c // 【信号】signal 函数具体实现
│ │ sys.c // 部分系统调用函数实现
│ │ system_call.s // 【系统调用】(system-call)底层处理子程序
| | traps.c // 当出现硬件traps陷阱和faults错误时,会先调用asm.s保存当前状态,然后调用traps.c进行处理
│ │ vsprintf.c // 字符串格式化输出实现
│ ├─blk_drv
│ │ blk.h // 块设备头文件。定义请求数据结构、块设备数据结构和宏函数等信息
│ │ floppy.c // 软盘驱动
│ │ hd.c // 底层硬盘中断辅助程序。主要用于扫描请求列表,使用中断在函数之间跳转。
│ │ ll_rw_blk.c // 处理块设备的所有读/写操作
│ │ Makefile
│ │ ramdisk.c // ramdisk 虚拟盘驱动
│ ├─chr_drv
│ │ console.c // 控制台输入输出功能
│ │ keyboard.S // 键盘读操作
│ │ Makefile
│ │ rs_io.s // rs232 输入输出中断处理程序
│ │ serial.c // 实现rs232 的输入输出功能 以及与传输IO 有关系的所有中断处理程序
│ │ tty_io.c // tty 终端相关函数
│ │ tty_ioctl.c // tty 终端设备的ioctl 函数
│ └─math
│ Makefile
│ math_emulate.c // 该目录里应该包含协处理器数学仿真代码。目前仅产生一个信号
├─lib
│ close.c // 关闭文件函数 close(),直接调用了系统中断int 0x80,参数是__NR_close
│ ctype.c // 字符特性数组(表), 定义了各字符对应的属性,用于判断字符是控制字符(_C)、大写字符(_U)、小写字符(_L)等所属类型
│ dup.c // 复制文件描述符函数dup(), 直接调用了系统中断int 0x80,参数是__NR_dup
│ errno.c // 定义变量 int errno
│ execve.c // 加载并执行子进程(其它程序)函数execve(),直接调用了系统中断int 0x80,参数是__NR_execve
│ Makefile
│ malloc.c // Linux 的通用内核内存分配函数 malloc()
│ open.c // 打开文件函数, 调用了系统中断int 0x80,参数是__NR_open
│ setsid.c // 创建一个会话并设置进程组号, pid_t setsid()
│ string.c
│ wait.c // 等待进程终止系统调用函数 waitpid()
│ write.c // 写文件系统调用函数 write()
│ _exit.c // 程序(退出)终止函数_exit(), 直接调用系统中断int 0x80,功能号__NR_exit。
├─mm
│ Makefile
│ memory.c // 【内存管理模块】内存页管理核心程序
│ page.s // 包含底层页异常处理代码, 实际的工作在memory.c 中完成
└─toolsbuild.c