0.1.2 内存管理
处理器中的内存管理单元(MMU)将CPU访问的虚拟地址转换为物理地址。LoongArch架构中的MMU支持两种地址转换模式:直接地址翻译模式和映射地址翻译模式。MaQueOS采用映射地址翻译模式进行虚拟地址到物理地址的转换。映射地址翻译模式又分为直接映射地址翻译模式和页表映射地址翻译模式。当MMU处于映射地址翻译模式时,会优先选择直接映射地址翻译模式,若无法应用直接映射地址翻译模式,则选择页表映射地址翻译模式。
MaQueOS在内核态下采用直接映射地址翻译模式,为内核态下的虚拟地址空间0x9000000000000000~0x9000FFFFFFFFFFFF和物理地址空间0x0~0xFFFFFFFFFFFF建立一一映射。例如,在内核态下,CPU访问虚拟地址0x9000000000200000时,MMU将该虚拟地址转换为物理地址0x200000。
MaQueOS在用户态下采用页表映射地址翻译模式。MaQueOS中的页表映射使用二级页表结构。二级页表结构中的页目录(PD)、页表(PT)及物理页(PG)的大小都为4KB。其中,页目录的起始物理地址存放在PGDL寄存器中,页表的起始物理地址存放在页目录项(PDE)中,物理页的起始物理地址存放在页表项(PTE)中。MMU在进行虚拟地址到物理地址的转换时,需要将64位的虚拟地址分为页目录项索引、页表项索引和页内偏移3个部分。其中,页目录项索引用于在页目录中定位页目录项,页表项索引用于在页表中定位页表项,页内偏移用于在物理页中定位虚拟地址转换到的物理地址。
对于物理内存,MaQueOS支持128MB物理内存进行申请和释放。物理内存以页为单位进行申请和释放,页的大小为4KB。因此,128MB的物理内存总共包括128MB÷4KB=32768个物理页。MaQueOS实现了两个接口函数:get_page函数和free_page函数,其中get_page函数用于申请一个空闲物理页,free_page函数用于释放一个物理页。在MaQueOS中,使用一个char型数组mem_map记录所有32768个物理内存页的状态。若mem_map数组中某项的值为0,则表示该项对应的物理页空闲;若值为1,则表示该项对应的物理页被占用。