使用qemu調(diào)試內(nèi)核啟動程序(匯編級)

概述

? ?? ? 最近在拜讀《inux內(nèi)核源碼剖析》一書,以下內(nèi)容皆為此書引出,為后續(xù)的閱讀做個鋪墊悬襟。

? ?? ? 本篇講述如何搭建與使用qemu對內(nèi)核啟動程序進(jìn)行匯編級別調(diào)試端仰,通過本篇可以了解如下內(nèi)容:

  • 使用qemu遠(yuǎn)程調(diào)試方式跟蹤系統(tǒng)啟動過程
  • gdb調(diào)試8086程序的方法

環(huán)境準(zhǔn)備

  1. ubuntu16
  2. 安裝qemu與編譯鏈接工具
apt get install qemu bin86

啟動鏡像制作

我們要實現(xiàn)系統(tǒng)啟動后,在啟動界面上打印hello world!
as86 匯編代碼如下:

;
; display "hello world" in the boot screen
;
.globl begtext, begdata, begbss, endtext, enddata, endbss

.text
begtext:
.data
begdata:
.bss
begbss:
.text

BOOTSEG = 0x07c0

entry start
start:
        jmpi go, BOOTSEG
go:
        mov ax, cs
        mov ds, ax
        mov es, ax
        mov cx, #16     ;顯示16個字節(jié)
        mov dx, #1804   ;
        mov bx, #0x000c ;字符為紅色
        mov bp, #msg1   ;字符串地址
        mov ax, #0x1301 ;BIOS中斷調(diào)用, 功能0x13, 子功能01
        int 0x10
loop0:  jmp loop0
msg1:   .byte 13, 10
        .ascii "Hello World!"
        .byte 13, 10
.org 510
        .word 0xAA55

.text
endtext:
.data
enddata:
.bss
endbss:

makefile如下

all:
        as86 -0 -a -o boot.o boot.s
        ld86 -0 -s -o boot boot.o

        dd bs=32 if=boot of=./boot_image skip=1

執(zhí)行make即可生成鏡像文件boot_image.

開始調(diào)試

啟動qemu

用qemu啟動鏡像文件,命令如下:

qemu-system-i386 -s -S -vnc :2 boot_image

其中-s是設(shè)置gdbserver的監(jiān)聽端口,-S則是讓cpu加電后被掛起作郭。

-s
? ? ? ? Shorthand for -gdb tcp::1234, i.e. open a gdbserver on TCP port 1234 (see gdb_usage).
-S
? ? ? ? Do not start CPU at startup (you must type ’c’ in the monitor).

啟動gdb

  1. 輸入gdb -q
  2. 連接gdb server target remote :1234
  3. 設(shè)置被調(diào)試環(huán)境架構(gòu) set architecture i8086
  4. 顯示將要執(zhí)行的匯編指令display /5i $cs * 0x10 + $pc
  5. 打斷點調(diào)試

? ?? ? qemu的 -S選項相當(dāng)于將斷點打在CPU加電后要執(zhí)行的第一條指令處,也就是BIOS程序的第一條指令弦疮。

first instruction

? ?? ?通過info reg命令看到夹攒,cpu加電后的寄存器值,cs值為0xF000, pc值為0xFFF0胁塞。

? ?? ?不要直接單步程序咏尝,加電后bios代碼先運行,運行完后將系統(tǒng)引導(dǎo)程序加載到內(nèi)存0x7c00開始的位置啸罢,之后跳轉(zhuǎn)到0x7c00處编检。
所以斷點應(yīng)打在0x7c00處。輸入continue扰才,程序停在斷點處≡识現(xiàn)在, 是不是看到了boot.s文件里的匯編指令衩匣?

breakpoint in boot

注意事項

  1. 匯編代碼每行必須要以回車結(jié)尾
    以回車結(jié)尾包括最后一行蕾总,否則as86會報錯(這個錯誤提示真讓人摸不著頭腦
as: error reading input
  1. 關(guān)于加電后第一條指令地址
    Intel手冊上寫了,上電后cpu加載的第一條指令的地址其實是0xFFFFFFF0琅捏,原文如下:

The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while in real-address mode. The
processor is initialized to this starting address as follows. The CS register has two parts: the visible segment
selector part and the hidden base address part. In real-address mode, the base address is normally formed by shifting the 16-bit segment selector value 4 bits to the left to produce a 20-bit base address. However, during a hardware reset, the segment selector in the CS register is loaded with F000H and the base address is loaded with FFFF0000H. The starting address is thus formed by adding the base address to the value in the EIP register (that
is, FFFF0000 + FFF0H = FFFFFFF0H).

只有在修改cs值后才會變成真正的實模式尋址

The first time the CS register is loaded with a new value after a hardware reset, the processor will follow the normal rule for address translation in real-address mode (that is, [CS base address = CS segment selector * 16]). To insure that the base address in the CS register remains unchanged until the EPROM based software-initialization code is completed, the code must not contain a far jump or far call or allow an interrupt to occur (which would cause the CS selector value to be changed).

總感覺還是沒說明白生百,應(yīng)該還有很多故事,有興趣的可以挖一下柄延。

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚀浆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜡坊,老刑警劉巖杠输,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赎败,死亡現(xiàn)場離奇詭異秕衙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)僵刮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門据忘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搞糕,你說我怎么就攤上這事勇吊。” “怎么了窍仰?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵汉规,是天一觀的道長。 經(jīng)常有香客問我驹吮,道長针史,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任碟狞,我火速辦了婚禮啄枕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘族沃。我一直安慰自己频祝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布脆淹。 她就那樣靜靜地躺著常空,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盖溺。 梳的紋絲不亂的頭發(fā)上漓糙,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音咐柜,去河邊找鬼兼蜈。 笑死,一個胖子當(dāng)著我的面吹牛拙友,可吹牛的內(nèi)容都是我干的为狸。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼遗契,長吁一口氣:“原來是場噩夢啊……” “哼辐棒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤漾根,失蹤者是張志新(化名)和其女友劉穎泰涂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辐怕,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡逼蒙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寄疏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片是牢。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陕截,靈堂內(nèi)的尸體忽然破棺而出驳棱,到底是詐尸還是另有隱情,我是刑警寧澤农曲,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布社搅,位于F島的核電站,受9級特大地震影響乳规,放射性物質(zhì)發(fā)生泄漏形葬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一驯妄、第九天 我趴在偏房一處隱蔽的房頂上張望荷并。 院中可真熱鬧,春花似錦青扔、人聲如沸源织。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谈息。三九已至,卻和暖如春凛剥,著一層夾襖步出監(jiān)牢的瞬間侠仇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工犁珠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留逻炊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓犁享,卻偏偏與公主長得像余素,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炊昆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350