2010-01-01から1年間の記事一覧

LinuxカーネルHack: GDBとKVMによるカーネルデバッグ

これまでUML(User Mode Linux)でカーネルデバッグできる環境を使って、カーネルの解析等を行ってきた。UMLの環境は、VMWare Server上のUbuntu 8.0.4に構築していたが、最近、起動しなってしまった。これまでKVM(Kernel-based Virtual Machine)に興味があった…

LinuxカーネルHack: BtrfsのBUG_ONマクロ撲滅運動

以前のエントリーで、BtrfsにBUG_ONマクロが散見されることについて書いた。この件について、#btrfsのIRCチャネルでBUG_ONについて質問してみた。でも、IRCではほしい答えが得られなかったので、Btrfsの開発メーリングリストに質問を投げてみた。 On Removin…

LinuxカーネルHack: Btrfs開発最新動向(2010/10/31)

タイトルはちょっと大げさだけど、btrfs-unstableブランチとメインラインに動きがあったので、今回はその紹介。実は、Btrfsの開発ブランチである git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable は今年の7月中旬頃から全然更新されな…

LinuxカーネルHack: Btrfsのコードに散りばめられたBUG_ONマクロが示す兆候

BUG_ONマクロは、Linuxカーネルにおいて、引数に与えられた式を評価した結果が真となることが想定されない箇所(つまり、真ならバグ)で使われる。簡単に言うと、Cのassertのようなもの。ただし、assertよりもきつくて、BUG_ONの引数が真になると、カーネルパ…

LinuxカーネルHack: GMailで購読中のMLに投げられたパッチをLinuxカーネルに適用する方法

久しぶりに、Linuxカーネルのメインラインをgit pullして、UMLカーネルをビルドしようとしたら、ビルドに失敗してしまった。原因はビルドできない壊れたコードがメインラインに入ってしまったため。今回は、ビルドできるようになるまでにやったことから、手…

LinuxカーネルHack: ビルド時間の短縮を求めて(カーネルモジュール編)

以前、LinuxカーネルHack: ビルド時間の短縮を求めて でmakeの並列ビルドオプションを使ってビルドの高速化を試みた。今回は、カーネルモジュール開発でのビルド時間短縮を考える。今回紹介するテクニックは、デバイスドライバやファイルシステムなどのカー…

LinuxカーネルHack: LZOリアルタイムデータ圧縮ライブラリをカーネルモジュールから使う実験

