自定义x86内核访问char *的C函数给出随机值

问题描述

我正在用C语言为x86编写自定义内核。每当我尝试从char*访问值时,我都会得到一个随机值。

void test(char input[]) {
    char* video_memory = (char*) 0xb8000;
    *video_memory = input[0];
}

void main() {
    test("ba");
}

似乎我应该打印'b',但是它给出了一些随机符号。

与此相同

void test() {
    char* video_memory = (char*) 0xb8000;
    char* val = "ba";
    *video_memory =  val[0];
}

void main() {
    test();
}

但不是这个

void test() {
    char* video_memory = (char*) 0xb8000;
    *video_memory =  "ba"[0];
}

void main() {
    test();
}

最后一个很好用。

我在做什么错了?

编辑: 这是我设置堆栈的方法

[BITS 32]
init_pm:                       
    mov ax,DATA_SEG        
    mov ds,ax
    mov ss,ax
    mov es,ax
    mov fs,ax
    mov gs,ax

    mov ebp,0x90000       
    mov esp,ebp               
    
    call BEGIN_PM

BEGIN_PM:
    call KERNEL_OFFSET    
    jmp $

解决方法

解决了!问题根本与我的代码无关,而与我生成二进制文件的方式有关。

我的原始方法:

gcc -ffreestanding -c kernel.c kernel.o
nasm kernel_entry.ASM -f elf64 -o kernel_entry.o
ld -o kernel.bin -T linker.l kernel_entry.o kernel.o --oformat binary
nasm -f bin -o bootloader_s1.bin bootloader_s1.ASM
cat bootloader_s1.bin kernel.bin > os-image

我的新方法:

gcc -m32 -fno-pie -ffreestanding -c kernel.c kernel.o
nasm kernel_entry.ASM -f elf -o kernel_entry.o
ld -m elf_i386 -o kernel.bin -T linker.l kernel_entry.o kernel.o --oformat binary
nasm -f bin -o bootloader_s1.bin bootloader_s1.ASM
cat bootloader_s1.bin kernel.bin > os-image

我相信这是因为当我的代码以32位运行时,我将其编译为64位。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...