Loading...
操作系统需要管理内存页的映射,即虚拟地址和物理地址的映射关系,一种简单的方法是一对一映射,管理起来也比较方便,申请的时候填写页表,释放的时候清空页表就可以了,但是这样就背离了我们引入虚拟地址的初衷。而若想使用乱序映射的映射方法,我们需要用某种数据结构来管理物理内存的使用情况。我们使用位图这种数据结构。位图所谓位图,其实就是一串连续的地址空间,常常表现为一个数组,其中每一位映射一个对象,这样就...
中断这个东西说起来不是很难,实现起来比较麻烦,主要是和硬件有一定联系,会略显复杂。宏观视角宏观地来看,一个中断的过程就是 CPU 接受中断信号,然后执行对应的处理函数。这里的中断分外部中断和内部中断两种。外部中断所谓外部中断,顾名思义就是外部设备产生的中断。CPU 中有两条型号线 INTR(INTeRrupt) 和 NMI(Non Maskable Interrupt)来接受外部中断信号。前...
昨天在看特权级相关的东西,看的云里雾里,没搞得很懂,考虑到短期之内不会弄得特别深,而且我们也用不上调用门,相关的较复杂的问题也应该不会碰到,所以准备暂时跳过。调用约定在说 sys_write 之前应该先说一下调用约定,我们的操作系统会使用 cdecl。由于我是打 PWN 的,对此调用约定相对还算熟悉,但是还是有学到新的东西cdecl 是由主调函数清理栈空间的,即调用压入的参数对栈产生的影响由...
到现在为止,我们已经进入了保护模式并做好了虚拟地址映射、开启了分页模式,loader 的历史使命也差不多该完成了,现在它需要来引导我们的内核并移交控制权了。内核较为复杂,全部用汇编实现显然是不现实的,类似于大多数的操作系统,我们使用 C 来完成开发。关于编译方式:高版本的 GCC 在编译代码的时候开启了许多优化和保护,我的虚拟机为 Ubuntu 20.04,gcc 版本为 9.0,难以生成我...
进入保护模式后,我们对内存的访问仍然是基于物理地址的,我们运行的程序,大多是希望自己有一段连续的地址空间的,这样方便寻址。如果使用物理地址来访问内存,就必须真的给每个进程都分配大段地连续物理内存空间,这可能造成内存碎片难以处理的问题。为了解决这个问题,可以引入分页模式(Paging mode),好处非常多,此处不再赘述,可以看 WIKI。直观地来看,分页模式做的就是将地址虚拟化,将物理地址以...