Bài viết

[Kernel-BBB] 1. KGDB qua UART

[Kernel-BBB] 1. KGDB qua UART

Giữ nguyên cấu hình từ bài Yocto-BBB 1 mình thêm 1 meta-layer mới riêng cho phần kernel này

  1. 1. Tạo meta layer mới
    1. 1.1 Tạo meta layer và add vào bblayers
    2. 1.2 Tạo recipe kernel append
  2. 2. Cấu hình KGDB qua menuconfig
    1. 2.1 Bật KGDB
    2. 2.2 Bật Debug info
    3. 2.3 Tắt strict kernel
    4. 2.4 Sửa kgdb.cfg trong meta-layer
    5. 2.5 Build kernel và image
  3. 3. Chạy KGDB
    1. 3.1 Setup KGDB board
    2. 3.2 Bật KGDB bên host

1. Tạo meta layer mới

1.1 Tạo meta layer và add vào bblayers

1
2
3
4
5
6
7
$ source oe-init-build-env build-bbb/
zk47@ltu:~/Youtube/Yocto/yocto-bbb/poky/build-bbb$ bitbake-layers create-layer ../meta-kernel
NOTE: Starting bitbake server...
Add your new layer with 'bitbake-layers add-layer ../meta-kernel'

$ bitbake-layers add-layer ../meta-kernel
NOTE: Starting bitbake server...

1.2 Tạo recipe kernel append

Ta dùng câu lệnh sau để biết được recipe kernel (Thực tế ta có thể dùng virtual/kernel nhưng nó kiểu tên chung, không chỉ đích danh)

1
2
$ oe-pkgdata-util lookup-recipe kernel
linux-bb.org

Giờ ta tạo linux-bb.org.bbappend

Vậy cấu trúc folder sẽ như sau

1
2
3
4
5
6
7
8
9
10
11
12
13
zk47@ltu:~/Youtube/Yocto/yocto-bbb/poky/meta-kernel$ tree
.
├── conf
│   └── layer.conf
├── COPYING.MIT
├── README
└── recipes-kernel
    └── linux
        ├── linux-bb.org
        │   └── kgdb.cfg
        └── linux-bb.org_%.bbappend

4 directories, 5 files

Okay, vậy là ta đã có bộ khung, giờ mình sẽ enable kgdb trong menuconfig và lấy được cái config fragment nhé

2. Cấu hình KGDB qua menuconfig

(Tham khảo Kernel docs KGDB)

Ta mở menuconfig của kernel

1
btibake -c menuconfig virtual/kernel

2.1 Bật KGDB

Okay, ta enable KGDB

Kernel hacking

Generic Kernel Debugging Instruments

KGDB: kernel debugger

Nhớ chọn cả lựa chọn serial console dòng 2 như này nhé, Có thể menuconfig của mỗi phiên bản kernel sẽ khác nhau nhỏ. Các bạn có thể gõ “/” để search text KGDB để vào đúng địa chỉ

2.2 Bật Debug info

Kernel hacking

→ Compile-time checks and compiler options

→ Debug information

→ (Select) Generate DWARF Version 5 debuginfo

2.3 Tắt strict kernel

Tắt đi lựa chọn kernel text và rodata là read only

General architecture-dependent options

-> Make kernel text and rodata read-only (STRICT_KERNEL_RWX [=y])

Okay, vậy bước cuối thì mình save lại với tên kgdb.config.

2.4 Sửa kgdb.cfg trong meta-layer

Và nó sẽ ở tại thư mục làm việc của bạn, như máy mình là sẽ ở

1
/home/zk47/Youtube/Yocto/yocto-bbb/poky/build-bbb/tmp/work/beaglebone-poky-linux-gnueabi/linux-bb.org/6.12.34+git/build/kgdb.config

Tuy nhiên ở cái kgdb.config này đang là toàn bộ config của kernel dài đến 9012 dòng, nếu mình để vào meta-layer nó sẽ bị khó theo dõi đúng không ?

Cái mình cần chỉ là cái mình đã thay đổi bên trên. Đó là lúc ta tạo ra fragment config bằng diffconfig

1
$ bitbake -c diffconfig linux-bb.org

Tuy nhiên do cái linux-bbb này chỉ inherit kernel không phải kernel-yocto nên cũng thiếu đi task do_diffconfig, nên nó sẽ không tạo được fragment.cfg

Ta thử cách thủ công

Vào folder build và diff giữa .config và .config.old

1
2
/home/zk47/Youtube/Yocto/yocto-bbb/poky/build-bbb/tmp/work/beaglebone-poky-linux-gnueabi/linux-bb.org/6.12.34+git/build 
diff .config .config.old

Rồi giờ lưu giá trị này vào kgdb.cfg của ta

1
2
3
4
5
6
7
$ cat kgdb.cfg
# CONFIG_STRICT_KERNEL_RWX is not set
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_NONE is not set
CONFIG_DEBUG_INFO_DWARF5=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y

Để tiện cho việc đối chiếu khi build xong, thì các bạn nhớ 2 option này nhé,

Cái này để lúc flash, build xong thì ta check lại trong /proc/config.gz để confirm cái config của ta đã có

Ta cũng sửa cả linux-bb.org_%.bbappend để kernel được apply nhé

1
2
3
4
5
FILESEXTRAPATHS:prepend := "${THISDIR}/linux-bb.org:"

SRC_URI += "file://kgdb.cfg"

KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/kgdb.cfg"

2.5 Build kernel và image

1
bitbake -c cleansstate linux-bb.org && bitbake linux-bb.org && bitbake core-image-minimal

Okay, xong rồi ta flash thẻ nhớ

3. Chạy KGDB

3.1 Setup KGDB board

Khi board boot lên, ta truy cập u-boot terminal và set baudrate và tty

1
2
3
setenv optargs kgdboc=ttyS0,115200
saveenv
boot

Nếu các bạn nhỡ quên không vào u-boot, thì có thể chạy lệnh sau lúc runtime

1
2
3
4
root@beaglebone:~# tty
/dev/ttyS0

root@beaglebone:~# echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc

Rồi ta chạy debug

1
2
3
root@beaglebone:~# echo g > /proc/sysrq-trigger 
[  211.552855] sysrq: DEBUG
[  211.555578] KGDB: Entering KGDB

Như đây là đã bật KGDB thành công

3.2 Bật KGDB bên host

Ta thoát khỏi terminal serial hiện tại (tránh xung đột vì giờ ta đang dùng chung /dev/ttyUSB0, nếu được thì serial ở 1 UART, và KGDB ở 1 UART khác thì là đẹp nhất), và bật gdb lên

1
sudo gdb-multiarch ~/Youtube/Yocto/yocto-bbb/poky/build-bbb/tmp/work/beaglebone-poky-linux-gnueabi/linux-bb.org/6.12.34+git/build/vmlinux

(Trỏ đến vmlinux ở output nhé. Ở đây mình chạy sudo tạm vì truy cập /dev/ttyUSB0 đang cần quyền root)

Setup

1
2
3
(gdb) set serial baud 115200
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0

Ta có tập lệnh căn bản như sau

1
2
3
4
5
(gdb) bt                        # xem backtrace
(gdb) list                      # xem source code (sau khi set path)
(gdb) break do_sys_openat2      # đặt breakpoint
(gdb) continue                  # cho kernel chạy tiếp
(gdb) info registers            # xem registers

Tạm thời bài hôm nay đã khá dài, tôi sẽ tiếp tục về kgdbwait và gdb server ở bài sau

Bài viết này được cấp phép bởi tác giả theo giấy phép CC BY 4.0 .