学习操作系统:自己动手写操作系统 ->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设置为引导文件

学习操作系统:自己动手写操作系统 ->chapter5_e Kernel的制作--VGA版本

执行

学习操作系统:自己动手写操作系统 ->chapter5_e Kernel的制作--VGA版本