背景情報
ドライバーとLinuxカーネルについて学び始めたところです。write()
ユーザーとその仕組みを理解したいread()
。そこで、関数が進むパスを確認するためにftraceを使い始めました。しかし、次のような単一のプログラムからのトレースは「巨大」です。
int main() {
int w;
char buffer[] = "test string mit 512 byte";
int fd = open("/dev/sdd",O_DIRECT | O_RDWR | O_SYNC);
w = write(fd,buffer,sizeof(buffer));
}
また、Linuxカーネルがわからず、重要なものを捨てたくないので、どの関数をフィルタリングできるかもわかりません。
そこで、function_graphトレースの処理を開始しました。これがスニップです。
[...]
12) 0.468 us | .down_write();
12) 0.548 us | .do_brk();
12) 0.472 us | .up_write();
12) 0.762 us | .kfree();
12) 0.472 us | .fput();
[...]
私はこれらを見.down_write()
て.up_write()
、これがまさに私が探しているものだと思いました。それで調べました。down_write()ソースコード:
/*
* lock for writing
*/
void __sched down_write(struct rw_semaphore *sem)
{
might_sleep();
rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(sem, __down_write_trylock, __down_write);
}
しかし、これは単にロックをロックして解放するためのものであることが判明しました。それから私は私のために小さなリファレンスを書き始めました、それで私はそれが9000以上あるように落ちるので、私はいつもこのものを調べる必要はありません。それから私はこれらの関数とそれらのコメントを解析するという考えを持っていましたトレースファイルの関数の後ろにそれらを書き込みますか?このような:
[...]
12) 0.468 us | .down_write(); lock for writing
12) 0.548 us | .do_brk();
12) 0.472 us | .up_write(); release a write lock
12) 0.762 us | .kfree();
12) 0.472 us | .fput();
[...]
主な問題
それで、どうすればこれを達成できるかを考え始めました。私はそれを最も快適に感じるので、Pythonでそれをやりたいと思います。
1.問題
C関数とコメントを一致させるには、再帰一致文法を定義して実装する必要があります:(
2.問題
一部の関数は単なるラッパーであり、コメントがありません。たとえば、do_brk()
折り返し__do_brk()
、コメントは__do_brk()
だから、コメントの出典は他にもあるのではないかと思いました。多分ドキュメント?また、Pythonを使用したこの「ドキュメント生成」には、すでに誰かが実装されている可能性があります。
それとも、システムを理解する私の方法はread()
write()
非常にインテリジェントではありませんか?深く掘り下げる方法のヒントを教えていただけますか?
読んでくれてありがとう、
ファビアン