2010/04/20

ARM用Linuxカーネルのクロスコンパイル環境構築

今日は、ARM用Linuxカーネルのクロスコンパイル環境をGentoo Linux上に構築してみようと思います。

以前ARM用アプリケーションバイナリを作成しQEMUでエミュレーション実行する手順を書きましたが、このときは日本語で見つかった情報でちゃちゃっとすませちゃった感があるので、今回は本家のドキュメントを参照しながらちゃんと進めていこうと思います。。

1. crossdevのインストール
Gentoo Linux上にクロスコンパイル環境を構築するのを支援してくれるツール、crossdevをインストールします。
# emerge crossdev 


2. ARMクロスコンパイラのインストール
crossdevを使用して、ARMクロスコンパイラをインストールします。
まず/usr/local/portageというディレクトリを作り、/etc/make.confに以下の行を追記します。
PORTDIR_OVERLAY="/usr/local/portage" 

そしてcrossdevを次のように実行します。
# crossdev --ex-gdb --stable --target arm-unknown-linux-gnu 

これでクロスコンパイラのインストールは完了です。


3. Linuxカーネルのクロスコンパイル
今回はカーネルモジュールのインストールについては考慮しません。また、カーネルソースは一般ユーザのホームディレクトリ下に展開するものとします。


まず、展開したソースの直下にクロスコンパイル用の以下のような内容のシェルスクリプトを作り、xkmakeという名前で保存します。
#!/bin/sh                                                        
exec make ARCH="arm" CROSS_COMPILE="arm-unknown-linux-gnu-" "$@" 


xkmakeに実行権限を与えます。
% chmod u+x xkmake 


あとはxkmakeを使って、x86と同じように下記のようにカーネルをコンパイルすることができます。
% ./xkmake menuconfig 
% ./xkmake            


---
ARMターゲットのコンフィギュレーションはさっぱり分からないので、この環境を利用してぼちぼち調べてみようかと思います。。



2010/04/15

CGDB

以前GDBを使うときはEmacsと組み合わせて使っていたのですが、最近はVimを常用していることもあってviっぽい操作でソースも見ながらデバッグしたいなと思っていたところ、「実践 デバッギング技法」(オライリー刊)にCGDBというのがちょろっと紹介されていたのを思い出して調べてみました。

日本語の資料はほとんどないっぽいようなので、頑張って本家ページの英語ドキュメントを見ながら使い方を調べていこうと思います。。

まず、~/.cgdb/cgdbrcが設定ファイルなので、「4 CGDB configuration commands」を見て必要そうなのを記入しました。
ざっとこんな感じです。

 set cgdbmodekey=<C-K> 
 map r :run            
 map c :continue       
 map f :finish         
 map n :next           
 map s :step           
 map q :quit           

CGDBを起動すると上にソースコード、下にGDBインターフェイスが表示され、ソースコード枠にフォーカスしているときを "CGDBモード"、GDBインターフェイスにフォーカスしているときを "GDBモード" というようです。

で、CGDBモードに移るときのキーをcgdbmodekeyの値を変えることで設定できるようになっているので、1行目記述でCtrl-Kを割り当てています。(デフォルトはEscなんですが、ちょっと押すのがだるいので。。)

また、mapコマンドでCGDBモードのキー、imapコマンドでGDBモードのキーをコマンドに割り付けられるようになっているので、残りの記述でCGDBモードのときデバッグで多用するコマンドをキーに割り付けています。

とまあ、こんな風に.vimrcと似たような感じで設定をいじれるようになっており、準備はこれで完了です。w

あとはGDBを使うときと同じように、シェルから

 cgdb <実行ファイル> 

と打てばデバッグが開始できます。

開始直後はGDBモードなので、Ctrl-K (設定を変えてない場合はEsc) を押すとソースコード枠にフォーカスが移りCGDBモードになります。基本的にViっぽい操作で表示場所を移動することができ(kで上に移動とか)、スペースキーでブレークポイントをはることができます。
CGDBモードでできないことをやりたくなったら、iを押してGDBモードに戻ります。

このようにエディタにVimとか使ってて、かつGDBに慣れてる人にとってはなかなか快適なデバッガだと思いました。w



2010/04/09

Linuxカーネルの開発を追おうとしてみる

おもむろにLinuxカーネルの開発を追いかけてみようと思い立ちました。。w

以下は、2.6系ツリーをローカルにクローンする手順の覚書です。


  1. 現在Linuxはgitという分散型バージョン管理システムでバージョン管理されているので、まずgitをインストール。自分はGentooを使っているので、 emerge git
  2. クローンを作るディレクトリに移動し、次のコマンドを打つ。git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
これでカレントディレクトリの下にlinux-2.6ができます。
自宅で作ったものの管理は最近Mercurialを使っているのですが、Linuxカーネル開発を追っかけながらgitの使い方もちょこちょこ調べていこうと思います。。