问题描述
我正在用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位。