トップ «前の日記(2003年03月15日) 最新 次の日記(2003年03月17日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2003年03月16日

カーネルhack

デバイスドライバをkernel-2.2から2.4に変更するための箇所をまとめた

ブロッキング処理(sleep/wakeup)

カーネル2.2では
プロセスを停止させる箇所1箇所につき変数ひとつ
static struct wait_queue *my_wait=NULL;
/* カレントプロセスを停止させる */
interruptible_sleep_on(&my_wait);
/* 停止させたプロセスを再開させる */
wake_up_interruptible(&my_wait);
カーネル2.4では以下のように書き換える
プロセスを停止させる箇所1箇所につき変数ひとつ
wait_queue_head_t my_wait;
必ず初期化する
init_waitqueue_head(&my_wait);
停止と再開は同じ
カレントプロセスを停止させる
interruptible_sleep_on(&my_wait);
停止させたプロセスを再開させる
wake_up_interruptible(&my_wait);

request_region

request_region(), release_region(), check_region() のためには
#include <linux/ioport.h>
が必須となった。

bottom_half

ボトムハーフの扱いはめちゃ楽になった
ボトムハーフの宣言(名前、関数、引数)
DECLARE_TASKLET(parasw_tasklet,parasw_bh_tasklet,0);
void parasw_interrupt(略)
{
略
  /* 下半分をマークする */
  tasklet_schedule(& parasw_tasklet);
}
/* これが下半分 */
void parasw_bh_tasklet(unsigned long unused){
  wake_up_interruptible(& parasw_read_wait);
}

kgdb

カーネルgdb。数日前にカーネルハッキングのところに書いたけども、kgdbを試してみた。オリジナルのパッチはlinux-2.4.18までしか対応していなくてしかもpatchミスがあった。

というわけで linux-2.4.20用のkgdbパッチを作った。 パッチがあたることと、コンパイル&起動はOKだった。それくらいしか試していないので誰か試して。 ftp://ftp.si-linux.co.jp/pub/silinux/kgdb/

$ tar xzfv linux-2.4.20.tar.gz
$ cd linux-2.4.20
$ patch < linux-2.4.20-kgdb-1.6-ebihara.patch
$ make menuconfig
Kernel hacking  --->
 [*] KGDB: Remote (serial) kernel debugging with gdb
 [ ] KGDB: Thread analysis
 [ ] KGDB: Console messages
$ make dep
$ make bzImage