Linuxカーネルデバッグ その8(ソースデバッグ)

CCSでLinuxのソースデバッグを行う。ここでは、例としてファイル書き込み時に関数がブレークすることを確認する。

 

手順

1. XDSv100、BeagleBoneBlack、ホストPCを接続する。

 

2. ターミナルからscreenコマンドで接続した状態でBeagleBoneBlackの電源を投入する。U-Bootが起動するので、何かキーを押して、コマンド入力待ち状態にする。

f:id:mffukui:20180812230518p:plain

 

3. CCSを起動する。workspaceは以前使用したものを選ぶ。ここではデフォルトの「workspace_v8」を選択する。

 

4. 「Target Configurations」ウィンドウからUser Defined内のBeagleBoneBlack.ccxmlを右クリックし、「Launch Selected Configuration」を選ぶ。


5.画面がDebug画面に切り替わる。この状態ではまだ接続していない。

f:id:mffukui:20180812232006p:plain


6.「Texas Instruments XDS 100v3 USB Debug Probe_0/CortxA8」を選択し、右クリックで「Connect Target」を選ぶ。

f:id:mffukui:20180812232104p:plain


→GELが実行され、CortexA8がSuspended状態になる。

f:id:mffukui:20180812233940p:plain

 

7.実行ボタン(緑の矢印)を押下すると、CPUが走りだし、Linuxが起動する。

f:id:mffukui:20180812234016p:plain

linux起動後、ログインしておく。


8. シンボルファイルのロードを行う。CCSのメニューで「Run」→「Load」→「Load Symbols」を選択し、vmlinuxファイルを指定する。指定するファイルはkernel_src/kernel/kernel/vmlinux。

f:id:mffukui:20180812234136p:plain

f:id:mffukui:20180812234200p:plain

 

9. CCSのメニューから「File」→「Open File」を選択し、ブレークを貼るファイルを開く。ここでは、kernel_src/kernel/kernel/fs/ext4/file.cを開く。

 

10. ブレークする関数を探し、ブレークポイントを貼る。右クリックし、「Breakpoint」→「Hardware Breakpoint」を選択する。

f:id:mffukui:20180812234220p:plain

 →ブレークポイントが張られる。

f:id:mffukui:20180812234245p:plain

 

11.echoコマンドでファイルを書き込むと、その行でブレークする。

f:id:mffukui:20180812234343p:plain

 

以上で、カーネルのソースデバッグが確認できた。Happy Hacking!!!

 

Linuxカーネルデバッグ その7(SDカード作成)

