先留一下筆記。
前篇文章已經可以把ARM64的kernel與rootfs編譯好,並且在QEMU跑起來。所以嘗試使用gdb對QEMU做kernel level的單步執行。
1) 將 qemu 跑起來,並等待 gdb 來連接 (多了參數-s -S)
$ ./qemu.git/aarch64-softmmu/qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 1 -m 2048 -kernel ../kernel/arch/arm64/boot/Image --append "console=ttyAMA0" -s -S
2) 將gdb跑起來並連接到 QEMU
$ aarch64-linux-gnu-gdb
(gdb) file vmlinux ---> 載入kernel的binary
Reading symbols from /home/jesse/studies/arm64/linux.git/vmlinux...done.
(gdb) directory /home/jesse/studies/arm64/linux.git/ ---> 告知source code目錄
Source directories searched: /home/jesse/studies/arm64/linux.git:$cdir:$cwd
(gdb) target remote 10.10.10.10:1234 ---> 連上QEMU
Remote debugging using 10.10.10.10:1234
0x0000000040000000 in ?? ()
(gdb) break start_kernel ---> 設break point
Breakpoint 2 at 0xffffffc0005c94a0: file init/main.c, line 480.
(gdb) c ---> 讓kernel開始繼續執行
Continuing.
Breakpoint 2, start_kernel () at init/main.c:480 ---> 遇到中斷點,kernel停下來
480 {
(gdb) list ---> 看一下現在source code
475 pgtable_init();
476 vmalloc_init();
477 }
478
479 asmlinkage __visible void __init start_kernel(void)
480 {
481 char * command_line;
482 extern const struct kernel_param __start___param[], __stop___param[];
483
484 /*
(gdb) step ---> 單步執行
489 smp_setup_processor_id();
2014年5月27日 星期二
2014年5月26日 星期一
ARM64 研究
ARM64如火如荼的進行著,從原本的ARM 32bit跨入到新的AArch32/64究竟有多少改變?好像已經沒辦法像之前透過簡單study就通盤了解。為了保持老老工程師的競爭力,只好確實擬訂讀書計畫,期待能夠窺探ARM 64bit的世代的改變。
首先,計畫才一開始,甚麼頭緒也沒有。所以我們先嘗試著建置學習環境,建置過程中再慢慢思考需要研究哪些topic幫助了解64bit的世界。
參考了幾個網站之後,主要是 http://www.bennee.com/~alex/blog/2014/05/09/running-linux-in-qemus-aarch64-system-emulation-mode/
建置環境的步驟如下:
0. 準備toolchain
$ wget http://releases.linaro.org/12.10/components/toolchain/gcc-linaro/aarch64/rc3/gcc-linaro-aarch64-linux-gnu-4.7+bzr115029-20121015+bzr2506_linux.tar.bz2
1. 取得kernel source。
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
2. Setup ARM64 QEMU. (以QEMU做為我們硬體的環境)
$ git clone git://git.qemu.org/qemu.git qemu.git
3. Build your own rootfs
$ git clone git://git.buildroot.net/buildroot buildroot.git
* Toolchain -> Toolchain (Linaro AArch64 14.02)
* System configuration -> Run a getty (login prompt) after boot
首先,計畫才一開始,甚麼頭緒也沒有。所以我們先嘗試著建置學習環境,建置過程中再慢慢思考需要研究哪些topic幫助了解64bit的世界。
參考了幾個網站之後,主要是 http://www.bennee.com/~alex/blog/2014/05/09/running-linux-in-qemus-aarch64-system-emulation-mode/
建置環境的步驟如下:
0. 準備toolchain
$ wget http://releases.linaro.org/12.10/components/toolchain/gcc-linaro/aarch64/rc3/gcc-linaro-aarch64-linux-gnu-4.7+bzr115029-20121015+bzr2506_linux.tar.bz2
$ tar xf gcc-linaro-aarch64-linux-gnu-4.7+bzr115029-20121015+bzr2506_linux.tar.bz2
$ export PATH=$PATH:$PWD/gcc-linaro-aarch64-linux-gnu-4.7+bzr115029-20121015+bzr2506_linux/bin
1. 取得kernel source。
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
2. Setup ARM64 QEMU. (以QEMU做為我們硬體的環境)
$ git clone git://git.qemu.org/qemu.git qemu.git
$ cd qemu.git
$ ./configure --target-list=aarch64-softmmu
$ make
3. Build your own rootfs
$ git clone git://git.buildroot.net/buildroot buildroot.git
$ cd buildroot.git
$ make menuconfig
Configure it
* Target Options -> Target Architecture(AArch64)* Toolchain -> Toolchain type (External toolchain)
* Toolchain -> Toolchain (Linaro AArch64 14.02)
* System configuration -> Run a getty (login prompt) after boot
(BR2_TARGET_GENERIC_GETTY)
* System configuration -> getty options -> TTY Port (ttyAMA0)
* System configuration -> getty options -> TTY Port (ttyAMA0)
(BR2_TARGET_GENERIC_GETTY_PORT)
* Target Packages -> Show packages that are also provided by busybox
* Target Packages -> Show packages that are also provided by busybox
(BR2_PACKAGE_BUSYBOX_SHOW_OTHERS)
* Filesystem images -> cpio the root filesystem (for use as an initial RAM
* Filesystem images -> cpio the root filesystem (for use as an initial RAM
filesystem) (BR2_TARGET_ROOTFS_CPIO)
$ make
4. Build Kernel and Run it on QEMU.
以上,應該可以跑起來。下個階段嘗試使用GDB進入,以便進行kernel source level的單步執行。
$ make
4. Build Kernel and Run it on QEMU.
Configure Kernel
* CONFIG_CROSS_COMPILE="aarch64-linux-gnu-" # needs to match your cross-compiler prefix
* CONFIG_INITRAMFS_SOURCE=
"/home/alex/lsrc/qemu/buildroot.git/output/images/rootfs.cpio"
# points at your buildroot image
* CONFIG_NET_9P=y # needed for virtfs mount
* CONFIG_NET_9P_VIRTIO=y
$ ARCH=arm64 make -j 8 5. Run your kernel and rootfs on ARM64 QEMU
$ ./aarch64-softmmu/qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 1 -m 2048 -kernel ../linux.git/arch/arm64/boot/Image --append "console=ttyAMA0"
以上,應該可以跑起來。下個階段嘗試使用GDB進入,以便進行kernel source level的單步執行。
訂閱:
文章 (Atom)