2014年5月27日 星期二

使用 GDB 連上 ARM64 QEMU 進行kernel level的單步執行

先留一下筆記。

前篇文章已經可以把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月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
$ 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) 
    (BR2_TARGET_GENERIC_GETTY_PORT)
  * 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) (BR2_TARGET_ROOTFS_CPIO)
    $ 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的單步執行。

搜尋此網誌