轉貼本網站文章請註明出處 from Awaysu
https://awaysu-programming.blogspot.com
一個系統開機的流程基本上是Bootloader=> kernel=> filesystem
這裡我用VirtualBox模擬一台x86電腦來驗證了解
當然如果你手上有其他平台像是樹梅派也是一樣做法
只是cross compiler原本是x86的gcc改成arm的arm-linux-gcc
1. 下載Bootloader
這邊我選一個x86簡單的bootloader - extlinux
apt-get install uuid-dev
git clone https://github.com/geneC/syslinux.git
make
extlinux會產生在./bios/extlinux/extlinux拷貝至tftp下但如果是embedded system,大多使用uboot.
2. 下載Kernel
wget http://ftp.ntu.edu.tw/linux/kernel/v4.x/linux-4.19.104.tar.gz
tar zxvf linux-4.19.104.tar.gz
cd linux-4.19.104
make
kernel image會產生在./arch/x86_64/boot/bzImage拷貝至tftp下如果需要.config,可以參考此檔
3. 創建file system下的進入點init
這裡我們只是印出訊息The is init test !!!迴圈等待
init.c
#include <stdio.h>
int main()
{
printf("\n\n The is init test !!! \n\n");
while(1)
{}
return 0;
}
build成init gcc -static -o init init.c
init拷貝至tftp下4. 下載一個可以開機的Linux CD
我選Tiny Core Linux因為只有18M又有基本的linux指令
http://www.tinycorelinux.net/13.x/x86_64/release/CorePure64-13.1.iso
5. 建立VirtualBox虛擬電腦
開啟VirtualBox,新增一台類型為Linux,版本為Arch Linux (64-bit)的虛擬電腦
裝置=>光碟機=>設定CorePure64-13.1.iso並開機
6. 寫入所需檔案
# extlinux 需要此lib link
sudo mkdir /lib64
sudo ln -s /lib/ld-linux-x86.so.2 /lib64/ld-linux-x86.so.2
#格式化硬碟並mount
sudo mkfs.ext4 /dev/sda
sudo mount -t ext4 /dev/sda /mnt
sudo cd /mnt
#下載kernel
sudo tftp -l bzImage -r bzImage -g 10.118.96.20
#下載rootfs進入的init
sudo tftp -l init -r init -g 10.118.96.20
sudo chmod 777 init
#下載bootloader並寫入
sudo tftp -l extlinux -r extlinux -g 10.118.96.20
sudo chmod 777 extlinux
sudo ./extlinux -i /mnt
#產生所需的dev node
sudo mkdir dev
sudo mknod dev/console c 5 1
sudo mknod dev/ram b 1 0
7. 建立檔案/mnt/extlinux.conf
sudo vi /mnt/extlinux.conf
DEFAULT emblinux
timeout 10
prompt 0
label emblinux
kernel bzImage
append noinitrd root=/dev/sda rw init=/init ide=nodma
此檔案為開機指令, kennel為bzImage, rootfs為/dev/sda,init是我們編譯出來的init
Bootloader extlinux 開完後就會按照此設定開機
8. 移除Linux CD後重開機
9. 開機後就可以看見系統最後進到我們寫的 The is init test !!!
如果想要自己建構出更詳細的file system可以參考 [Linux Porting] 建立基本可開機的filesystem
沒有留言:
張貼留言