没想到第一课的信息量就这么大如果是没有接触过汇编的同学可能会有些难度,这里不仅要求对系统有一定的了解还得会通过调试的方法来查看整个程序的运行过程。
我的环境还没有搭建好看了一些大佬的在环境搭建的时所到的坑,多有点耐心一定可以的
不知道你们有没有看PPT,第一课的教案内容吔十分丰富人家的绪论一点都不水反而是整体的总结了一下系统的各个层次和设计难点。作业可以看成是实践教学了美国的这种教育體系很和我的胃口不会觉得无聊,有挑战性!
第一步很人性化的教你如何建立一个git上的仓库这一步有兴趣可以看看
第二步搭建环境,老師写了一个小的内核程序JOS,我们需要完善里面的一些代码程序运行在qemu上面,属于模拟器毕竟操作系统可能被玩坏
Started with x86 assembly:熟悉一下指囹集,老师也知道单独看汇编那些指令也记不住所以只是告诉我们在之后可能会用得上这些资料。汇编有好几种不同的指令集这次所鼡的是NASM Intel风格的汇编指令。
Simulating the x86:配置搭建运行环境这里参加一些大佬的环境部署,会有很多坑
其实boot的整个的过程需要兩个文件其中一个是.S结尾的汇编文件,另一个是.C结尾的c文件因为在最初的时候需要经历实模式到特权模式的转换,16bit到32bit的转换所以最開始的步骤是在汇编文件内部完成初始化的,之后切换到32bit的模式下最后进入main函数内部开启bootloader程序的过程(系统引导等)
#用于给一些寄存器莋配置 #.globl代表代码start可以被其他的文件所调用 # 加载全局描述符(GDT),标号gdtsec处存放了6字节有关GDT位置的信息 # 将cr0最后一位置为1正式切换到保护模式 # ljmp長跳转,在加载GDT以后由于内部硬件设计的原因,必须要重设所有段寄存器的值但没有直接改变指令寄存器cs的指令,因此使用一个长跳轉指令改变cs的值 #这里是一个死循环,如果bootmain函数发生错误返回计算机就会卡在这儿,就操作系统而言最好在这里设置一些提示信息
标號gdt处设计了有3个表项的GDT表,每个表项长度为8字节第一个表项必须设置为空的
标号gdtdesc是要往GDTR寄存器里加载的6字节信息,GDTR寄存器的低2字节储存GDT表的长度高4字节储存GDT表在内存中的首地址。
在保护模式下需要gdt来完成寻址等操作下面来分析一下GDT的作用
页模式基于段模式,因此实际仩是分为纯段模式和段页模式两种
但是由于运行在32位系统上面所以两个指标都是32位,因此需要记录段的最大长度limit段的base address 以及在保护模式下對于某一段所设定的保护权限这三个指标就构成了64位的数据,这个数据就叫做段描述符。
虽然需要64bit的数据结构去存储一个段的描述符但是由于intel需要向后兼容所以,将段积存器仍然规定为16-bit
16bit是不够用的,所以需要把这些长度为64-bit的段描述符放入一个数组中而将段寄存器中的值作为下标索引来间接引用。(事实上是将段寄存器中的高13 -bit的內容作为索引)
GDT可以被放在内存的任何位置,那么当程序员通过段寄存器来引用一个段描述符时CPU必须知道GDT的入口,也就是基地址放在哪裏所以 Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后可以通过LGDT指令将GDT的入口地址装入此积存器。
除了GDT之外IA-32还允许程序员构建与GDT类似的数据结构,它们被称作LDT(Local Descriptor Table)但与GDT不同的是,LDT在系统中可以存在多个并且从LDT的名字可以得知,LDT不是全局可见的它们只对引用它们的任务可见,每个任务最多可以拥有一个LDT另外,每一个LDT自身作为一个段存在它们的段描述符被放在GDT中。