PMM
1.1 什么是PMM?
PMM(Physical Memory Manager)是操作系统内核中负责对物理内存进行页级管理的子系统,通过维护内存分配状态(如位图、链表等),为内核及其他子系统提供物理页的分配与回收能力,是虚拟内存管理(VMM)的基础。
1.2 介绍
muxOS 首先从multiboot获取内存信息,然后从物理内存起始分配页(4kb/页),大约在512页处分配第一页,取决于 _kernel_end 的位置。PMM内部由bitmap单元管理(8页/bitmap),同时,1MB到_kernel_end前的bitmap标记占用。
例如
bitmap 0x00000001 -> 表示bitmap单元第一个bit被分配
第一次调用
pmm_alloc()返回_kernel_end之后第一个空闲页的物理地址
muxOS 提供一些基础函数用来操作 PMM
1 |
|
关于 PMM 的介绍,请参考 内存分配 - OSDev 维基
VMM
2.1 什么是VMM?
是操作系统中负责 虚拟地址到物理地址转换 的核心模块
VMM(Virtual Memory Manager,虚拟内存管理器) 是操作系统中负责:
管理虚拟地址空间,并实现虚拟地址到物理地址映射的核心模块。
2.2 介绍
muxOS 当 VMM 初始化时,虚拟地址 0x00000000–0x00FFFFFF(前 16MB)对应的页表项标志为 PAGE_PRESENT | PAGE_WRITE(值后缀 0x3),不含 PAGE_USER,用户态(ring 3)访问会触发 #PF。通过 pd_idx < 4 的判断,告诉虚拟地址 0x01000000 起始,含 PAGE_USER(值后缀 0x7),用户进程可访问。
关于 VMM 的介绍,请参考 内存分配 - OSDev 维基
键盘驱动
3.1 介绍
muxOS 键盘驱动通过 IRQ1(中断向量 0x21)处理键盘输入。pic_init() 已解除 IRQ1 屏蔽(outb(0x21, 0xFD)),每次按键时 CPU 跳转到 irq1_handler。中断处理流程:
从端口
0x60读取扫描码(scan code)若扫描码为
0x2A(左 Shift)或0x36(右 Shift),设置shift_pressed = 1;若为0xAA或0xB6(释放 Shift),清零根据
shift_pressed选择shift_map或scancode_map,将扫描码转换为 ASCII 字符调用
kb_buf_push(c)将字符推入环形缓冲区发送 EOI(
outb(0x20, 0x20))通知 PIC 中断处理完毕 muxOS
muxOS提供一些基础函数操作键盘缓冲区
1 | // keyboard.h |
关于键盘驱动的介绍,请参考 键盘 - OSDev 维基