?? bochs1.txt
字號:
為了配合Linux 0.11內核工作原理的學習,本章介紹了利用PC機仿真軟件和在實際計算機上運行Linux 0.11系統的方法。其中包括內核的編譯過程、PC仿真環境下文件的訪問和復制、引導盤和根文件系統的制作方法以及Linux 0.11系統的使用方法。最后還說明了如何對內核代碼作少量語法修改,使其在現有的RedHat 9系統(gcc 3.x)下能順利通過編譯。
在開始進行實驗之前,首先準備好一些有用的工具軟件。在Windows平臺上,可以準備以下幾個軟件:
?Bochs 2.x開放源代碼的PC機仿真軟件包。
?UltraEdit超級編輯器。可用來編輯二進制文件。
?WinImageDOS格式軟盤映象文件讀寫軟件。
http://oldlinux.org/download/clk-ch14-expriment.pdf
*注意: 請下載本站最新的相關Image文件配合使用。
*注意2:請__先閱讀__書本大部分章節之后再開始實驗。
*獨立給出的新添內容:
(1) 集成盤的制作方法:
http://www.oldlinux.org/oldlinux/viewthread.php?tid=4751
(原http://www.oldlinux.org/cgi-bin/ ... opic=238&show=0)
(2) 內核調試方法
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3773
(原http://www.oldlinux.org/cgi-bin/topic.cgi?forum=4&topic=171)
(3) 從硬盤啟動Linux 0.11
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3828
(原http://www.oldlinux.org/cgi-bin/topic.cgi?forum=4&topic=214)
(4) 如何運行Linux 0.11系統
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3878
(原http://www.oldlinux.org/cgi-bin/ ... opic=619&show=0)
(5) quinn 的 0.11實驗環境(Linux和Windows),帶Flash教程
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3850
(原http://www.oldlinux.org/cgi-bin/ ... pic=1065&show=0)
http://www.quinnli.com/blog/
(6) 在VMware中運行Bochs磁盤映像文件的方法
http://www.oldlinux.org/oldlinux/viewthread.php?tid=4490
(原http://www.oldlinux.org/cgi-bin/ ... pic=1114&show=0)
(7) 用gdb和bochs調試內核
http://www.oldlinux.org/oldlinux/viewthread.php?tid=3809
(原http://www.oldlinux.org/cgi-bin/topic.cgi?forum=4&topic=893)
1111
圖14-6 加載根文件系統到內存虛擬盤區域的流程圖
14.1內核引導啟動+根文件系統組成的集成盤
本節內容主要說明制作由內核引導啟動映像文件和根文件系統組合成的集成盤映像文件的制作原理和方法。主要目的是了解Linux 0.11內核內存虛擬盤工作原理,并進一步理解引導盤和根文件系統盤的概念。加深對kernel/blk_drv/ramdisk.c程序運行方式的理解。在制作這個集成盤之前,我們需要首先下載或準備好以下實驗軟件:
http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040923.zip
http://oldlinux.org/Linux.old/images/rootimage-0.11-for-orig
linux-0.11-devel是運行在Bochs下的帶開發環境的Linux 0.11系統,rootimage-0.11是1.44MB軟盤映像文件中的Linux 0.11根文件系統。后綴'for-orig'是指該根文件系統適用于未經修改的Linux 0.11內核源代碼編譯出的內核引導啟動映像文件。當然這里所說的“未經修改”是指沒有對內核作過什么大的改動,因為我們還是要修改編譯配置文件Makefile,以編譯生成含有內存虛擬盤的內核代碼來。
14.1.1集成盤制作原理
通常我們使用軟盤啟動Linux 0.11系統時需要兩張盤(這里“盤”均指對應軟盤的Image文件):一張是內核引導啟動盤,一張是基本的根文件系統盤。這樣必須使用兩張盤才能引導啟動系統來正常運行一個基本的Linux系統,并且在運行過程中根文件系統盤必須一直保持在軟盤驅動器中。而我們這里描述的集成盤是指把內核引導啟動盤和一個基本的根文件系統盤的內容合成制作在一張盤上。這樣我們使用一張集成盤就能引導啟動Linux 0.11系統到命令提示符狀態。集成盤實際上就是一張含有根文件系統的內核引導盤。
為了能運行集成盤系統,該盤上的內核代碼中需要開啟內存虛擬盤(RAMDISK)的功能。這樣集成盤上的根文件系統就能被加載到內存中的虛擬盤中,從而系統上的兩個軟盤驅動器就能騰出來用于加載(mount)其他文件系統盤或派其他用途。下面我們再詳細介紹一下在一張1.44MB盤上制作成集成盤的原理和步驟。
14.1.1.1引導過程原理
Linux 0.11的內核在初始化時會根據編譯時設置的RAMDISK選項判斷在系統物理內存是否要開辟虛擬盤區域。如果沒有設置RAMDISK(即其長度為0)則內核會根據ROOT_DEV所設置的根文件系統所在設備號,從軟盤或硬盤上加載根文件系統,執行無虛擬盤時的一般啟動過程。
如果在編譯Linux 0.11內核源代碼時,在其linux/Makefile配置文件中定義了RAMDISK的大小,則內核代碼在引導并初始化RAMDISK區域后就會首先嘗試檢測啟動盤上的第256磁盤塊(每個磁盤塊為1KB,即2個扇區)開始處是否存在一個根文件系統。檢測方法是判斷第257磁盤塊中是否存在一個有效的文件系統超級塊信息。如果有,則將該文件系統加載到RAMDISK區域中,并將其作為根文件系統使用。從而我們就可以使用一張集成了根文件系統的啟動盤來引導系統到shell命令提示符狀態。若啟動盤上指定磁盤塊位置(第256磁盤塊)上沒有存放一個有效的根文件系統,那么內核就會提示插入根文件系統盤。在用戶按下回車鍵確認后,內核就把處于獨立盤上的根文件系統整個地讀入到內存的虛擬盤區域中去執行。這個檢測和加載過程見圖14-6所示。
引用 報告 回復
redgrid
版主
Member
UID 12108
精華 35
積分 6766
帖子 6938
閱讀權限 100
注冊 2003-9-5
來自 上海
狀態 離線 #2使用道具 發表于 2004-10-20 22:19 資料 個人空間 主頁 短消息 加為好友
集成盤的制作方法
圖14-7 集成盤上代碼結構
14.1.1.2集成盤的結構
對于Linux 0.1x內核,其代碼加數據段的長度很小,大約在120KB左右。在開發Linux系統初始階段,即使考慮到內核的擴展,Linus還是認為內核的長度不會超過256KB,因此在1.44MB的盤上可以把一個基本的根文件系統放在啟動盤的第256個磁盤塊開始的地方,組合形成一個集成盤片。一個添加了基本根文件系統的引導盤(即集成盤)的結構示意圖見圖14-7所示。其中文件系統的詳細結構請參見文件系統一章中的說明。
如上所述,集成盤上根文件系統放置的位置和大小主要與內核的長度和定義的RAMDISK區域的大小有關。Linus在ramdisk.c程序中默認地定義了這個根文件系統的開始放置位置為第256磁盤塊開始的地方。對于Linux 0.11內核來講,編譯產生的內核Image文件(即引導啟動盤Image文件)的長度在120KB左右,因此把根文件系統放在盤的第256磁盤塊開始的地方肯定沒有問題,只是稍許浪費了一點磁盤空間。還剩下共有1440 - 256 = 1184 KB空間可用來存放根文件系統。當然我們也可以根據具體編譯出的內核大小來調整存放根文件系統的開始磁盤塊位置。例如我們可以修改ramdisk.c第75行block的值為130把存放根文件系統的開始位置往前挪動一些以騰出更多的磁盤空間供盤上的根文件系統使用。
引用 報告 回復
redgrid
版主
Member
UID 12108
精華 35
積分 6766
帖子 6938
閱讀權限 100
注冊 2003-9-5
來自 上海
狀態 離線 #3使用道具 發表于 2004-10-20 22:19 資料 個人空間 主頁 短消息 加為好友
集成盤的制作方法
14.1.2集成盤的制作過程
在不改動內核程序ramdisk.c中默認定義的根文件系統開始存放磁盤塊位置的情況下,我們假設需要制作集成盤上的根文件系統的容量為1024KB(最大不超過1184KB)。制作集成盤的主要思路是首先建立一個1.44MB的空的Image盤文件,然后將新編譯出的開啟了RAMDISK功能的內核Image文件復制到該盤的開始處。再把定制的大小不超過1024KB的文件系統復制到該盤的第256磁盤塊開始處。具體制作步驟如下所示。
14.1.2.1重新編譯內核
重新編譯帶有RAMDISK定義的內核Image文件,假定RAMDISK區域設置為2048KB。方法如下:
在Bochs系統中運行linux-0.11-devel系統。編輯其中的/usr/src/linux/Makefile文件,修改以下設置行:
RAMDISK = -DRAMDISK = 2048
ROOT_DEV = FLOPPY
然后重新編譯內核源代碼生成新的內核Image文件。
make clean; make
14.1.2.2制作臨時根文件系統
制作大小為1024KB的根文件系統Image文件,假定其文件名為rootram.img。制作方法如下:
(1) 利用本章前面介紹的方法制作一張大小為1024KB的空Image文件。假定該文件的名稱是rootram.img。可使用在現在的Linux系統下執行下面命令生成:
dd bs=1024 if=/dev/zero of=rootram.img count=1024
(2) 在Bochs系統中運行linux-0.11-devel系統。然后在Bochs主窗口上把驅動盤分別配置成:A盤為rootimage-0.11-orign;B盤為rootram.img。
(3) 使用下面命令在rootram-0.11盤上創建大小為1024KB的空文件系統。然后使用下列命令分別把A盤和B盤加載到/mnt和/mnt1目錄上。若目錄/mnt1不存在,可以建立一個。
mkfs /dev/fd1 1024
mkdir /mnt1
mount /dev/fd0 /mnt
mount /dev/fd1 /mnt1
(4) 使用cp命令有選擇性地復制/mnt上rootimage-0.11-orign中的文件到/mnt1目錄中,在/mnt1中制作出一個根文件系統。若遇到出錯信息,那么通常是容量已經超過了1024KB了。利用下面的命令或使用本章前面介紹的方法來建立根文件系統。
首先精簡/mnt/中的文件,以滿足容量不要超過1024KB的要求。我們可以刪除一些/bin和/usr/bin下的文件來達到這個要求。關于容量可以使用df命令來查看。例如我選擇保留的文件是以下一些:
[/bin]# ll
total 495
-rwx--x--x 1 root root 29700 Apr 29 20:15 mkfs
-rwx--x--x 1 root root 21508 Apr 29 20:15 mknod
-rwx--x--x 1 root root 25564 Apr 29 20:07 mount
-rwxr-xr-x 1 root root 283652 Sep 28 10:11 sh
-rwx--x--x 1 root root 25646 Apr 29 20:08 umount
-rwxr-xr-x 1 root 4096 116479 Mar 3 2004 vi
[/bin]#[/bin]# cd /usr/bin
[/usr/bin]# ll
total 364
-rwxr-xr-x 1 root root 29700 Jan 15 1992 cat
-rwxr-xr-x 1 root root 29700 Mar 4 2004 chmod
-rwxr-xr-x 1 root root 33796 Mar 4 2004 chown
-rwxr-xr-x 1 root root 37892 Mar 4 2004 cp
-rwxr-xr-x 1 root root 29700 Mar 4 2004 dd
-rwx--x--x 1 root 4096 36125 Mar 4 2004 df
-rwx--x--x 1 root root 46084 Sep 28 10:39 ls
-rwxr-xr-x 1 root root 29700 Jan 15 1992 mkdir
-rwxr-xr-x 1 root root 33796 Jan 15 1992 mv
-rwxr-xr-x 1 root root 29700 Jan 15 1992 rm
-rwxr-xr-x 1 root root 25604 Jan 15 1992 rmdir
[/usr/bin]#
然后利用下列命令復制文件。另外,可以按照自己的需要修改一下/etc/fstab和/etc/rc文件中的內容。
cd /user
for i in bin dev etc usr tmp
do
cp +recursive +verbose /$i $i
done
sync
(5) 使用umount命令卸載/dev/fd0和/dev/fd1上的文件系統,然后使用dd命令把/dev/fd1中的文件系統復制到Linux-0.11-devel系統中,建立一個名稱為rootram-0.11的根文件系統Image文件:
dd bs=1024 if=/dev/fd1 of=rootram-0.11 count=1024
此時在Linux-0.11-devel系統中我們已經有了新編譯出的內核Image文件/usr/src/linux/Image和一個簡單的容量不超過1024KB的根文件系統映像文件rootram-0.11。
14.1.2.3建立集成盤
組合上述兩個映像文件,建立集成盤。修改Bochs主窗口A盤配置,將其設置為前面準備好的1.44MB名稱為bootroot-0.11的映像文件。然后執行命令:
dd bs=8192 if=/usr/src/linux/Image of=/dev/fd0
dd bs=1024 if=rootram-0.11 of=/dev/fd0 seek=256
sync;sync;sync;
其中選項bs=1024 表示定義緩沖的大小為1KB。seek=256 表示寫輸出文件時跳過前面的256個磁盤塊。然后退出Bochs系統。此時我們在主機的當前目錄下就得到了一張可以運行的集成盤映像文件bootroot-0.11
引用 報告 回復
redgrid
版主
Member
UID 12108
精華 35
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -