自定义 x86 内核访问 char* 的 C 函数给出随机值
C function of custom x86 kernel accessing char* gives random value
我正在用 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 位。
我正在用 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 位。