VGA驱动set_char_in_mem函数无法读取字符串索引值求助
解决方案
问题核心是字符串常量的存储地址与保护模式下的内存映射不匹配:
- 字符串常量
"this works ?"默认被编译器放在只读数据段(.rodata),如果没有正确配置链接脚本,编译器会生成基于虚拟地址0的偏移,而你的内核被加载到物理地址0x1000,保护模式下访问该虚拟地址会指向物理地址0,而非内核所在的0x1000区域,导致读取到错误的内容(大概率是0,所以无显示)。 - 常量字符
'a'是直接嵌入到代码中的立即数,不涉及内存地址读取,因此能正常工作。
修复方案(任选其一)
方案1:将字符串改为数组形式
把字符串定义改为数组,强制存储在可写数据段,确保和内核代码一起加载到正确位置:
char s[] = "this works ?";
方案2:添加链接脚本指定内核地址
创建linker.ld链接脚本,明确内核各段的加载起始地址为0x1000:
ENTRY(kernel_entry) SECTIONS { . = 0x1000; .text : { *(.text) } .data : { *(.data) } .rodata : { *(.rodata) } .bss : { *(.bss) } }
编译时指定链接脚本:
ld -T linker.ld -m elf_i386 k_ent.o kernel.o -o kernel.bin
方案3:手动修正字符串地址
如果不想修改链接脚本,可手动将字符串的虚拟偏移转换为物理地址:
#include <stddef.h> extern char __executable_start[]; char* s = (char*)(0x1000 + ("this works ?" - __executable_start));
验证
修改后,启用print_s("this works ?")或者直接调用set_char_in_mem(c, offset),即可正常显示字符串内容。
内容的提问来源于stack exchange,提问作者skeleg
相关产品推荐
相关产品推荐

