跳到主要內容

發表文章

尾聲-總結,一顆全新的硬碟開始

步驟 使用 fdisk 等工具查看硬碟的分區情況,確定要裝到哪個分區,記下分區的首磁區磁區號 $ bximage -q -hd -mode=flat -size=120 120m.img $ fdisk 120m.img 磁碟 120m.img: 125 MB,125411328 位元組 255 磁頭,63 磁區/磁軌,15 磁柱,總計 244944 磁區 單位 = 磁區 之於 1 * 512 = 512 位元組 磁區大小 (邏輯/實體):512 位元組 / 512 位元組 I/O 大小 (最小/最佳化):512 位元組 / 512 位元組 磁碟識別碼:0x00000000

尾聲-真正的尾聲

grub 系統已經在硬碟上順利執行了,我們仍然可以改進,讓它支持多重開機,採用現有的 grub 即可。 首先,先將開機磁區裝到 Orange'S 分區的開機磁區: dd if=boot/hdboot.bin of=$(HD) seek=`echo "obase=10;ibase=16;\`egrep -e '^ROOT_BASE' boot/include/load.inc | sed -e 's/.*0x//g'\`*200" | bc` bs=1 count=446 conv=notrunc dd if=boot/hdboot.bin of=$(HD) seek=`echo "obase=10;ibase=16;\`egrep -e '^ROOT_BASE' boot/include/load.inc | sed -e 's/.*0x//g'\`*200+1FE" | bc` skip=510 bs=1 count=2 conv=notrunc 並重新編譯(此時,硬碟 80m.img 的開機磁區還是 Orange'S 的開機磁區,可是在 80m.img5 的開機磁區也有 Orange'S 的開機磁區)。

關於Linux系統下Grub啟動流程的討論總結

關於Linux系統下Grub啟動流程的討論總結 轉貼來源: http://www.test104.com/tw/tech/603.html  全世界linuxer都知道grub是什麼東西,但對於MBR引導到grub再引導到具體作業系統的這個流程可能有不少朋友就比較迷糊了。這不,cu上一位朋友就發出了這樣一個求助貼:    假如現在一台電腦上裝了WIN2000系統,那麼我現在在裝上LINUX系統和GRUB,那麼假如把GRUB裝在主分區的話,GRUB直接引導 LINUX和WIN2000,我是可以理解的,因為MBR中是GRUB的STAGE1(對不對呢?),MBR通過檢查DPT分區資訊引導系統跳轉至DBR (活動分區),我這裏想問的活動分區是什麼時候設的呢?那麼裝GRUB到MBR裏,那原來MBR中的WIN的引導資訊是怎麼處理的呢?是不是我們假如說裝 GRUB到MBR的時候,GRUB就把GRUB所在那個區設置為了活動分區了呢?然後GRUB引導時候,MBR就找到那個活動分區找到所需要的檔,然後繼續呢?假如說把GRUB裝到其他分區(非主引導區)的話,那是怎麼樣實現GRUB先啟動的呢?不是先MBR嗎?因為裝到了其他分區,沒有改主引導區,因此主引導區還是WIN2000的引導資料啊,怎麼會GRUB先啟動了呢?這是為什麼呢?跟活動分區有關係沒有呢?我看資料上寫的是哪個系統啟動哪個系統就是活動分區,可是那樣的話,似乎就解釋不通了啊,就是最最開始這個地方一直不懂,理不清楚。

尾聲-從硬碟開機

我們要將 Orange'S 安裝到硬碟上,並實現硬碟啟動。 回憶軟碟啟動的過程: BIOS 將開機磁區讀入記憶體 0000:7C00 處 跳轉到 0000:7C00 處開始執行開機程式碼 開機程式碼從軟碟中找到 loader.bin,並將其讀入記憶體 跳轉到 loader.bin 開始執行 loader.bin 從軟碟中找到 kernel.bin,並將其讀入記憶體 跳轉到 kernel.bin 開始執行,到此可認為啟動過程結束 系統執行中 第 1 步中,係由 CMOS 來決定。第 3 步和第 5 步中, 軟碟啟動:程式碼將在軟碟中尋找 loader.bin 和 kernel.bin 硬碟啟動:需要讓開機磁區程式碼從硬碟中尋找 loader.bin 並讓 loader 從硬碟中尋找 kernel.bin 故我們必須重寫 boot.asm 和 loader.asm,讓它們讀取硬碟而不是軟碟。新的檔我們取名為 hdboot.asm 和 hdldr.asm。

尾聲-一些瑣碎的事兒

問題一:我們的系統每次啟動都是「全新」的,上次建立的文件到下一次啟動就不見了。 問題二:每次都會執行一次解開 cmd.tar 的操作。 問題三:再一次解壓縮時,可能已有包含的檔案了

記憶體管理-簡單的 shell

有了 fork() 和 exec(),我們可以實現簡單的 shell 了。目前只實現一種功能:讀取命令並執行之(如果命令存在的話)。

記憶體管理-exec

exec 係用以將現在的處理序映射替換成另一個。亦即我們可從硬碟讀取另一個可執行檔,用它替換掉剛剛被 fork 出來的子處理序。 為測試 exec,勢必先有一個簡單的可執行檔(echo)。因此,我們將製作一個類似於 C 的 Run-time:把過去可供給應用程式使用的函數單獨連結成一個檔,以後直接連結即可。 目前包括: 兩個真正的系統使用 sendrec 和 printx lib/syscall.asm 字串操作 memcopy、memset、strcpy、strlen lib/string.asm FS 的介面 lib/open.c lib/read.c lib/write.c lib/close.c lib/unlink.c MM 的介面 lib/fork.c lib/exit.c lib/wait.c SYS 的介面 lib/getpid.c 其他 lib/misc.c lib/vsprintf.c lib/printf.c 將以上檔案單獨連結成一個檔:oragescrt.a ar rcs lib/orangescrt.a lib/syscall.asm lib/string.asm \ lib/open.c lib/read.c lib/write.c lib/close.c lib/unlink.c \ lib/fork.c lib/exit.c lib/wait.c \ lib/getpid.c \ lib/misc.c lib/vsprintf.c lib/printf.c 並寫一個最簡單的 echo(與 pwd)。 最後,想「安裝」一些應用程式到我們的檔案系統中,有如下工作: 編寫應用程式,並編譯連結 將連結好的應用程式打成一個 tar 包:inst.tar 將 inst.tar 用工具 dd 寫入磁片(映射)的某段特定磁區(假設這一段的第一個扇區的磁區號為 X) 啟動系統,這時 mkfs() 會在檔案系統中建立一個新檔 cmd.tar,它的 inode 中的 i_start_sect 成員會被設為 X 在某個處理序中-比如 Init-將 cmd.tar 解包,將其中包含的檔存入文件系統