作業系統課程記錄(2)————製作grub啟動盤(1)
下載qemu模擬器
sudo apt-get install qemu
qemu是linux下的通用的,開放原始碼的機器模擬器和虛擬器。可以模擬多種架構下的系統。一般qemu命令不能直接使用,需要指定需要模擬的架構。這裡我們使用qemu-system-i386
。
下載linux核心
linux核心在https://www.kernel.org/就可以下載到。國內的服務的話,中科大的映象站很豐富的軟體資源。當然,搜尋廈門大學映象站,清華大學映象站什麼的(不一定有,我沒試過),都可以搜尋到。中科大的下載地址在
http://mirrors.ustc.edu.cn/kernel.org/linux/kernel/
可以下載到。在裡面選擇自己的想要的版本就行了。我用的是linux-3.10.98,作業系統是Ubuntu16.10,32位版本的。(下面有些操作在64位下會出現問題,當然也不是不能解決)。
下載之後通過
tar -xzvf fileName.tar.gz
解壓得到原始碼目錄
下面就來編譯linux原始碼,假設解壓得到的linux的原始碼目錄是~/Downloads/linux-3.10.98
,於是採用i386的預設編譯:
cd ~/Downloads/linux-3.10.98
make i386_defconfig
make
make的過程可能會比較久。(據說make加上 -j num,其中num是你電腦的核心數目,會比較快。然而我下載了一個linux-4的原始碼,make跟make -j num沒什麼區別。)
準備一個應用程式
為什麼需要準備應用程式以及接下來的操作是為什麼,等以後我再補充吧,因為我也不是很懂。選擇你喜歡的文字編輯器寫一個helloworld.c程式在~目錄下。
#include <stdio.h>
int main()
{
printf("hello world!\n");
while(1);
return 0;
}
然後編譯,注意gcc 的引數:
cd ~
gcc -static -m32 helloworld.c -o hello
如果你是32位的系統,理應是沒有問題的。如果你是64位的系統,可能因為-m32的緣故導致編譯出錯,在gcc之前你需要下載編譯32位程式需要的庫:
sudo apt-get install build-essential module-assistant
sudo apt-get install gcc-multilib g++-multilib
然後你在~目錄下就得到了一個hello可執行程式。
準備檔案
cd
mkdir rootfs
mkdir rootfs/dev
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/ram d 1 0
cp hello rootfs
生成映像
cd rootfs
find .| cpio -o --format=newc > ../rootfs.img
執行核心
cd
qemu-system-i386 -kernel ./Downloads/linux-3.10.98/arch/x86/boot/bzImage -initrd rootfs.img -append "root=/dev/ram rdinit=/hello"
執行的結果應該是這樣的:
無限輸出是因為那一句while(1)語句。當然也可以不加,最後只會輸出一句helloworld語句並且報attemp to kill init,which is...
,是可以理解的。