在xv6内核中实现KASLR:需动态编译链接内核以支持重定位表
在xv6中实现KASLR:支持重定位的内核编译与链接方案
要给xv6内核加上KASLR,核心就是把原来硬编码地址的内核改成可重定位镜像,让加载器能在随机地址上修正所有符号引用。我帮你拆解具体实操步骤,都是适配xv6的落地方案:
1. 调整编译选项,生成带重定位信息的目标文件
xv6默认用-fno-pic生成绝对地址指令,得改成生成位置无关代码并保留重定位信息:
- 修改Makefile里的
CFLAGS,把-fno-pic换成-fPIC,再加-Wa,-mrelax-relocations=no(防止gcc优化掉重定位条目):CFLAGS = -fPIC -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -Wa,-mrelax-relocations=no - 链接阶段给
ld加--emit-relocs选项,强制生成重定位段(.rela.text、.rela.data等):LDFLAGS = -m elf_i386 --emit-relocs -T kernel.ld
2. 修改链接脚本,暴露重定位段与基地址符号
默认的kernel.ld把内核绑定到固定地址0x80100000,我们需要在脚本里定义关键符号方便启动时计算偏移,同时保留重定位段:
# 原链接基地址(xv6默认的固定地址) __link_base = 0x80100000; # 标记重定位段的起始与结束 __rela_start = .; .rela : { *(.rela.text) *(.rela.data) *(.rela.rodata) *(.rela.bss) } __rela_end = .; # 保留原有的.text、.data等段定义不变
3. 内核启动时添加重定位修正逻辑
这是核心步骤:在内核启动最早期(还没接触任何全局变量/绝对地址之前),计算实际加载地址和链接地址的偏移,遍历重定位段修正所有硬编码地址。
在entry.S最开头(页表初始化前)加这段汇编逻辑:
# 计算地址偏移量delta = 实际加载基地址 - 链接基地址 mov $__link_base, %eax # 链接时的固定基地址 mov $_start, %ebx # 实际加载的起始地址(_start是内核入口,由bootloader加载到随机位置) sub %eax, %ebx # delta = load_base - link_base # 遍历重定位段,逐个修正地址 lea __rela_start, %esi # 重定位条目起始地址 lea __rela_end, %edi # 重定位条目结束地址 reloc_loop: cmpl %edi, %esi jge reloc_done # 遍历完成,跳出循环 # 解析x86架构的.rela条目(3个4字节字段:r_offset, r_info, r_addend) movl (%esi), %ecx # r_offset:链接时的符号地址 addl %ebx, %ecx # 转换成实际加载后的地址 movl 4(%esi), %edx # r_info:重定位类型(我们只处理R_386_32类型) # 处理32位绝对地址重定位 cmpl $R_386_32, %edx jne skip_reloc addl %ebx, (%ecx) # 修正:把硬编码地址加上delta skip_reloc: addl $12, %esi # 移动到下一个重定位条目(每个条目12字节) jmp reloc_loop reloc_done:
4. 修复汇编代码中的绝对引用
xv6部分汇编代码(比如entry.S里的跳转)用了绝对地址,得改成相对寻址:
- 把
jmp main改成call main(x86的call默认是相对寻址); - 检查所有汇编文件里的
mov $symbol, %reg这类绝对指令,要么改成相对寻址,要么留着重定位阶段修正。
5. 适配页表初始化逻辑
原来的内核页表硬编码映射到0x80100000,现在要改成根据实际加载基地址动态计算:
- 在
vm.c的kvmmake函数里,把固定地址换成__link_base + delta(或直接用_start作为基地址),重新计算内核段的映射范围。
6. 测试KASLR功能
用QEMU测试时,可修改bootloader让它随机选择内核加载地址,每次启动后用gdb查看符号地址,确认每次都不同:
# 启动QEMU后连接gdb,查看main函数地址 (gdb) p &main # 多次启动,确认地址每次都变化
内容的提问来源于stack exchange,提问作者Nemo_Sol
相关产品推荐
相关产品推荐

