KGDB

下載kernel

  • http://www.kernel.org
  • 下載最新的源碼,然後解壓.
$ tar xvf linux.tar.gz
$ cd linux

kernel

如果直接在源碼目錄下進行編譯會產生很多臨時性的中間文件.這些文件會給我們帶來一些不便.為了使源碼文件和編譯產生的臨時文件分開,在源碼目錄同級目錄創產一個新的目錄obj.然後進行linux目錄進行用大寫字母O來指定obj目錄的路徑.

mkdir obj
cd linux
make O=../obj defconfig
make mrproper
make O=../obj -j16

文件系統

從pokylinux.org網站上下載一個他們編譯好了的根文件系統的壓縮包然後安裝上去. 步驟:

$ dd if=/dev/zero of=./busybox.img bs=1M count=4096 (busybox.img文件是4G大小)
$ mkfs.ext3 busybox.img
$ mkdir disk
$ sudo mount -o loop busybox.img disk
$ tar xvf core-image-lsb-dev-qemux86-64.tag.bz2 -C disk

qemu X86_64啟動參數

如果你的硬盤是sata接口的,你也許需要將上面的 「root=/dev/hda」 替換為 「root=/dev/sda」.

qemu -kernel /usr/src/work/bzImage -append "root=/dev/hda" -boot c -hda /usr/src/work/busybox.img -k en-us
qemu-system-x86_64 -m 512 -kernel ./bzImage -localtime -append "root=/dev/sda" -boot c -hda ./busybox.img -k en-us -redir tcp:5555::22

將qemu系統的中的linux ssh 22端口映射本地的TCP 5555端口上.可以通過ssh連接到qemu的系統上.這塊我試了不行啊. -redir tcp:5555::22

###KGDB連接:

先啟動qemu.可以參考下面的命令:

$ qemu-system-x86_64 -m 512 -kernel ./bzImage -localtime -append "root=/dev/sda kgdboc=ttyS0,115200 kgdbwail"\
 -boot c -hda ./busybox.img -k en-us -serial tcp::4321,server

這時,運行qemu的終端將提示等待遠程連接到本地端口4321:

QEMU waiting for connection on: tcp:0.0.0.0:4321,server

這時需要啟動另一個終端,運行GDB使用remote模式連接到剛Kernel.

$ gdb vmlinux
$ (gdb) target remote localhost:4321

 Remote debugging using localhost:4321
 kgdb_breakpoint () at kernel/debug/debug_core.c:983
 983         wmb(); /* Sync point after breakpoint */
 (gdb)

    or
$ ./boot-linux.sh

也可以使用shell腳本:

#!/bin/bash
gdb = "target remote localhost:4321"
gdb vmlinux
echo $gdb

debugfs 調試

在kernel裡有一個debugfs文件系統,可能查下當前設置的電源狀態.需要在kernel中打開這個CONFIG_DEBUG_FS宏定義.

# mount -t debugfs none /sys/kernel/debugfs
# cd regulator

LFTP

用lftp命令行進行同步,也可以用crontab來定時同步或備份.

lftp -u user2168641,pwd -e "mirror -R /git/workspack/ritter-code/build/html/ www" www20.subdomain.com

下面看一下關於crontab的相關配置說明::

$ crontab -e

* * * * * command
| | | | `-------- 表示一個星期中的第幾天
| | | `---------- 表示月份
| | `------------ 表示一個月份中的第幾日
| `-------------- 表示小時
`---------------- 是表示分鐘

在12月內,每天的早上6點到1 點中,每隔3個小時執行一次 /usr/bin/backup:

0 6-12/3 * 12 * /usr/bin/backup
   |   `------------------------ 每隔3個小時.
   `---------------------------- 早上6點到12點之間.

MIPI LCD

查看寄存器

$ adb root
$ adb shell
# mount -t debugfs none /sys/kernel/debug
# cd /sys/kernel/debug/mdp-dbg/

這個目錄下面有三個接口,分別是:

base
off
reg

其中 base 為只讀接口,用於獲取需要讀取的寄存器組的基地址, cat base 後獲取到下面的信息:

mdp_base  :    e1900000
mddi_base :    00000000
emdh_base :    00000000
mipi_dsi_base: e5900000

off 接口用於指定需要讀取或寫入的寄存器地址,比如我們要讀取MIPI DSI中的從 0x0 開始的 10 個寄存器的值, 一共有63個寄存器 輸入以下命令:

echo "0x0 10 0xe5900000" > off

之後執行 cat reg 可以讀取到這 10 個寄存器的值,具體結果如下:

0xe5900000: 00000000 00000000 11111000 11119230
0xe5900010: 31211101 3e2e1e0e 00001900 00000000
0xe5900020: 02480068 03400020

reg 接口也可以用來寫寄存器,但是一次只能寫一個寄存器,具體為上面 off 中指定的地址,如:

echo "0x0" > reg

PS:無論是kernel本身還是高通的平臺相關代碼,都提供了一些很實用的debugfs 接口,比如clk,regulator等,在我們平時的開發和調試中可以使用,我們自己也 可以根據需要寫一些接口。


书籍推荐