loader完成加载内核

第五章:保护模式进阶,向内核迈进。
参考书籍:《操作系统 真象还原》 作者:郑钢
这一章的内容有点硬,回头再看,还好。前五章,也是本书的第一部分。
本章,分三部分:获取内存容量,启动分页功能,加载内核。


1、获取内存容量

利用BIOS中断0x15子功能0xe820,获取内存。
类似与函数调用。下面给出输入输出参数。(具体见书上,代码及解释见书上)
(放一张图片好看些,充实点,没有什么卵用哈)
loader完成加载内核_第1张图片loader完成加载内核_第2张图片

2、启动分页机制

2.1 首先为什么需要分页机制?

loader完成加载内核_第3张图片上图很明显的说出了问题。如果按照整个段放入,此时,放不进去~
方法一:将进程C停一下,整合到上面,这样空间便足够了。似乎能行,但不够好。麻烦了些。
方法二:将咱们的进程D,分成两部分,便可以放入内存。
方法二,听着不错,但是这样便打断了段的特性。包括段地址:偏移地址,查找内存的方法。也不利于程序员的思维。
所以,需要如果有一种方法,能将线性地址,映射到物理地址。这样,线性地址连续,物理地址可以不连续,这样便能解决问题。
而这个方法,便是分页。(下面直接给出二级叶表,不清楚的可以去书上先看一级页表)
1024 * 1024 * 4k=4G。所以这是咱们的最大访存范围(符合32根地址线)
loader完成加载内核_第4张图片

2.2 如何通过分页机制,查找到内存

loader完成加载内核_第5张图片

2.2 为什么说是“启动内存分页机制”

因为当中,有一部分被做成硬件了————页部件,这样更快。(见上图)
所以,我们需要干的事情就少了些(硬件和软件相互配合)。
我们需要干的事情:

  1. 创建页目录表(写入页表头的信息)
  2. 创建页表(写入与真实内存的映射关系)
  3. 将页目录的地址写入CR3寄存器。
    具体的实现过程:见书上。

2.3分页和分段的总结(important)

1、首先,段是逻辑上的概念(便于程序员,连续)。我们使用段的时候,使用的是选择子,16位。(eg: selector equ (0x0001<<3) + TI_GDT + RPL0)。所以高13,决定了,我们要全局描述符中的哪一段。
2、有了段之后,便可以分页映射了。段地址: 偏移地址=线性地址,进过分页映射,便指向(不一定连续的)内存。

3 加载内核

首先,我们的内核文件是elf格式。(不是一个纯纯的二进制格式)。
具体的信息看书上。当然,我们可以查看/usr/include/elf.h 文件,但是直接看,有点diffcult。
我们需要做的事情,比较简单。

  1. 从硬盘中将内核文件加载到内存中。
  2. 从内存中,提取出可以直接执行的二进制信息。
    下面仅仅给出目前的内存使用情况,具体信息,见书上。
    loader完成加载内核_第6张图片

4、最重要的部分:代码

整个代码在github上,有点长,我不列出来:https://github.com/da1234cao/tiny-os/tree/master/chapter5/load-kernel
里面的loader.asm在调用硬盘函数时候,有错,但是我改不出来,不会bochs的调试。
里面的loader_new.asm可以正确运行。
我也仅仅是能看懂代码,写不出来。
整体代码,我给出大的逻辑。每一步的实现,见书上。

loader完成加载内核_第7张图片


参考文章:https://blog.csdn.net/q1007729991/article/details/52829235
吐槽下:pro3上面用linux,不舒服。
比如:wifi有时不能使用,需要重启。用笔在kolourprint上画草图,屏幕亮度忽亮忽暗。OneNote,我windows么有用过。

下面分享下这两天看到的其他内容:
对硬盘进行分区时,GPT和MBR有什么区别
GitHub开源项目《The Art of Command Line(命令行的艺术)》
陶行知

你可能感兴趣的:(操作系统,真象还原)