1.
下載grub-0.97源程序解壓縮,進入到docs目錄。找到boot.S kernel.c
multiboot.h這三個文件,就是我們的試驗對象。原理可以搜索多重引導規(guī)范multiboot,在grub的official site可以找到。有不清楚的過程可以和我聯(lián)系(msn及郵件都是這個:jinglexy at yahoo dot com dot cn)作者:http://www.shnenglu.com/jinglexy上海體育館
2.
建立testos.lds鏈接腳本:
1 OUTPUT_FORMAT("elf32-i386") 2 ENTRY(start) 3 virt = 0x100000; /* 1 meg */ 4 phys = 0x100000; /* 1 meg */ 5 SECTIONS 6 { .text virt : AT(phys) 7 { code = .; 8 *(.text) 9 . =
ALIGN(4096); 10 } 11 .data : AT(phys + (data - code)) 12 { data = .; 13 *(.data) 14 . =
ALIGN(4096); 15 } 16 .bss : AT(phys + (bss - code)) 17 { bss = .; 18 *(.bss) 19 *(COMMON) 20 . = ALIGN(4096); 21 } 22 end = .; 23 } 24 |
3.
建立Makefile編譯腳本:
1 all: 2 gcc - 3 gcc - 4 ld kernel.o
boot.o -T testos.lds -o testos.bin 5 sudo mount -o
loop ./floppy.img mnt 6 sudo rm -f
mnt/boot/testos.bin 7 sudo install
./testos.bin mnt/boot 8 ls mnt/boot 9 sudo umount mnt 10 sudo sync 11 |
4.
運行make指令編譯,生成testos.bin文件。這樣就是我們的”kernel_demo”,放到virtual pc 2007中運行一下(現(xiàn)在這個軟件已經免費了,可以到微軟官方網站下載),是不是程序打印的結果呢?(將內核testos.bin拷貝到安裝了grub的軟盤過程請參考這個博客的前面一篇文章,有不清楚的地方可以一起討論一下哦)
5.
疑問:如果將虛擬地址改為0xc0000000,grub裝載kernel時會打印“Selected
item cannot fit into memory”,這個是什么緣故? 答案:剛剛看了mlxos內核源程序,大致的猜想是:grub初始化cs和ds為0到
movl $(stack + STACK_SIZE - 0xc0000000), %esp
其他的類似。