欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

内核初始化kernel.asm

发布时间:2025/6/15 编程问答 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 内核初始化kernel.asm 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

内核的初始化大体上是要重新建立GDT,然后建立IDT表,加载好TSS选择子。此时就可以用c语言写代码了,跳到初始化程序,开始进程的初始化了。

GDT表格最初在loader里面临时建立了一个,但是此时换了执行环境,内核还是用在自己地址空间的数据比较好。作者是在cstart函数中重新建立GDT,顺带初始化了IDT表。

重建GDT

sgdt将原有gdtr寄存器的值保存到全局变量里面,然后将dgt表的内容复制到新的gdt数组中去,将gdtr中的关于新的GDT表基址和大小重新设置一番在用lgdt指令加载一下就可以了。

建立IDT表,对于idtr的初始化和gdtr类似,都是填入表格的基址和大小再重新加载一下便可。不过IDT表中的内容不像GDT一样可以直接复制过来,还需要一条条添加。无非也就是一些中断和异常的处理函数。作者对于intel规定的前十多个异常都是直接按照这个异常有无错误码,分别压栈调用自己写的一个打印函数,将错误打印出来。然后再对8259A占用的中断号都绑上对应的处理程序,这也是系统响应外界的接口。IDT表中的描述符指定的段选择子都是内核代码段,4G空间。

作者还顺带在这里初始化了TSS描述符和每个进程结构体里的LDT选择子,这个选择子将来要被用来加载进ldtr中,指向GDT表中的该进程对应的一项,被相应的任务用来寻址。在前面说过,当CSTI位为1的时候指明要在LDT中寻址。这也是自己之前一直没能将LDT和实际运行的某一个任务切实联系起来的地方。虽然嘴上一直念叨着CS作为选择子在GDT或者LDT中索引相应段的描述符,但是一到实际代码中,还是犯嘀咕,怎么就从一个任务的LDT中切到另一个任务的LDT中了。还是CS的作用的没有搞明白,如果TI1,那么CPU自动从ldtr寄存器中取出该任务所要LDTGDT中的下标,然后转到LDT中用CS再索引任务需要的段。

初始化完成后,加载TSS段选择子,然后就跳到kernel_main函数里面去了。Kernel_main函数就是对进程的初始化了,或者说在本次实验中是对任务的初始化。

哎呀,这么一看,内核做的事情还真没有多少呢。确实,用的是微内核,很多东西都提出到内核外部作为一个操作系统模块实现的。

总结

以上是生活随笔为你收集整理的内核初始化kernel.asm的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。