1. 程式人生 > >學習linux-0.11核心——搭建環境(編譯、除錯bootsec)

學習linux-0.11核心——搭建環境(編譯、除錯bootsec)

前言

本博文是本專欄博文的起點,通過本文的學習,通過qemu虛擬機器將linux-0.11核心跑起來,有了這個可以跑的核心,在有疑問的地方,我們就可以通過除錯的方式來學習核心。

編譯核心

獲取核心程式碼

git clone https://github.com/jmhIcoding/linux_kernel12.git
git checkout check

其中 linux_kernel12的目錄結構為:

·
|
|————source_code  原始linux-0.11程式碼,裡面有vs2015的工程檔案,可以方便的看程式碼
|
|----source_code_att 修改後的linux-0.11程式碼,裡面的src中bootsec.s,setup.s,head.s使用AT&
T格式編寫,負責生成linux核心 image

安裝必要軟體包

apt-get install qemu-system-i386 make gdb 

編譯核心

cd source_code_attr
make
make start

即可看到從qemu啟動linux-0.11

 . http://bochs.sourceforge.net
 . http://www.nongnu.org/vgabios

cirrus-compatible VGA is detected

QEMU BIOS - build: 05/08/09
$Revision$ $Date$
Options: apmbios pcibios eltorito rombios32

ata1 master: QEMU DVD-ROM ATAPI-4 CD-Rom/DVD-Rom

Press F12 for
boot menu. Booting from Floppy... Loading system ... Ram disk: 1049600 bytes, starting at 0x400000 Loading 1048576 bytes into ram disk... done 10/1024 free blocks 286/341 free inodes 3446 buffers = 3528704 bytes buffer space Free mem: 11533312 bytes === Ok. [/usr/root]# ll

核心除錯方法

cd source_code_att

使用帶除錯引數的命令從qemu啟動映象:

make debug

可以發現 qemu 處於stoped狀態,等待著gdb的接入。

另外開啟一個終端,輸入:gdb 開啟gdb
在gdb裡面輸入:
在gdb裡面通過file命令可以載入相應的符號表檔案,例如kernal.sym,bootsect.sym等

(gdb)file ~/home/jmh/linux_kernel12/source_code_att/src/boot/bootsect.sym  #==>載入Bootsec程式碼
(gdb)target remote localhost:1234
(gdb)br *0x07c00   #===>在0x07c00加上斷點,當eip=0x7c00即停下,然後我們就可以開始除錯bootsec了,因為bios已經將bootsec共512位元組拷貝到0x7c00.
(gdb)continue 

執行的結果:

(gdb) file boot/bootsect.sym
Reading symbols from boot/bootsect.sym...done.
(gdb) pwd
Working directory /home/jmh/linux_kernel12/source_code_att/0.11.
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000fff0 in ?? ()
(gdb) break 0x7c00
Function "0x7c00" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) break *0x7c00
Breakpoint 1 at 0x7c00
(gdb) c
Continuing.

Breakpoint 1, 0x00007c00 in ?? ()
(gdb)

可以看到系統停在了7c00處,
我們輸入ni 進入下一條指令:

(gdb) ni
48              mov     $BOOTSEG, %ax
(gdb) l
43      # ROOT_DEV:     0x000 - same type of floppy as boot.
44      #               0x301 - first partition on first drive etc
45              .equ ROOT_DEV, 0x301
46              ljmp    $BOOTSEG, $_start
47      _start:
48              mov     $BOOTSEG, %ax
49              mov     %ax, %ds
50              mov     $INITSEG, %ax
51              mov     %ax, %es
52              mov     $256, %cx

可以看到開頭的程式碼。
以此即可一步步的除錯,觀察OS.