前段时间我就已经读完了《x86汇编语言:从实模式到保护模式》这本书,并且认真的读完了后半部分保护模式,各种概念已经理解清楚了,所以打算将学到的东西真正实现出来,作为巩固。

书中已经配套了一个小内核源码,而且是完全用汇编写的,但我肯定不能用汇编去写,我将采用C语言来实现相关功能。

实现的过程中除了会参考这本书之外,还会借鉴一些开源的内核代码,比如xv6等。

准备工作

写之前要有一些准备工作:

  1. Ubuntu
  2. Grub
  3. qemu

由于写一个Bootloader比较麻烦,所以我先采取用Grub做引导,这样我就能先关注内核更主要的部分。

Hello,World

这是Grub Multiboot规范的内核入口,当然,这段代码我是copy别人的,因为规范就是这样。

boot.s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[bits 32]
section .text
align 4
dd 0x1BADB002 ;magic
dd 0x00 ;flags
dd - (0x1BADB002 + 0x00) ;checksum. m+f+c should be zero

[GLOBAL start]
[extern kmain]

start:
cli
call kmain
hlt

这是内核入口,先写一个基本能用的打印函数。

Kernel.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void kwrite(char *str){

char *video = (char *)0xB8000;
unsigned int len = 0;
unsigned int i = 0;

while(str[len] != '\x00'){
video[i] = str[len];
video[i+1] = 0xc;
++len;
i = i + 2;
}
return;
}

int kmain(void){

kwrite("Hello,World!!!!");

return;


}

不过这个打印函数还不够通用,后面我会逐渐完善。