前回、カーネルモジュールをUMLでいじれるようになったので、次は何をしようかと思って、今回はLZOで遊んでみることにした。最初は、zlibで遊ぼうかと思ったけれども、ちょっと違う方が面白そうだったので。それに、BtrfsのWikiの「Project ideas」(https://…

LinuxカーネルHack: UML上で動作するカーネルモジュールの作成

今回は、カーネルからexportされている様々な関数(機能)にアクセスして実験するための準備として、カーネルモジュールを作成する。UML上でカーネルモジュールのビルド、組み込み(insmod)、解放(rmmod)ができるようにする。以下の操作はすべてUML上にて行う。…

LinuxカーネルHack: UMLのブロック型デバイスドライバUBDで遊ぶ

今回は、Btrfsからちょっと脱線して、より深いところにある、UMLのブロック型デバイスドライバに寄り道してみることにした。 サマリー UMLではUBD(UML Block Deviceの略?)というブロック型デバイスドライバが仮想ドライブとしての役割を果たしている。 UBDで…

LinuxカーネルHack: Btrfsのmount時に起動されるカーネルスレッドの解析

前回、Btrfsのmount後に様々なカーネルスレッドが起動されることを発見した。今回はその続きで、これらのカーネルスレッドを掘り下げて見ていく。全体的な構造が見えてきたけど、それぞれのカーネルスレッドでの処理の理解までにはいたっていない。 サマリー…

LinuxカーネルHack: Btrfsにおけるmount周辺の解析

サマリー mountコマンドを実行すると、mount(2)が実行される。mount(2)があることをはじめて知った。http://linux-documentation.com/en/man/man2/mount.html Btrfsをmountできるようにするには予めカーネルに認識させる必要がある。init_btrfs_fsにてregist…

LinuxカーネルHack: GDBでBtrfsをデバッグする

はじめに 今回は、UML+GDBでBtrfsをデバッグできるようにしてみる。途中で失敗して多少遠回りになったけれども、デバッグはできるようになった。なお、Ubuntu 10.10でのUMLの開発環境がまだ整備できていないので、これまで使ってきたUbuntu 8.04のUMLの環境…

LinuxカーネルHack: Btrfsを試す

VirtualBoxにインストールしたUbuntu 10.10(ホスト名は適当にmonkeyにしてみた)でBtrfsを早速試してみる。ちなみに、現在利用中のVirtualBoxのバージョンは3.2.8 r64453。まずは、VirtualBoxで仮想ドライブを追加。 Oracle VM VirtualBox > [Ubuntu 10.10のV…

LinuxカーネルHack: 1ヶ月の活動の振り返りとこれからの展望

Linuxカーネルの探索をはじめて1ヶ月が経過したので、今回はその振り返り。こうやってまとめてみると、1ヶ月あれば結構いろいろできるなぁと思った。 やったこと ビルド UMLカーネル UML(User Mode Linux)を使うことで、GDBを使いながらカーネルを効率よく解…

LinuxカーネルHack: scripts/checkpatch.plでパッチスタイルの適合性を判定する

昨日からLKMLの購読をはじめた。がんがんメールが飛んでくる。つい最近届いた「[PATCH 01/10] Fs: ext4: acl.c: fixed indent issue」というメールがあって、内容を見ると、単にインデントを修正しただけという内容。 Found and corrected indent issue usin…

LinuxカーネルHack: git blameとその応用

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…

LinuxカーネルHack: Gitを活用して特定のコミッターのコードをまとめて読む

どうしたらもっと効率よくカーネルのコードを読めるか?という問題意識を持ちながらgit logのmanを読んでいたら、使えそうなオプションをいくつか発見。それらのオプションを、普段、カーネルのコードを読むにあたって、いくつかのユースケースに当てはめて…

LinuxカーネルHack: ICMP_MIB_OUTERRORS発、/proc/net/snmp行き

前回のエントリーからの続き。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-…

LinuxカーネルHack: netstat -sの統計情報とnet/ipv4/icmp.cの意外なつながり

最近ICMP周辺をうろうろしている。今日もICMP。でも、netstatとのつながりが見えて、少しだけ視野が広がった。ネタを見つけようと、net/ipv4/icmp.cのコミットログを眺めていると気になるコメントを見つけた。「LANG=C netstat -s | grep "ICMP messages fai…

LinuxカーネルHack: ICMPヘッダーの調査(GDBで任意のメモリーをArtificial Arraysとして生バイト列で見る)

前回はICMPヘッダーのチェックサムを壊すことができたので、今回は、ICMPヘッダーの中を見ていく。(普通順序は逆)前回に引き続き、icmp_push_reply()を見ていく。icmp_push_reply()の「struct icmphdr *icmph = icmp_hdr(skb);」でソケットバッファ(skb)から…

LinuxカーネルHack: ICMPパケットのチェックサムを壊す実験

ICMP Replyパケットに含まれるチェックサムを意図的に壊したらどうなるのだろう?と思って、試してみることにした。net/ipv4/icmp.cを眺めながら、チェックサムを入れている所を探す。どうやら、icmp_push_reply()でICMPヘッダーのチェックサムを入れている…

LinuxカーネルHack: ビルド時間の短縮を求めて

カーネルをcleanな状態からフルビルドすると、それなりに時間がかかる。フルビルドはそんなに頻繁に行わないけれども、少しでもビルド時間でまたされる時間を少しでも短縮しておきたい。makeには並列ビルドをするために-jオプションが用意されている。-jオプ…

LinuxカーネルHack: 特定ファイルのコンパイルオプション変更

この前gccの最適化によってgdbでnet構造体が見られない(http://d.hatena.ne.jp/fixme/20100905/1283686298)というのがあったけど、このページ(http://blog.kmckk.com/archives/2663340.html)の解説どおりに試したら、すんなりうまくいった。そのメモ。例えば…

LinuxカーネルHack: 今日のgit pull

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…

LinuxカーネルHack: UMLではSMPの設定ができない?

2.6.35から入ったRPS(Receive Packet Steering)とRFS(Receive Flow Steering)のコードをEmacsで読んでたら、実際にgdbで追ってみたくなった。 http://kernelnewbies.org/Linux_2_6_35#head-94daf753b96280181e79a71ca4bb7f7a423e302agdbでnetif_rxにブレーク…

LinuxカーネルHack: 今日のgit pullで気になったAppArmor

いつものように、git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.gitをgit pullしてみた。そうすると、気になる更新があった。security/apparmor。なぜ気になったかというと、AppArmorはメインラインにはまだマージされてないものだと思…

LinuxカーネルHack: 2.6.35の主要なコミットを読みたい

このドキュメントからリンクされている、2.6.35における主要なコミットを読んでみると面白そう。 http://kernelnewbies.org/Linux_2_6_35「1.1. Transparent spreading of incoming network traffic load across CPUs」は面白そうな変更。Googleのエンジニア…

GDBの便利技: (gdb)> でコードビューアを立ち上げて快適デバッグ

はじめに はてなダイアリーのスーパーpre記法(ブログ本文にソースコード等を貼り付けるための記法)で始まるテキストがクリップボードに入った状態で、間違って、gdbのシェルに貼り付けてしまった。そしたら、見たことの無い画面が出現。これは便利すぎる。 L…

LinuxカーネルHack: ICMPエコー発、procファイルシステム着 (gdbのwatchを使うよ)

はじめに 前回に引き続き、ICMPまわりを追っていこうとしたら、大幅に脱線して、procファイルシステムに到着。 カーネルを少しいじりつつ、gdbの変数監視機能(watch)を利用することで、/proc/sys/net/ipv4/icmp_echo_ignore_allへの書き込みを監視することに…

LinuxカーネルHack: gdbでICMPパケットの受信処理に割り込んでpingと戯れる

はじめに UML上でネットワークに接続できるようになったので、ネットワークまわりで遊んでみる。 今回は、gdbでICMPパケット受信処理に人間が介入することで、pingの応答時間がインタラクティブに変わる様子を観察する。 失敗 gdbからlinuxプロセスを起動す…