2010-01-01から1年間の記事一覧
これまでUML(User Mode Linux)でカーネルデバッグできる環境を使って、カーネルの解析等を行ってきた。UMLの環境は、VMWare Server上のUbuntu 8.0.4に構築していたが、最近、起動しなってしまった。これまでKVM(Kernel-based Virtual Machine)に興味があった…
以前のエントリーで、BtrfsにBUG_ONマクロが散見されることについて書いた。この件について、#btrfsのIRCチャネルでBUG_ONについて質問してみた。でも、IRCではほしい答えが得られなかったので、Btrfsの開発メーリングリストに質問を投げてみた。 On Removin…
タイトルはちょっと大げさだけど、btrfs-unstableブランチとメインラインに動きがあったので、今回はその紹介。実は、Btrfsの開発ブランチである git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable は今年の7月中旬頃から全然更新されな…
BUG_ONマクロは、Linuxカーネルにおいて、引数に与えられた式を評価した結果が真となることが想定されない箇所(つまり、真ならバグ)で使われる。簡単に言うと、Cのassertのようなもの。ただし、assertよりもきつくて、BUG_ONの引数が真になると、カーネルパ…
久しぶりに、Linuxカーネルのメインラインをgit pullして、UMLカーネルをビルドしようとしたら、ビルドに失敗してしまった。原因はビルドできない壊れたコードがメインラインに入ってしまったため。今回は、ビルドできるようになるまでにやったことから、手…
以前、LinuxカーネルHack: ビルド時間の短縮を求めて でmakeの並列ビルドオプションを使ってビルドの高速化を試みた。今回は、カーネルモジュール開発でのビルド時間短縮を考える。今回紹介するテクニックは、デバイスドライバやファイルシステムなどのカー…
前回、カーネルモジュールをUMLでいじれるようになったので、次は何をしようかと思って、今回はLZOで遊んでみることにした。最初は、zlibで遊ぼうかと思ったけれども、ちょっと違う方が面白そうだったので。それに、BtrfsのWikiの「Project ideas」(https://…
今回は、カーネルからexportされている様々な関数(機能)にアクセスして実験するための準備として、カーネルモジュールを作成する。UML上でカーネルモジュールのビルド、組み込み(insmod)、解放(rmmod)ができるようにする。以下の操作はすべてUML上にて行う。…
今回は、Btrfsからちょっと脱線して、より深いところにある、UMLのブロック型デバイスドライバに寄り道してみることにした。 サマリー UMLではUBD(UML Block Deviceの略?)というブロック型デバイスドライバが仮想ドライブとしての役割を果たしている。 UBDで…
前回、Btrfsのmount後に様々なカーネルスレッドが起動されることを発見した。今回はその続きで、これらのカーネルスレッドを掘り下げて見ていく。全体的な構造が見えてきたけど、それぞれのカーネルスレッドでの処理の理解までにはいたっていない。 サマリー…
サマリー mountコマンドを実行すると、mount(2)が実行される。mount(2)があることをはじめて知った。http://linux-documentation.com/en/man/man2/mount.html Btrfsをmountできるようにするには予めカーネルに認識させる必要がある。init_btrfs_fsにてregist…
はじめに 今回は、UML+GDBでBtrfsをデバッグできるようにしてみる。途中で失敗して多少遠回りになったけれども、デバッグはできるようになった。なお、Ubuntu 10.10でのUMLの開発環境がまだ整備できていないので、これまで使ってきたUbuntu 8.04のUMLの環境…
VirtualBoxにインストールしたUbuntu 10.10(ホスト名は適当にmonkeyにしてみた)でBtrfsを早速試してみる。ちなみに、現在利用中のVirtualBoxのバージョンは3.2.8 r64453。まずは、VirtualBoxで仮想ドライブを追加。 Oracle VM VirtualBox > [Ubuntu 10.10のV…
Linuxカーネルの探索をはじめて1ヶ月が経過したので、今回はその振り返り。こうやってまとめてみると、1ヶ月あれば結構いろいろできるなぁと思った。 やったこと ビルド UMLカーネル UML(User Mode Linux)を使うことで、GDBを使いながらカーネルを効率よく解…
昨日からLKMLの購読をはじめた。がんがんメールが飛んでくる。つい最近届いた「[PATCH 01/10] Fs: ext4: acl.c: fixed indent issue」というメールがあって、内容を見ると、単にインデントを修正しただけという内容。 Found and corrected indent issue usin…
svn blameは日常良く使うけど、gitでも同じことができるか調べたら、やっぱりできた。git blameで。git blameは、横幅かなり取るなぁ。 % git blame mm/oom_kill.c ^1da177e (Linus Torvalds 2005-04-16 15:20:36 -0700 1) /* ^1da177e (Linus Torvalds 2005…
どうしたらもっと効率よくカーネルのコードを読めるか?という問題意識を持ちながらgit logのmanを読んでいたら、使えそうなオプションをいくつか発見。それらのオプションを、普段、カーネルのコードを読むにあたって、いくつかのユースケースに当てはめて…
前回のエントリーからの続き。GNU Globalで"ICMP_MIB_OUTERRORS"のシンボルを検索してみる。以下の3つがヒットした。 ICMP_MIB_OUTERRORS 76 include/linux/snmp.h ICMP_MIB_OUTERRORS, /* OutErrors */ ICMP_MIB_OUTERRORS 337 net/ipv4/icmp.c icmp_param-…
最近ICMP周辺をうろうろしている。今日もICMP。でも、netstatとのつながりが見えて、少しだけ視野が広がった。ネタを見つけようと、net/ipv4/icmp.cのコミットログを眺めていると気になるコメントを見つけた。「LANG=C netstat -s | grep "ICMP messages fai…
前回はICMPヘッダーのチェックサムを壊すことができたので、今回は、ICMPヘッダーの中を見ていく。(普通順序は逆)前回に引き続き、icmp_push_reply()を見ていく。icmp_push_reply()の「struct icmphdr *icmph = icmp_hdr(skb);」でソケットバッファ(skb)から…
ICMP Replyパケットに含まれるチェックサムを意図的に壊したらどうなるのだろう?と思って、試してみることにした。net/ipv4/icmp.cを眺めながら、チェックサムを入れている所を探す。どうやら、icmp_push_reply()でICMPヘッダーのチェックサムを入れている…
カーネルをcleanな状態からフルビルドすると、それなりに時間がかかる。フルビルドはそんなに頻繁に行わないけれども、少しでもビルド時間でまたされる時間を少しでも短縮しておきたい。makeには並列ビルドをするために-jオプションが用意されている。-jオプ…
この前gccの最適化によってgdbでnet構造体が見られない(http://d.hatena.ne.jp/fixme/20100905/1283686298)というのがあったけど、このページ(http://blog.kmckk.com/archives/2663340.html)の解説どおりに試したら、すんなりうまくいった。そのメモ。例えば…
git pullしたら2.6.36-rc4になった。何か面白そうな変更はあるかな。 % git pull 2>&1 | tee pull.20100914.log remote: Counting objects: 868, done. remote: Compressing objects: 100% (117/117), done. remote: Total 556 (delta 456), reused 536 (del…
2.6.35から入ったRPS(Receive Packet Steering)とRFS(Receive Flow Steering)のコードをEmacsで読んでたら、実際にgdbで追ってみたくなった。 http://kernelnewbies.org/Linux_2_6_35#head-94daf753b96280181e79a71ca4bb7f7a423e302agdbでnetif_rxにブレーク…
いつものように、git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.gitをgit pullしてみた。そうすると、気になる更新があった。security/apparmor。なぜ気になったかというと、AppArmorはメインラインにはまだマージされてないものだと思…
このドキュメントからリンクされている、2.6.35における主要なコミットを読んでみると面白そう。 http://kernelnewbies.org/Linux_2_6_35「1.1. Transparent spreading of incoming network traffic load across CPUs」は面白そうな変更。Googleのエンジニア…
はじめに はてなダイアリーのスーパーpre記法(ブログ本文にソースコード等を貼り付けるための記法)で始まるテキストがクリップボードに入った状態で、間違って、gdbのシェルに貼り付けてしまった。そしたら、見たことの無い画面が出現。これは便利すぎる。 L…
はじめに 前回に引き続き、ICMPまわりを追っていこうとしたら、大幅に脱線して、procファイルシステムに到着。 カーネルを少しいじりつつ、gdbの変数監視機能(watch)を利用することで、/proc/sys/net/ipv4/icmp_echo_ignore_allへの書き込みを監視することに…
はじめに UML上でネットワークに接続できるようになったので、ネットワークまわりで遊んでみる。 今回は、gdbでICMPパケット受信処理に人間が介入することで、pingの応答時間がインタラクティブに変わる様子を観察する。 失敗 gdbからlinuxプロセスを起動す…