Skip to content

Latest commit

 

History

History
192 lines (179 loc) · 11.6 KB

README.md

File metadata and controls

192 lines (179 loc) · 11.6 KB

Linux 0.11版本注释学习笔记

目录结构与备注

📁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 (目标基准地址)结合,作为移动代码目标地址偏移量;
  • 段寄存器
    • 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类型;

c语言

  • 嵌入汇编

    /*asm(“汇编语句”
             : 输出寄存器
             : 输入寄存器
    : 会被修改的寄存器);*/
    __asm__ volatile ("int $0x80" \
    	: "=a" (__res) \
    	: "0" (__NR_##name)); 
    • 除第1行以外,后面带冒号的行若不使用就都可以省略。其中,”asm”是内联汇编语句的关键词;”汇编语句”是你写汇编指令的地方;

    • ”输出寄存器”表示当这段嵌入式汇编执行完之后,哪些寄存器用来存放输出数据,这些寄存器会分别对应一C语言表达式值或一个内存地址;

    • ”输入寄存器”表示在开始执行汇编代码时,这里指定的一些寄存器中应存放的输入值,它们也分别对应着一C变量或常数值;

    • ”会被修改的寄存器”表示你已对其中列出的寄存器中的值进行了改动,gcc编译器不能再依赖于它原先对这些寄存器加载的值。如果必要的话,gcc需要重新加载这些寄存器。因此我们需要把那些没有在输出/输入寄存器部分列出,但是在汇编语句中明确使用到或隐含使用到的寄存器名列在这部分;