📁root
├─ 📄Makefile ## 根目录编译批处理文件
├─ 📁init ## 内核初始化程序
│ └─ 📄main.c
├─ 📁tools ## 生成内核 image 文件的工具程序
│ └─ 📄build.c ## 将各目录编译生成的代码连接成一个完整的进程内核文件 image
├─ 📁boot ## 系统引导汇编程序
│ ├─ 📄head.s ## 编译链接在内核模块最前面,用来对硬件设备进行探测以及内存管理页的初始化设置;
│ ├─ 📄setup.s ## 读取机器硬件配置参数的同时将内核模块移动至内存合适位置;
│ └─ 📄bootsect.s ## 磁盘引导块程序,编译后驻留在磁盘第一个扇区中;
├─ 📁lib ## 内核库函数,为初始化程序 init/main.c 执行在用户态进程提供调用支持
│ ├─ 📄execve.c ## 定义加载并执行子程序(其他程序)函数 execve()
│ ├─ 📄ctype.c ## 定义了字符类型用于判断字符所属类型
│ ├─ 📄Makefile
│ ├─ 📄errno.c ## 定义了出错号表量 errno
│ ├─ 📄string.c ## 由于所有操作都在 string.h 头文件中实现,因此只定义了 string.h 头文件
│ ├─ 📄_exit.c ## 提供 _exit() 程序退出终止函数
│ ├─ 📄setsid.c ## 定义 setsid() 函数
│ ├─ 📄malloc.c ## 定义了内存分配函数 malloc()
│ ├─ 📄wait.c ## 定义了 wait() 与 waitpid() 两个函数
│ ├─ 📄write.c ## 定义文件描述符写操作函数 write()
│ ├─ 📄dup.c ## 定义了创建文件描述符拷贝的函数 dup()
│ ├─ 📄open.c ## 定义了打开文件open()函数的系统调用
│ └─ 📄close.c ## 定义了文件关闭函数 close() 系统调用
├─ 📁mm ## 内存管理程序 管理程序对主内存区的使用
│ ├─ 📄page.s ## 包含内存页面异常中断处理程序
│ ├─ 📄memory.c ## 内存初始化及缺页异常时调用的函数
│ └─ 📄Makefile
├─ 📁fs ## 文件系统
│ ├─ 📄super.c ## 文件系统超级块的处理函数
│ ├─ 📄file_table.c
│ ├─ 📄buffer.c ## 高速缓冲区管理程序(所有对文件的访问与操作都会汇集在此程序中,底层调用块设备相关函数)
│ ├─ 📄pipe.c ## 管道读写函数以及创建的系统调用函数;
│ ├─ 📄exec.c ## 拥有所有 exec() 函数族的主要函数 do_exec();
│ ├─ 📄bitmap.c ## 用于处理文件系统中 i 节点和逻辑数据块的位图;
│ ├─ 📄Makefile
│ ├─ 📄file_dev.c ## 基于 i 节点和描述符结构的文件读写函数;
│ ├─ 📄inode.c ## 对文件系统 i 节点操作的函数;
│ ├─ 📄truncate.c ## 删除文件时释放文件所占用的设备数据空间;
│ ├─ 📄ioctl.c ## 字符设备的 io 控制功能;
│ ├─ 📄namei.c ## 目录以及文件名操作以及系统调用函数;9
│ ├─ 📄block_dev.c ## 程序包含块数据读及写函数;
│ ├─ 📄read_write.c ## 文件读、写及定位三个系统调用函数;
│ ├─ 📄stat.c ## 两个获取文件状态的系统调用
│ ├─ 📄fcntl.c ## 实现文件 I/O 控制的系统函数调用;
│ ├─ 📄open.c ## 实现修改文件属性、创建和关闭文件的系统调用函数;
│ └─ 📄char_dev.c ## 实现字符设备的读写函数;
├─ 📁include ## 头文件
│ ├─ 📄time.h ## 时间相关处理函数头文件
│ ├─ 📄utime.h ## 文件访问与修改时间头文件
│ ├─ 📄unistd.h ## 符号常数和类型头文件
│ ├─ 📄stddef.h ## c 标准定义头文件
│ ├─ 📄fcntl.h ## 文件控制选项头文件(主要定义了函数 fcntl() 和 open() 中使用的一些符号和函数)
│ ├─ 📄signal.h ## 信号相关头文件
│ ├─ 📄ctype.h ## 使用数组执行一些有关字符类型的判断和转换的宏
│ ├─ 📄errno.h ## 错误码常用变量
│ ├─ 📄termios.h ## 终端 I/O 接口定义头文件
│ ├─ 📄a.out.h ## 二进制执行文件格式
│ ├─ 📄stdarg.h ## 标准参数(arg)头文件
│ ├─ 📄const.h ## i 节点标志的常数定义
│ ├─ 📄string.h ## 字符串相关内嵌汇编操作函数头文件
│ ├─ 📁asm ## 与计算机硬件体系结构密切相关的头文件
│ │ ├─ 📄segment.h ## 操作段寄存器相关头文件
│ │ ├─ 📄io.h ## 硬件IO端口访问的头文件
│ │ ├─ 📄memory.h ## 只包含了一个复制内存数据的函数
│ │ └─ 📄system.h ## 设置或修改描述符/中断门等嵌入式汇编宏 头文件
│ ├─ 📁sys ## 与文件状态、进程、系统数据类型有关的头文件
│ │ ├─ 📄types.h ## 基本的数据类型头文件
│ │ ├─ 📄times.h ## 文件访问与修改时间结构 tms
│ │ ├─ 📄wait.h ## 进程等待信息的一些宏头文件
│ │ ├─ 📄stat.h ## 函数 stat() 返回的数据及其结构类型
│ │ └─ 📄utsname.h ## 系统名称结构头文件
│ └─ 📁linux ## 内核专用部分头文件
│ ├─ 📄head.h ## CPU 描述符的简单结构和指定描述符项号 头文件
│ ├─ 📄tty.h
│ ├─ 📄config.h ## 内核配置头文件(定义使用的键盘语言类型与硬盘类型可选项)
│ ├─ 📄mm.h ## 内存管理头文件
│ ├─ 📄hdreg.h ## 硬盘系统常用参数以及所使用的 IO 端口定义的头文件
│ ├─ 📄fdreg.h ## 软盘系统常用参数以及所使用的 IO 端口定义的头文件
│ ├─ 📄kernel.h ## 内核常用的函数原型头文件
│ ├─ 📄sys.h ## sys 系统调用函数原型以及系统调用函数数组头文件
│ ├─ 📄sched.h ## 调度程序头文件
│ └─ 📄fs.h ## 文件系统头文件
└─ 📁kernel ## 内核进程调度、信号处理、系统调用等部分处理
├─ 📄system_call.s ## 实现了系统调用的接口处理过程,实际过程则是其他函数中实现;
├─ 📄sched.c ## 包含了进程调度相关函数及一些简单的系统调用函数
├─ 📄sys.c ## 包括很多系统调用函数,其中有些还未实现
├─ 📄mktime.c ## 包含一个用于计算开机时间的时间函数 mktime();
├─ 📄fork.c ## 进程创建系统调用 sys_fork() 两个函数
├─ 📄traps.c ## 对硬件异常的实际处理流程
├─ 📄Makefile
├─ 📄printk.c ## 包含一个内核专用信息显示函数 printk()
├─ 📄exit.c ## 处理系统用于进程中止的系统调用
├─ 📄panic.c ## 包含一个用于显示内核出错信息并停机的函数 panic()
├─ 📄vsprintf.c ## 实现了以归入标准库中的格式化函数
├─ 📄asm.s ## 用于处理系统中由于系统硬件异常所引起的中断,实际调用 traps.c 中对应函数进行处理(intel保留中断 int0~int16)
├─ 📄signal.c ## 包含了有关信号处理的4个系统调用及一个在对应中断处理程序中处理信号的函数 do_signal()
├─ 📁math ## 数学协处理器仿真处理程序
│ ├─ 📄Makefile
│ └─ 📄math_emulate.c
├─ 📁chr_drv ## 字符设备驱动程序
│ ├─ 📄serial.c ## 异步串行通信芯片 UART 进行初始化,同时设置两个端口的中断向量
│ ├─ 📄tty_ioctl.c ## 实现了 tty 中的 io 控制接口以及对 termio[s]终端io结构的读写函数
│ ├─ 📄Makefile
│ ├─ 📄rs_io.s ## 用于实现两个串行端口的中断处理程序
│ ├─ 📄console.c ## 控制台初始化程序及控制台写函数,用于被 tty_io 程序调用
│ ├─ 📄keyboard.S ## 实现了键盘中断处理过程
│ └─ 📄tty_io.c ## 实现了对 tty 设备的读写函数,为文件系统提供上层访问接口
└─ 📁blk_drv ## 块设备驱动程序
├─ 📄blk.h ## 块设备程序专用头文件
├─ 📄ramdisk.c ## 实现对内存虚拟设备进行读写
├─ 📄Makefile
├─ 📄ll_rw_blk.c ## 实现低层块设备的读写函数(内核中所有程序都是通过这个程序对块进行访问的)
├─ 📄floppy.c ## 实现对软盘数据块的读写底层驱动函数
└─ 📄hd.c ## 主要实现对硬盘数据块进行读写的底层驱动函数
- 通用寄存器
- 数据寄存器:ax, bx, cx, dx
- 每个可拆分 高低两个8位 寄存器空间,如 ax 可分为 高8位寄存器 ah 与 第八位寄存器 al;
- 不可对段寄存器直接赋值,需要先将值存入 通用寄存器,再复制到 段寄存器中;
- 指针寄存器
- SP:堆栈指针;
- BP:基数指针;
- 变址寄存器
- 对代码段进行移动时使用(cx 存储计数值);
- SI:源地址,在代码移动时与 DS (源基准地址)结合,作为移动代码源地址偏移量;
- DI:目的地址,在代码移动时与 ES (目标基准地址)结合,作为移动代码目标地址偏移量;
- 数据寄存器:ax, bx, cx, dx
- 段寄存器
- CS:代码段寄存器;
- DS:数据段寄存器;
- SS:堆栈段寄存器;
- ES:附加段寄存器;
- CR0 控制寄存器
- 中断相关
- iret 中断返回(从内核态转换为用户态)
- sti 开启中断
- cli 禁用中断
- int 开启指定中断
- 其他命令
- nop 执行空语句
- clts 清 cr0 的 Ts 标志位
- std 方向位置位
- rep 重复下一语句知道 dx 计数器值为 0 (每次执行 di --,方向位置位后 di ++)
- repne 重复执行下一语句判断,直到判断语句为相等 (每次执行 di --,方向位置位后 di ++)
- scasb 对比 al 与 di 中的值
- 全局描述符表操作
- ltr 命令,将 _TSS 任务表中对应加载到任务寄存器
- lldt 命令,将 _LDT 局部描述符表中对应项加载到 局部描述符寄存器
- str 命令,将任务寄存器中 TSS 段选择符赋值到指定寄存器中
- 运算命令
- and 位且
- or 位或
- xor 位异或
- shr 比特位右移,高位使用 0 填充
- 跳转命令
- 后缀
- b是byte的意思,意味着操作数大小为1字节,相当于c语言的char类型;
- w是word的意思,意味着操作数大小为2字节;
- l是long的意思,意味着操作数大小为4字节,相当于c语言的long int类型;
-
嵌入汇编
/*asm(“汇编语句” : 输出寄存器 : 输入寄存器 : 会被修改的寄存器);*/ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name));
-
除第1行以外,后面带冒号的行若不使用就都可以省略。其中,”asm”是内联汇编语句的关键词;”汇编语句”是你写汇编指令的地方;
-
”输出寄存器”表示当这段嵌入式汇编执行完之后,哪些寄存器用来存放输出数据,这些寄存器会分别对应一C语言表达式值或一个内存地址;
-
”输入寄存器”表示在开始执行汇编代码时,这里指定的一些寄存器中应存放的输入值,它们也分别对应着一C变量或常数值;
-
”会被修改的寄存器”表示你已对其中列出的寄存器中的值进行了改动,gcc编译器不能再依赖于它原先对这些寄存器加载的值。如果必要的话,gcc需要重新加载这些寄存器。因此我们需要把那些没有在输出/输入寄存器部分列出,但是在汇编语句中明确使用到或隐含使用到的寄存器名列在这部分;
-