1. 程式人生 > >作業系統課程記錄(2)————製作grub啟動盤(1)

作業系統課程記錄(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...,是可以理解的。