我有一个内核,要启动我正在使用命令qemu-system-i386 -kernel kernel.bin.有没有办法创建可引导的磁盘映像来启动qemu-system-i386 -cdrom CD.iso?
我使用这些命令在linux中编译的代码:
nasm -f elf32 kernel.asm -o kernelasm.o
gcc -m32 -c kernel.c -o kernelc.o
ld -m elf_i386 -T link.ld -o kernel.bin kernelasm.o kernelc.o
Run Code Online (Sandbox Code Playgroud)
然后启动 qemu-system-i386 -kernel kernel.bin
代码:kernel.asm:
[BITS 32]
SECTION .text
align 4
dd 0x1BADB002
dd 0x00
dd - (0x1BADB002 + 0x00)
global start
global keyboard_handler
global read_port
global write_port
global load_idt
extern kmain
extern keyboard_handler_main
read_port:
mov edx, [esp + 4]
in al, dx
ret
write_port:
mov edx, [esp + …Run Code Online (Sandbox Code Playgroud) 我试图在没有任何CRT库的Windows上创建简单的程序.
我有两个代码:
// compile without -lkernel32
int __stdcall _main() {
return 5;
}
Run Code Online (Sandbox Code Playgroud)
和
// compile with -lkernel32
#include <windows.h>
void __stdcall _main() {
ExitProcess(5);
}
Run Code Online (Sandbox Code Playgroud)
我用这个bash脚本用MinGW-w64 7.1.0编译它们:
@echo off
del main.exe 2>nul
C:\Users\Michal\Downloads\mingw64\bin\g++ main.cpp -o main.exe -O3 -s -nostdlib -lkernel32
main.exe
echo %errorlevel%
pause
Run Code Online (Sandbox Code Playgroud)
输出(退出代码)是相同的.(我使用的是Windows 7 Pro 64位)
什么代码更好?(也许更好的问题是:为什么"返回"变体有效?)
编辑:
程序的入口点(默认由链接器预先设置)是_main(通常CRT lib执行一些工作然后调用'main'函数并使用main函数返回的值调用ExitProcess(或类似的东西)).
在我的代码中,我没有使用CRT库,_main仍然是程序的入口点(并没有调用'main'函数).