SDブート用のSD用カードを作成する。SDカードのベースは、BeagleBoneBlackの公式サイトのlatest-image(https://beagleboard.org/latest-images)で配布されているeMMC flasherを用いる。ただし、このイメージは2Gbyteにパーティションが切られているので、通常用途では使いづらい。そのため、イメージの内容を一度HDDへコピーして、パーティションを切り直して使用する。

 

 

eMMC Flasherイメージの作成

公式サイトからイメージファイルをダウンロードする。2018/08/10時点での最新ファイルはBBB-eMMC-flasher-debian-7.5-2014-05-14-2gb.img.xzだった。

ダウンロード後、SDカードへ書き込む。ここで、/dev/sdbがSDカードである。

xzcat BBB-eMMC-flasher-debian-7.5-2014-05-14-2gb.img.xz | sudo dd of=/dev/sdb

 このままでは、SDカードを刺した時点でeMMCの更新スクリプトが走ってしまう*1ので、無効化する。SDカード内のFATパーティションの/boot/uboot/flash-eMMC.txtをリネームする。

cd /media/ubuntu/BEAGLE_BONE/

mv flash-eMMC.txt flash-eMMC.txt.org

 

 

HDDへの一時退避

作成したSDカードの内容をHDDへ一時退避する。適当なディレクトリを作成し、そこへコピーする。

mkdir sdcard

cd sdcard

mkdir BOOT

mkdir rootfs

cd BOOT

sudo rsync -avxHAX /media/ubuntu/BEAGLE_BONE/ .

cd ..

cd rootfs

sudo rsync -avxHAX /media/ubuntu/eMMC-Flasher/ .

 

 

パーティション分割&フォーマット&ファイルのコピー

 あらためてSDカードのパーティションを分割する。16GbyteのSDカードをfdiskで以下のように分割した。

   /dev/sdb1   256MB    BOOT

   /dev/sdb2    14.6G     rootfs

それぞれ、フォーマットする。

sudo mkfs.vfat /dev/sdb1 -n BOOT

sudo mkfs.ext4 -L rootfs /dev/sdb2

HDDへ一時退避していたファイルをSDカードへコピーする。BOOTパーティションについては、必要なもののみコピーする。

cd sdcard/BOOT

sudo cp MLO /media/ubuntu/BOOT/
sudo cp -r dtbs/ /media/ubuntu/BOOT/
sudo cp SOC.sh /media/ubuntu/BOOT/
sudo cp initrd.img /media/ubuntu/BOOT/
sudo cp u-boot.img /media/ubuntu/BOOT/
sudo cp uEnv.txt /media/ubuntu/BOOT/
sudo cp zImage /media/ubuntu/BOOT/

cd ../rootfs

sudo rsync -avxHAX . /media/ubuntu/rootfs/

  

 

カーネルの更新

事前にビルドしていたカーネルイメージをコピーする。

cd kernel_src/kernel/kernel/arch/arm/boot

sudo cp zImage /media/ubuntu/BOOT/

sudo cp dts/am335x-boneblack.dtb /media/ubuntu/BOOT/dtbs/

 

cd kernel_src/kernel/kernel

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/media/ubuntu/rootfs modules_install

作成したSDカードでブートし、uname -aでビルド時間が更新されていることを確認する。

今回作成したバージョンは3.8.13-00770-ged37066だった。

 

initrd.imgの更新

以降の作業は新たに作成したSDカードでブートしたdebian上で行う。

cd /boot/uboot

sudo update-initramfs -c -k 3.8.13-00770-ged37066

sudo mv initrd.img initrd.img.old

sudo mv ../initrd.img-3.8.13-00770-ged37066 initrd.img

 再起動し、起動時に、

modprobe: chdir(3.8.13-00770-ged37066): No such file or directory
modprobe: chdir(3.8.13-00770-ged37066): No such file or directory
modprobe: chdir(3.8.13-00770-ged37066): No such file or directory

 のメッセージが表示されないことを確認する。

 

参考URL

BeagleBone Blackのkernelの再構築を試みる – JUNK-BOX

 

*1:起動時に、/etc/rcX.d/K01bootscript.sh→/opt/scripts/boot/am335x_evm.sh→/opt/scripts/tools/beaglebone-black-eMMC-flasher.shとして実行されるが、/boot/uboot/flash-eMMC.txtがある場合にのみeMMC更新を行う

Linuxカーネルデバッグ その6(カーネルビルド)

ターゲットとなるLinuxカーネルをビルドする。ビルドはホストPC上でクロスコンパイルをする。いろいろな方がやっている一般的な方法で行う。

 

ツールのインストール

いくつかツールをインストールする。

 ・Git

 インストールされていない場合はインストールする。cloneするために、ユーザー名とメールアドレスを設定しておく。

sudo apt-get install git

git config --global user.email "XXXX@xxxx.co.jp"
git config --global user.name "xxxx"

 

・lzop

 圧縮に使うらしいのでインストールする。

sudo apt-get install lzop

・U-boot

 mkimageを使うためにビルドする。

mkdir u-boot
cd u-boot
wget ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2
tar xf u-boot-latest.tar.bz2
cd u-boot-2017.09
make sandbox_defconfig tools-only
sudo install tools/mkimage /usr/local/bin

 ・GCC

 使用したカーネルは、GCC4系を想定しているようなので、gcc-4.9のARMコンパイラをインストールする。なぜか、シンボリックリンクが張られなかったので、張っておく。

sudo apt-get install gcc-4.9-arm-linux-gnueabi

cd /usr/bin/
sudo ln -s arm-linux-gnueabi-gcc-4.9 arm-linux-gnueabi-gcc

 インストール後にバージョンを見ると、以下のようになる。

arm-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/4.9/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.9.3-13ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.9.3 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-armel-cross/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-armel-cross --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-armel-cross --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libgcj --enable-objc-gc --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv5t --with-float=soft --disable-werror --enable-multilib --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include
Thread model: posix
gcc version 4.9.3 (Ubuntu/Linaro 4.9.3-13ubuntu2)

 

 

カーネルソース取得&ビルド

gitでソースをcloneして、パッチを適用する。

mkdir kernel_src
cd kernel_src
git clone git://github.com/beagleboard/kernel.git
cd kernel
git checkout 3.13
./patch.sh

コンフィグファイルを書き換える。

cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconfig
wget http://arago-project.org/git/projects/?p=am33x-cm3.git\;a=blob_plain\;f=bin/am335x-pm-firmware.bin\;hb=HEAD -O kernel/firmware/am335x-pm-firmware.bin

カーネルのビルドは、通常のカーネルビルドと同じだが、prefixを常につけて行う。

cd kernel

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- beaglebone_defconfig -j2
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage dtbs LOADADDR=0x80008000 -j2
 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules -j2

ビルドが完了すると、kernel_src/kernel/kernel/arch/arm/bootにzImageが作成される。

 

  

参考URL:

Building BBB Kernel - eLinux.org

BeagleBone Blackのkernelの再構築を試みる – JUNK-BOX

BeagleBoneBlack Building Kernel - BeyondLogic

Linuxカーネルデバッグ その5(CodeComposerStudio)

CodeComposerStudio v8.1.0(CCS)のインストールと設定を行う。

ホストOSはUbuntu 16.04.4。

 

インストール

CCSのインストーラをTIのダウンロードページ

Download CCS - Texas Instruments Wiki

からダウンロードする。ここではLinux用のOff-line Installersを使用する。

 

ダウンロードしたインストーラを適当なフォルダで解凍する。

tar xf CCS8.1.0.00011_linux-x64.tar.gz

解凍されたフォルダへ移動して、インストーラを起動する。

cd CCS8.1.0.00011_linux-x64/

sudo ./ccs_setup_linux64_8.1.0.00011.bin

 

インストーラが起動し、以下の警告がでる。

Please unplug the USB cables for all LaunchPads and Debug Probes prior to continuing. This is required to ensure driver installation completes.

 

f:id:mffukui:20180807052942j:plain

 

デバッガなどを抜いた状態で「Continue」を押下する。

ライセンスが表示されるので、

I accept the terms of the license agreement

を選択し、「next」を押下する。

f:id:mffukui:20180807052955j:plain

 

インストール先を指定する。

ここではデフォルトの/opt/tiのまま「next」を押下する。

すでに存在する場合は警告がでるが、「yes」を押下する。

f:id:mffukui:20180807053017j:plain

 

インストールするパッケージを選択する画面になるが、選べない(?)ので「Next」を押下する。

f:id:mffukui:20180807053029j:plain

 

未サポートのデバイスについての情報が表示される。「Next」を押下する。

f:id:mffukui:20180807053041j:plain

 

デバッガ選択画面になるが、選べない(?)ので「Finish」を押下する。

インストールが開始される。

f:id:mffukui:20180807053053j:plain

 

インストール完了画面が表示されたら「Finish」を押下する。

f:id:mffukui:20180807053109j:plain

 

引き続き、ドライバのインストールを行う。

cd /opt/ti/ccsv8/install_scripts

sudo ./install_drivers.sh

念の為、再起動する。

 

 

設定

「 コンピュータを検索」からCCSを起動する。

f:id:mffukui:20180807224929j:plain

 

workspaceの保存位置を聞かれる。ここではデフォルトのまま起動する。

f:id:mffukui:20180807225105j:plain

 

「Getting Started」の画面が出たら、「×」で閉じる。

f:id:mffukui:20180807225336j:plain

 

メニューの「View」から「Target Connection」ウィンドウを選び表示する。

User Definedを右クリックして、New Target Configurationを選ぶと、ファイル名を聞かれるので、ここではBeagleBoneBlack.ccxmlとしておき、「Finish」を押下する。 f:id:mffukui:20180807225621j:plain

 

セットアップ画面になるので、ConnectionにXDS 100v3, BoardにBeagleBone_Blackを選択し、「Save」ボタンを押下する。

f:id:mffukui:20180807225815j:plain

 

Advancedタブを選び、図のように設定する。

f:id:mffukui:20180807230006j:plain

 

 

接続テスト

BeagleBoneBlackとXDS100を治具で接続し、XDS100をホストPCと接続する。

BeagleBoneBlackの電源を投入後、「Test Connection」ボタンを押下すると、接続テストが実行される。最後に「The JTAG DR Integrity scan-test has succeeded.」が表示されればOK。

f:id:mffukui:20180807230104j:plain

 

一応、全文を載せておく。

[Start: Texas Instruments XDS100v3 USB Debug Probe_0]

Execute the command:

%ccs_base%/common/uscif/dbgjtag -f %boarddatafile% -rv -o -F inform,logfile=yes -S pathlength -S integrity

[Result]


-----[Print the board config pathname(s)]------------------------------------

/home/ubuntu/.ti/ti/0/0/BrdDat/testBoard.dat

-----[Print the reset-command software log-file]-----------------------------

This utility has selected a 100- or 510-class product.
This utility will load the adapter 'libjioserdesusbv3.so'.
The library build date was 'May 30 2018'.
The library build time was '22:46:22'.
The library package version is '8.0.27.9'.
The library component version is '35.35.0.0'.
The controller does not use a programmable FPGA.
The controller has a version number of '4' (0x00000004).
The controller has an insertion length of '0' (0x00000000).
This utility will attempt to reset the controller.
This utility has successfully reset the controller.

-----[Print the reset-command hardware log-file]-----------------------------

The scan-path will be reset by toggling the JTAG TRST signal.
The controller is the FTDI FT2232 with USB interface.
The link from controller to target is direct (without cable).
The software is configured for FTDI FT2232 features.
The controller cannot monitor the value on the EMU[0] pin.
The controller cannot monitor the value on the EMU[1] pin.
The controller cannot control the timing on output pins.
The controller cannot control the timing on input pins.
The scan-path link-delay has been set to exactly '0' (0x0000).

-----[The log-file for the JTAG TCLK output generated from the PLL]----------

Test Size Coord MHz Flag Result Description
~~~~ ~~~~ ~~~~~~~ ~~~~~~~~ ~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
1 64 - 01 00 500.0kHz O good value measure path length
2 64 + 04 38 30.00MHz [O] good value apply explicit tclk

There is no hardware for measuring the JTAG TCLK frequency.

In the scan-path tests:
The test length was 2048 bits.
The JTAG IR length was 6 bits.
The JTAG DR length was 1 bits.

The IR/DR scan-path tests used 2 frequencies.
The IR/DR scan-path tests used 500.0kHz as the initial frequency.
The IR/DR scan-path tests used 30.00MHz as the highest frequency.
The IR/DR scan-path tests used 30.00MHz as the final frequency.

-----[Measure the source and frequency of the final JTAG TCLKR input]--------

There is no hardware for measuring the JTAG TCLK frequency.

-----[Perform the standard path-length test on the JTAG IR and DR]-----------

This path-length test uses blocks of 64 32-bit words.

The test for the JTAG IR instruction path-length succeeded.
The JTAG IR instruction path-length is 6 bits.

The test for the JTAG DR bypass path-length succeeded.
The JTAG DR bypass path-length is 1 bits.

-----[Perform the Integrity scan-test on the JTAG IR]------------------------

This test will use blocks of 64 32-bit words.
This test will be applied just once.

Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.

The JTAG IR Integrity scan-test has succeeded.

-----[Perform the Integrity scan-test on the JTAG DR]------------------------

This test will use blocks of 64 32-bit words.
This test will be applied just once.

Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.

The JTAG DR Integrity scan-test has succeeded.

[End: Texas Instruments XDS100v3 USB Debug Probe_0]

 

 

 

 

 

 

Linuxカーネルデバッグ その4(XDS-100v3)

BeagleBoneBlackとエミュレータを接続する。

 

 

購入品

開発ボード、キット、プログラマ TMS320-XDS100-V3の通販ならマルツオンライン

 ホストPCとの接続にUSBミニのケーブルが必要だが、同梱されていないので、別途用意する。

また、マニュアルもないので、公式HP(https://www.olimex.com/Products/DSP/Emulators/TMS320-XDS100-V3/)からダウンロードする。

設定

BeagleBoneBlackとの接続はTI_JTAG_14コネクタの方を使用するので、 ARM_JTAG_Eジャンパはオープンで使用する。

f:id:mffukui:20180803160840j:plain

 

接続

TI_JTAG_14コネクタで冶具と接続する。

f:id:mffukui:20180803161043j:plain

Linuxカーネルデバッグ その3(冶具の作成)

エミュレータとBeagleBoneBlackを接続するために、冶具を作成する。

接続のイメージは以下のとおり。

f:id:mffukui:20180802214541j:plain

 

部品

 

接続

ボックスヘッダのピン配置は以下のようになっている。

ボックスヘッダとピンソケットを1対1で接続すればOK。

なお、BeagleBoneBlac側の6番は未接続なので、接続しない。

 

f:id:mffukui:20180802220932j:plain

また、ピンソケットは2列のものがなかったので、1x10のものを2つ購入して並べて使用した。

 

 作成した冶具のイメージを載せる。

 

f:id:mffukui:20180802222315j:plain

 

f:id:mffukui:20180802222329j:plain

 

BeagleBoneBlackと接続すると以下のようになる。

f:id:mffukui:20180802225149j:plain

 

Linuxカーネルデバッグ その2(BeagleBoneBlackの改造)

BeagleBoneBlackはJTAG用のコネクタとしてP2が用意されている。

しかし、デフォルトのままではランドしかないため、ピンヘッダをはんだ付けする。

 

 

部品

ピンヘッダ 2×10(20P) 表面実装用 1.27mmピッチ: パーツ一般 秋月電子通商-電子部品・ネット通販

 

はんだ付け

はんだ付けをすると以下のようになる。

コネクタP2のピン配置は、外側が1,2ピンになっている。

f:id:mffukui:20180802212851j:plain

ピッチが狭いので、直接はんだ付けするのは難しい。

 先にピンヘッダの方をはんだでコーティングしておくとよいらしい。

以下のビデオが参考になる。

Tutorial - Install JTAG Connector on BeagleBone Black - YouTube

 

※足について

作業する際、基盤に足があると便利なので、以下を購入。

プラスチックナット+連結(6角ジョイント)スペーサー(10mm)セット: 電子工作便利商品 秋月電子通商-電子部品・ネット通販

 2個つなげるとこんな感じ。

f:id:mffukui:20180802215622j:plain