Bochs调试Linux内核5 - 启动过程调试 - 认识Bootsect.S
?
先參閱?Bochs調(diào)試Linux內(nèi)核 - 定位內(nèi)核中的變量或數(shù)據(jù)結(jié)構(gòu)_bcbobo21cn的專欄-CSDN博客??????
,運(yùn)行到<bochs:1>,輸入vbreak 0x0000:0x7c00,再輸入c,執(zhí)行到0x00007c00停住;?
這個(gè)時(shí)候mov ax,0x7c0指令正好是linux啟動(dòng)程序bootsect.S的第一個(gè)有效指令,
(在bootsect.S中為 start:mov ? ?ax,#BOOTSEG);
說明BIOS在執(zhí)行到0x7c00的時(shí)候,把控制權(quán)轉(zhuǎn)移到了linux啟動(dòng)程序了;
Linux 啟動(dòng)程序包括三個(gè)文件。他們分別是:
Bootsect.S ,setup.S,head.s,他們都是由匯編寫成的,這三個(gè)程序按一定的順序執(zhí)行各自不同的功能能來完成整個(gè)從引導(dǎo)到啟動(dòng)的整個(gè)過程;
啟動(dòng)順序是:BIOS--Bootsect.S--setup.S--head.s---main.c
Bootsect.S代碼是磁盤引導(dǎo)塊程序。它的主要功能是:
1)把自己移到內(nèi)存絕對(duì)地址0x90000的開始處,并跳到那里執(zhí)行,也就是地址0x9000:0x0000處;
2)用13號(hào)BIOS中斷來讀磁盤的從第2個(gè)扇區(qū)開始的連續(xù)4個(gè)扇區(qū)內(nèi)的內(nèi)容,這部分內(nèi)容就是setup程序模塊,然后把這個(gè)內(nèi)容放到bootsect緊接的后面。也就是地址0x90200.為什么是0x90200呢?后面要說道;
3)把system模塊讀到內(nèi)存0x10000地方。這個(gè)system模塊大小必須小于0x90000-0x10000=0x80000 也就是512k字節(jié);
? ? 然后反匯編從現(xiàn)在開始的10條指令;
?
? ? 到0x00007c11的幾條指令是把ds:[offset]開始的內(nèi)容復(fù)制0x0100個(gè)字到es:0000開始的內(nèi)存空間內(nèi)。也就是從0x7c00處復(fù)制256字到0x9000.這就把bootsect搬家到了0x9000:0000地方了。長(zhǎng)度是256個(gè)字,也就是 0x0200個(gè)字節(jié)。這就是為什么bootsect的后面是0x90200;?
需要復(fù)制0x0100個(gè)字,cx是計(jì)數(shù)寄存器,把0x0100放入來cx中;
sub si, si:sub是減法指令,自己減自己,就是把si清零來;然后把di清零;
es是附加段寄存器;復(fù)制的目標(biāo)是0x9000;把0x9000放入ax, 再把a(bǔ)x的值放入es;立即數(shù)不能直接放入段寄存器,參閱使用emu8086學(xué)習(xí)匯編mov指令_bcbobo21cn的專欄-CSDN博客;??????
,然后是rep指令;rep指令功能如下,
rep指令常和串傳送指令搭配使用
功能:根據(jù)cx的值,重復(fù)執(zhí)行后面的指令
串傳送指令的說明如下;
串傳送指令1: movsb
功能:(以字節(jié)為單位傳送)
(1) ((es)×16 + (di)) = ((ds) ×16 + (si))
(2) 如果DF = 0則: ? (si) = (si) + 1
? ? ? ? ? ? ? ? ? ? ? ? ? (di) = (di) + 1
? ? ?如果DF = 1則: ? ?(si) = (si) - 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(di) = (di) - 1
串傳送指令2:movsw
功能:(以字為單位傳送)
(1) ((es)×16 + (di)) = ((ds) ×16 + (si))
(2) 如果DF = 0則: ? (si) = (si) + 2
? ? ? ? ? ? ? ? ? ? (di) = (di) + 2
? 如果DF = 1則: ? (si) = (si) - 2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(di) = (di) - 2?
?rep的執(zhí)行示意如下圖,
這里重復(fù)執(zhí)行了 movsw 來進(jìn)行復(fù)制;
先學(xué)這么多;?
總結(jié)
以上是生活随笔為你收集整理的Bochs调试Linux内核5 - 启动过程调试 - 认识Bootsect.S的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 首次使用Windbg调试dNet程序
- 下一篇: linux 其他常用命令