1.bootloader如何讀取硬碟扇區的?
2.bootloader是如何載入elf格式的os?
讀乙個扇區的大致流程:
1.等待磁碟準備好分析**2.發出讀取扇區的命令
3.等待磁碟準備好
4.把磁碟扇區資料讀到指定記憶體
實際操作中,需要知道怎樣與硬碟互動。所有的io操作是通過cpu訪問硬碟的io位址暫存器完成。硬碟共有8個io位址暫存器,其中第1個儲存資料,第8個儲存狀態和命令,第3個儲存要讀寫的扇區數,第4~7個儲存要讀寫的起始扇區的編號(共28位)。
bootloader讀取扇區的功能是在boot/bootmain.c的readsect函式中實現的:
static
void
readsect
(void
*dst, uint32_t secno)
根據**可以得出讀取硬碟扇區的步驟:1.等待硬碟空閒。waitdisk的函式實現只有一行:while ((inb(0x1f7) & 0xc0) != 0x40),意思是不斷查詢讀0x1f7暫存器的最高兩位,直到最高位為0、次高位為1(即磁碟空閒)才返回。
2.硬碟空閒後,發出讀取扇區的命令。對應的命令字為0x20,放在0x1f7暫存器中;讀取的扇區數為1,放在0x1f2暫存器中;讀取的扇區起始編號共28位,分成4部分依次放在0x1f3~0x1f6暫存器中。
3.發出命令後,再次等待硬碟空閒。
4.硬碟再次空閒後,開始從0x1f0暫存器中讀資料。
elf(executable and linking format)檔案格式是linux系統下的一種常用目標檔案(object file)格式,有三種主要型別:
struct elfhdr
;
program header描述與程式執行直接相關的目標檔案結構資訊,用來在檔案中定位各個段的映像,同時包含其他一些用來為程式建立程序映像所必需的資訊。可執行檔案的程式頭部是乙個program header結構的陣列, 每個結構描述了乙個段或者系統準備程式執行所必需的其它資訊。目標檔案的 「段」 包含乙個或者多個 「節區」(section) ,也就是「段內容(segment contents)」 。程式頭部僅對於可執行檔案和共享目標檔案有意義。可執行目標檔案在elf頭部的e_phentsize和e_phnum成員中給出其自身程式頭部的大小。程式頭部的資料結構如下表所示:
struct proghdr
;
lab1 練習五 ucore作業系統 lab1 練習二 實驗報告
為了熟悉使用qemu和gdb進行的除錯工作,我們進行如下的小練習 從cpu加電後執行的第一條指令開始,單步跟蹤bios的執行。在初始化位置0x7c00設定實位址斷點,測試斷點正常。從0x7c00開始跟蹤 執行,將單步跟蹤反彙編得到的 與bootasm.s和bootblock.asm進行比較。自己找乙...
ucore作業系統lab1實驗準備知識
虛擬環境 virtualbox 操作環境 utunbu 10.04 編譯環境 gcc 4.6.x 作業系統是乙個軟體,也需要通過某種機制載入並執行它。在這裡我們將通過另外乙個更加簡單的軟體 bootloader來完成這些工作。為此,我們需要完成乙個能夠切換到x86的保護模式並顯示字元的bootloa...
基於ucore的作業系統實驗lab1
練習1.1 1 先編譯鏈結生成kernel檔案 2 再編譯鏈結生成bootblock檔案 3 生成ucore.imgsign.c生成bootblock 1.2 檢視sign.c可以發現關鍵在於bootblock.out小於510bytes,且 buf 510 0x55 buf 511 0xaa 練習...