學習linux-0.11核心——搭建環境(編譯、除錯bootsec)
阿新 • • 發佈:2019-02-09
前言
本博文是本專欄博文的起點,通過本文的學習,通過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.