2015.1.20
目标: 看完赵炯的《linux内核完全注释》,尝试自己在x86下写一个简单的OS,然后移植网卡驱动,实现基本网络功能(ping)
bootloader:这部分有很多可以参考,主要的功能应该是:加载后面的setup.s文件做准备。
--编译工具:AS86和LD86
--源文件名:boot.s
代码:
; 功能:
; 1. 拷贝 boot.s 从 0x07c0:0000 到 0x9000:0000
; 2. 加载 setup.s 到内存 0x9020:0000
;boot.s代码必须存放在磁盘的第一个扇区,且大小不能超过512字节。
;bios在每次启动后都会加载第一扇区内容到0x07c0:0000内存地址处
entry _start
_start:
;当前cpu还处在16bits 实模式,只能访问0000:0000到ffff:ffff范围大小的地址
;把0x7c00:0000地址起 512 bytes 拷贝到 0x9000:0000,然后继续执行
;源地址
mov ax, #0x07c0
mov ds, ax
;目的地址
mov ax, #0x9000
mov es, ax
;清si和di
sub si, si
sub di, di
;拷贝256次,每次2个字节
mov cx, #256 ;
rep
movw
;拷贝完后可以跳到 0x9000:go地址继续执行下面的代码了
jmpi go, 0x9000
go:
;执行跳转指令后cs段的内容自动刷新为0x9000.
mov ax, cs
[boot.s 待续]
;刷新ds,es,ss段寄存器为0x9000
mov ds, ax
mov es, ax
mov ss, ax
;临时设置sp堆栈指针为:0x9000:ff00以便后面的函数调用
mov sp, #0xff00