学习操作系统:自己动手写操作系统 ->chapter5_e Kernel的制作--VGA版本
前面的boot.asm和loader.asm
由于没有找到支持Windows的支持elf_i386的ld命令。所以本Kernel.bin是在Linux下编译的。
boot.asm
[BITS 32] ; 以32位编译
section .text
jmp start
global start
global io_hlt
global write_mem8
[EXTERN kernel_main] ; 内核入口函数, EXTERN表明此符号在外部定义
start:
cli ; 禁用中断
call kernel_main ; 调用内核入口函数
jmp $ ; 无限循环
io_hlt: ; void io_hlt(void);
HLT
RET
write_mem8: ; void write_mem8(int addr, int data);
MOV ECX,[ESP+4] ; [ESP+4]=> C语言传过来的第一个参数
MOV AL,[ESP+8] ; [ESP+8]=> C语言传过来的第二个参数
MOV [ECX],AL
RET
kernel.c
void io_hlt(void);
void write_mem8(int addr, int data);
int kernel_main()
{
int i;
for (i = 0xa0000; i <= 0xaffff; i++) {
;write_mem8(i, 15); /* MOV BYTE [i],15 */
write_mem8(i, i & 0x0f); /* MOV BYTE [i],15 */
}
for (;;) {
io_hlt();
}
}
link.ld
/***************************
* 文件名: link.ld
***************************/
ENTRY(start)
SECTIONS
{
. = 0x100000;
.text :
{
*(.text)
. = ALIGN(4096);
}
.data :
{
*(.data)
*(.rodata)
. = ALIGN(4096);
}
}
nasm -f elf boot.asm -o boot.o
gcc -m32 -c -o kernel.o kernel.c
ld -Ttext 0x30400 -T link.ld -m elf_i386 -nostdlib boot.o kernel.o -o kernel.bin
制作驱动文件
把boot.bin
loader.bin
kerlen.bin导入到img文件中
并把boot.bin设置为引导文件