WangFuJie Blog

路在脚下,心向远方

自制操作系统 - 内核堆内存管理与用户内存映射

内核对内存管理与用户内存映射

之前实现的内存分配以页为单位一次分配的太大,因此本文将实现内核堆内存的管理,可申请指定大小的内存。在内核内存中,我们只使用了前8M,在进入用户态后需要进行用户内存映射,用户内存映射原理和内核一致,区别是每次使用内存可以申请内存映射,将虚拟地址映射为一个物理地址,使用完毕后可释放映射。

自制操作系统 - 用户态打印printf

自制操作系统 - 用户态打印printf

进入用户态后,内核态的打印函数printk就不能再使用了,因此需要实现用户态的打印函数printf。打印时需要控制台的功能console_wrote,因此需要通过系统调用write来实现。

自制操作系统 - 进入用户模式

进入用户模式

用户态和内核态的特权级不同,intel将特权级分为0~3,内核运行在0特权级,用户运行在3特权级,特权级的切换需要依赖任务状态段TSS完成。我们使用 TSS 的主要作用是利用其中的 ss0 和 esp0,使得用户态的程序可以转到内核态,不会使用TSS进行硬件任务切换。

自制操作系统 - 键盘驱动

键盘驱动

键盘中断时8259a芯片的1号中断,中断向量为0x21。当键盘按键时,需要处理0x21中断,获取按下的扫描码,根据不同的扫描码进行处理,例如字符就打印。目前使用键盘都是第二套扫描码,但是内部会被8042转换为第一套扫描码,因此第一套不存在的扫描码就属于扩展码。

自制操作系统 - multiboot2引导

multiboot2引导

Multiboot2是一个协议标准,GRUB 是这个协议的实现,在linux中一班时钟grub引导操作系统,而不是我们自己写的bootloader。使用grub引导需要遵循grub的规范来进行内核的一些列初始化