Linux Kernel 0.01 的編譯和執行
Linux Kernel 0.01 的編譯和執行
本文操作環境均在 Linux 系統中實現。
==================================================================================
一、準備工作
下面說明的內容要使用 bochs 模擬器和Linux 0.11作為開發平臺。
1. 取得Linux 0.11開發平臺檔案,下載地址是:http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040923.zip
2. 解壓縮 linux-0.11-devel-040923.zip,修改其 bochs 配置檔案 bochsrc-hd.bxrc,新增如下行:
ata0-slave: type=disk, path=./B4M, cylinders=100, heads=5, spt=17, translation=none
3. 建立一空檔案作為 bochs 模擬磁碟映像:
$ dd if=/dev/zero of=./B4M bs=512 count=8500
4. 對模擬磁碟 B4M 分割槽:
$ su
# losetup /dev/loop0 ./B4M
# fdisk /dev/loop0 -C 100 -H 5 -S 17
進入 fdisk 後使用 "n"命令新增第一主分割槽(primary 1),佔模擬盤的最大尺寸,分割槽標誌為81(Minix),然後用"w"命令儲存退出。
# losetup -d /dev/loop0
# exit
5. 進入 Linux 0.11開發平臺,對模擬盤製作 Minix 檔案系統,在Linux 0.11中,執行命令:
# mkdir /mnt/hd6
# mkfs /dev/hd6 4241
# sync
# mount /dev/hd6 /mnt/hd6
# cd /mnt/hd6
# mkdir root
# cp -R /bin .
# cp -R /dev .
# cd /
# sync
# umount /dev/hd6
# exit
退出 Linux 0.11 環境。
二、編譯 Linux Kernel 0.01
1. 先修改 0.01 原始碼,修改內容包括:
1) 修改 ./Makefile 中部分編譯命令,刪除 ./{fs,kernel,lib}/Makefile 的CFLAGS選項中的 "-mstring-insns";
2) 修改 ./boot/boot.s ,把註釋符由 "|" 改為 "!" ;
3) 修改 ./kernel/system_call.s ,把 _hd_interrupt 中斷向量的開中斷命令後移。
這裡有一個 patch 檔案,下載後執行以下命令完成上面的修改內容:
$ tar xzf patch-0.01.tgz
$ cd linux
$ patch -p0 < ../patch-0.01
2. 把修改後的原始碼複製到 Linux 0.11 環境中。下面將使用模擬軟盤作為Linux 0.11環境和系統的資料交換區,請先對相應檔案作好備份。
$ cd linux-0.11-devel-040923
$ mkdir tmp
$ su
# mount -o loop bootimage-0.11-hd ./tmp
# cd tmp
# rm -fr *
# cp -R ../linux .
# umount ./tmp
# exit
3. 進入 Linux 0.11開發平臺,複製並編譯 Kernel 0.01:
# mkdir /fd0
# mount /dev/fd0 /fd0
# cp -R /fd0/linux /usr/src/linux-0.01
# cd /usr/src/linux-0.01
# make
# cp Image /fd0/Image-0.01
# sync
# exit
4. 把編譯好的 Kernel 0.01 複製出來,作為模擬啟動軟盤。
$ su
# mount -o loop bootimage-0.11-hd ./tmp
# cp ./tmp/Image-0.01 .
# umount ./tmp
# exit
三、執行 Linux 0.01
1. 把前面第一和第二階段得到的兩個檔案複製到目錄 linux-0.01-dev 中
$ cp B4M Image-0.01 ~/linux-0.01-dev
2. 在目錄 linux-0.01-dev 建立 bochs 配置檔案,其中的硬碟和軟盤引數如下:
ata0-master: type=disk, path=./B4M, cylinders=100, heads=5, spt=17, translation=none
floppya: 1_44=Image-0.01, status=inserted
3. 啟動bochs,現在可以看到提示符 "bash#" 了。