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

VGA驱动set_char_in_mem函数无法读取字符串索引值求助

解决方案

问题核心是字符串常量的存储地址与保护模式下的内存映射不匹配:

  1. 字符串常量"this works ?"默认被编译器放在只读数据段(.rodata),如果没有正确配置链接脚本,编译器会生成基于虚拟地址0的偏移,而你的内核被加载到物理地址0x1000,保护模式下访问该虚拟地址会指向物理地址0,而非内核所在的0x1000区域,导致读取到错误的内容(大概率是0,所以无显示)。
  2. 常量字符'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:34:50