如何重新映射内核运行时(含栈、GDT、EFI服务等)?
内核运行时全量重映射的实现疑问
我正在编写一个小型内核,已经实现虚拟内存功能,参考x86_64的内存映射规则定义了内存布局。现在想完成整个运行时环境的重新映射(包括内核段、栈、EFI运行时服务等),但缺少相关理论支撑,希望得到帮助。
已实现的基础功能
我已经完成物理页到虚拟地址的映射函数:
void mapMemory(void* virtualMemory, void* physicalMemory)
同时定义了描述内存区域的结构体:
struct region { void * base; uint64_t size; };
目前可以实现单个内存区域的重映射,比如处理somebuffer这样的区域:
uint64_t address = (uint64_t)somebuffer.base; uint64_t size = somebuffer.size; uint64_t index = 0; for (uint64_t i = address; i < (address+size); i += 0x1000) { mapMemory((void*)(OFFSET+index), (void*)i); index += 0x1000; } // 手动修正指针 somebuffer.base = (void*)OFFSET;
操作后仍能正常访问somebuffer,但不知道如何将这个逻辑扩展到整个运行时环境。
我的初步思路
- 栈:通过内嵌汇编给
rbp和rsp加上偏移量 - 内核:修改GDT中的条目
- 内核:修改段寄存器并执行远跳转
内容的提问来源于stack exchange,提问作者Tretorn
相关产品推荐
相关产品推荐

