【Linux0.11代码分析】01 之 代码目录分析
从本文开始,我们来详细分析下,Linux0.11 的代码,
通过它来重点学习下进程调度模块
,内存管理模块
,文件系统模块
,进程间通信模块
及驱动管理模块
的核心理念。
Linux 各版源代码下载地址:
官方下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/
清华大学开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/kernel/
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
│ │ sched.c
│ │ signal.c
│ │ sys.c
│ │ system_call.s
│ │ vsprintf.c
│ ├─blk_drv
│ │ blk.h
│ │ floppy.c
│ │ hd.c
│ │ ll_rw_blk.c
│ │ Makefile
│ │ ramdisk.c
│ ├─chr_drv
│ │ console.c
│ │ keyboard.S
│ │ Makefile
│ │ rs_io.s
│ │ serial.c
│ │ tty_io.c
│ │ tty_ioctl.c
│ └─math
│ Makefile
│ math_emulate.c
├─lib
│ close.c
│ ctype.c
│ dup.c
│ errno.c
│ execve.c
│ Makefile
│ malloc.c
│ open.c
│ setsid.c
│ string.c
│ wait.c
│ write.c
│ _exit.c
├─mm
│ Makefile
│ memory.c
│ page.s
└─tools
build.c
附分析代码过程中遇到的问题:
Vscode 打开 GB2312格式代码显示乱码
永久解决办法:
如下图,进入设置,配置 Encoding 为 GB2312格式即可: