Linux 0.11学习

学习链接:sunym1993/flash-linux0.11-talk: 你管这破玩意叫操作系统源码 — 像小说一样品读 Linux 0.11 核心代码 (github.com)

1. 从开机到运行main.c的过程

在主板上写死的固件程序BIOS会将硬盘中启动的512字节的数据,复制到0x7c00的位置,并跳转到该位置执行;

然后将第一扇区中系统的代码全都复制到内存中去,由(head.s + others)编译得到 system 、由setup.s 编译得到 setup、bootsect.s 编译得到 bootsect,都从硬盘中复制到内存中去;

进入保护模式,设置分段、分页、中断的机制 (idtr 寄存器指向了 idt,这个就是中断的设置)(gdtr 寄存器指向了 gdt,这个就是全局描述符表的设置)(cr3 寄存器指向了页目录表的位置,这个就是分页机制的设置);

其中(中断的设置,就引出了 CPU 与操作系统处理中断的流程)、(分段和分页的设置,引出了逻辑地址到物理地址的转换);

最后引入 main 函数。

 

2. main.c的过程

划分内存,设置内存的边界值,通过 mem_init 函数对主内存区域用 mem_map[] 数组进行管理;

通过 buffer_init 函数,对缓冲区使用多种数据结构进行管理(使用map映射和双向链表);

通过trap_init 把中断描述符表的一些默认中断都设置好了,随后再由各个模块设置它们自己需要的个性化的中断(比如硬盘中断、时钟中断、键盘中断等);

通过 blk_dev_init 对读写块设备(比如硬盘)的管理进行了初始化,比如对硬盘的读写操作,都要封装为一个 request 结构放在 request[] 数组里,后面用电梯调度算法进行排队读写硬盘;

通过 tty_init 里的 con_init,实现了在控制台输出字符的功能,并且可以支持换行、滚屏等效果,(此处开启键盘中断,可以使用键盘进行输出);

初始化函数 shed_init,定义好了全部进程的管理结构 task[64] 数组,并在索引 0 位置处赋上了初始值,作为零号进程的结构体,将全局描述符表增添了 TSS 和 LDT,用来管理 0 号进程的上下文信息以及内存规划,将这两个结构的地址,告诉 tr 寄存器和 ldt 寄存器;

通过 time_init 开启定时器,以及设置了时钟中断,用于响应定时器每隔 100ms 发来的中断信号;

硬盘初始化 hd_init,为我们开启了硬盘中断,并设置了硬盘中断处理函数;一个 sti 汇编指令,意思是打开中断。其本质上是将 eflags 寄存器里的中断允许标志位 IF 位置 1。

(这样 CPU 就开始可以接收并处理中断信号了,键盘可以按了,硬盘可以读写了,时钟可以震荡了,系统调用也可以生效了!
这就代表着,操作系统具有了控制台交互能力,硬盘读写能力,进程调度能力,以及响应用户进程的系统调用请求! )

3. 

posted @ 2022-08-15 20:30  ouyang_wsgwz  阅读(126)  评论(0编辑  收藏  举报