りんけーじ - blog

ℹ️本記事は古いコンテンツを変換して表示しています。

表示が崩れたり、リンクが正しくない可能性があります。ご了承ください。

2016/07/31 03:07 : カーネルデバッグに手を染めてみる(2)

前回からの続き。

VMを使えばシリアルポートなんて簡単に接続できることに、いまさら気づいた。(始めてから2週間くらい)機材そろえちゃったよ……。

気を取り直して、ハマっているbio(I/O)を探してみる。(そしてこれもうまくいかなかった。)

前回からの続き。

VMを使えばシリアルポートなんて簡単に接続できることに、いまさら気づいた。(始めてから2週間くらい)機材そろえちゃったよ……。

気を取り直して、ハマっているbio(I/O)を探してみる。(そしてこれもうまくいかなかった。)

sys/geom/geom_io.cによれば、g_bio_run_(down|up|task)の3つのキューがあるらしい。

キューはstruct g_bioqで、宣言はsys/geom/geom.hにある。

struct g_bioq {
        TAILQ_HEAD(, bio)       bio_queue;
        struct mtx              bio_queue_lock;
        int                     bio_queue_length;
};

はsys/sys/queue.hにある。

#define TAILQ_HEAD(name, type)                                          \
struct name {                                                           \
        struct type *tqh_first; /* first element */                     \
        struct type **tqh_last; /* addr of last next element */         \
        TRACEBUF                                                        \
}

とりあえず1つ追ってみる。

db> print g_bio_run_up
ffffffff81c208d0
db> x/gx g_bio_run_up
g_bio_run_up: 0

と思ったらそもそもキューが空だった。down/taskもからっぽ。そもそも当てずっぽうだったから、原因にすぐたどり着くとは思ってなかったけど、ちょっと残念。