AArch64 Linux kernel on Qemu

一、需求

二、下載toolchain

在linaro官網的下載區https://www.linaro.org/downloads/,進行下載。以最新第七版為例https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/,下載linux版本即可,然後找個地方解壓縮。

三、下載或編譯Qemu

在arch linux中用pacman安裝qemu。

$sudo pacman -Sy qemu  

或是去https://www.qemu.org/下載qemu,或是用git clone。

$ git clone git://git.qemu.org/qemu.git qemu.git  
$ cd qemu.git  
$ ./configure --target-list=aarch64-softmmu  
$ make  

之後執行檔會放在qemu.git/aarch64-softmmu/qemu-system-aarch64。

Arch Linux的package預設包含aarch64-softmmu這個target。

四、建立rootfs

其實有很多方法可以建立(busybox),而這裡用buildroot來做。
首先取得buildroot。

git clone git://git.buildroot.net/buildroot buildroot.git  
$ cd buildroot.git  
$ make menuconfig  

在target option中選擇架構與CPU。
以下為範例:

在System configuration  —> 點選[*]Run a getty (login prompt) after boot  —>並將TTY port設成ttyAMA0。
在Target Packages —>選取busybox與[*]   Show packages that are also provided by busybox 。
在Filesystem images中選擇[*] cpio the root filesystem (for use as an initial RAM filesystem)。
在toolchain option中選擇外部toolchain如下:

設好外部toolchain路徑gcc版本與linux header版本,必將SSP和RPC開啟。可以檢查.config中是否有:
BR2_TOOLCHAIN_EXTERNAL_HAS_SSP=y
BR2_TOOLCHAIN_EXTERNAL_INET_RPC=y

最後:

$ make   

四、下載編譯kernel

https://www.kernel.org/下載最新kernel。

$cd linux-5.x.x  
$mkdir out\_AArch64  
$make ARCH=arm64 ARCH=arm64 CROSS\_COMPILE=aarch64-linux-gnu- O=./out\_AARCH64 defconfig  
$make ARCH=arm64 ARCH=arm64 CROSS\_COMPILE=aarch64-linux-gnu- O=./out\_AARCH64 menuconfig  

在.config中修改以下:

CONFIG_CROSS_COMPILE="aarch64-linux-gnu-"                  # needs to match your cross-compiler prefix  
CONFIG_INITRAMFS_SOURCE="path/to/buildroot.git/output/images/rootfs.cpio"          # points at your buildroot image  

最後編譯:

$make ARCH=arm64 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./out_AARCH64 Image -j8  

五、Qemu執行

在out_AArch64資料夾中。

$qemu-system-aarch64 -kernel arch/arm64/boot/Image -machine virt -cpu cortex-a57 -machine type=virt -smp 4 -append "console=ttyAMA0" -nographic  

單步執行。

$qemu-system-aarch64 -kernel arch/arm64/boot/Image -machine virt -cpu cortex-a57 -machine type=virt -smp 4 -append "console=ttyAMA0" -nographic -S -s  

在另一個視窗。

$aarch64-linux-gnu-gdb vmlinux  

預設登入帳密:root無密碼。

六、其他

無法開機時請先確認toolchain正確與否。

七、參考 

http://gogojesseco.blogspot.com/2014/05/arm64.html

comments powered by Disqus