You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重新映射内核运行时(含栈、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:20:04