从零构建内核:第一个进程

“内核”上成功运行了第一个进程。本文只涉及最基础的进程概念,主要探讨进程的要素和从高特权级跳转低特权级的方法。可以预告的是后面将紧接着进行多进程实验。

从零构建内核:局限

内核设计中有些部分是野路子,目的只有一个:简(tou)单(lan).不优雅的代码给目前的内核带来了一些局限(不过这些局限对目前的内核却没什么影响:P).写此博文,提醒自己,以及便于以后扩展.

从零构建内核:分页

进入C语言后,程序直接运行在物理地址之上。为了学习和利用x86提供的分页机制,今天为内核设置分页。设置流程大概是:

  • 检测内存大小,决定页表多少
  • 初始化页目录项和页表项
  • 配置cr0和cr3寄存器

从零构建内核:进入C语言

总体思路

结合自身状况,C语言可以令我更流畅地编写操作系统,所以我匆匆准备了C语言的运行环境(C run time),尽可能早地投入C语言的怀抱。loader本应该负责的工作是:进入保护模式,设定分页,设定段描述符,设定中断,加载内核,最后跳转到内核并执行。而我在这里只完成了保护模式的加载,设定了必要的段和栈。反正能用C语言就行,后面可以用C优雅地增加设定或者重新设定。

Build Modules For A Precompiled Kernel(Copyright © 2001 Peter Jay Salzman)

Obviously, we strongly suggest you to recompile your kernel, so that you can enable a number of useful debugging features, such as forced module unloading (MODULE_FORCE_UNLOAD): when this option is enabled, you can force the kernel to unload a module even when it believes it is unsafe, via a rmmod -f module command. This option can save you a lot of time and a number of reboots during the development of a module.