基于X86的操作系统从头开始构建了用于学习目的
int 64发生,该INT需要门描述符才能升级构建操作系统(假设已安装了海湾合作委员会),
make在Qemu下运行
make qemu运行(假设安装了Bochs,安装了Bochs-SDL),
make run在QEMU下运行调试支持(GDB)
make qemu_gdb(附加GDB,在最高级别Dir中已提供的.gdbinit文件中已提供的必需命令)
BIOS以16位实际模式启动处理器,GRUB启动了32位保护模式。按GRUB规范提供了内核ELF图像,如果GRUB在图像的前512个字节中找到此标头,则它将ELF在0x100000位置加载,较低的内存属于BIOS,而其他硬件/IO映射(如VGA)。启动代码,从内核的_start入口点执行,并且(注释BSS已经由GRUB初始化为零),
简单的first-fit策略内存分配器,从内核空间分配内存,在free期间还可以管理相邻自由块的压实。
对于用户空间malloc/free,提供了内部使用的sbrk系统调用,以增加系统中断(如果需要)。内核确实需要页表设置和返回会增加系统中断限制。
将其分为内核空间内存映射和用户空间内存映射。内核空间映射保持恒定,并且是每个过程地址空间的一部分,仅链接未克隆,因为在内核空间中的一个过程也应可见其他过程。
用户空间映射取决于exec调用,并且每个过程都有其自己的内核和用户堆栈。
在上下文开关期间,CR3寄存器加载了当前流程页面目录基础地址,并且内部也使TLB无效(翻译LookAside Buffer)。
用户空间应用程序存储在initramfs中,这是标准精灵格式的CPIO格式拱门。在exec内核查找和解析ELF图像中,相应地设置其页面表。 Init进程仅启动shell ,然后永远挂在那里。
调度程序代表当前执行过程运行,主要在两种情况下
内核模式代码/数据段比用户模式代码/数据段相应地编程的用户模式代码/数据段。从例外返回时,硬件会从堆栈中弹出CS(代码段)和SS(堆栈段),以返回较低的特权级别。
我们在创建新任务时相应地对此堆栈框架进行编程,
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;X86硬件对任务切换具有内置支持,基本上是从用户堆栈切换到内核堆栈以及其他分割参数。为此,每个任务都需要使用自己的TSS进行设置,该TSS在上下文切换过程中进行了修改。我们不会使用硬件任务切换,而是在软件本身中也会使用相同的操作。在任何情况下,我们都需要设置具有有效内核模式SS(堆栈段)和ESP(堆栈指针)的最低tss,以进行当前任务。
随机常见问题解答
随意叉并发送合并请求