本日発売の Software Design 2009/12 月号にメモリ管理の記事をかかせて頂きました
色々ご縁がありまして、id:syuu1228 さんと一緒に Software Design 2009/12月号の Linux カーネルの特集にメモリ管理の記事をかかせて頂きました.
Software Design (ソフトウェア デザイン) 2009年 12月号 [雑誌]
- 出版社/メーカー: 技術評論社
- 発売日: 2009/11/18
- メディア: 雑誌
- 購入: 4人 クリック: 44回
- この商品を含むブログ (10件) を見る
目次は以下のようになっています.
特集 何が,なぜ,どうなっているのか 教えて!Linuxカーネルのしくみ
〜プロセス/メモリ/デバイス管理,ファイルシステム〜第1章 Linux 発展の歴史
第2章 Linux の起動プロセス
第3章 プロセス管理とスケジューリング
第4章 メモリ管理と仮想記憶
第5章 ファイルシステム徹底仮説
第6章 Linuxにおけるデバイス管理
ソースコードレベルの挙動を文章に落とし込むことはあまりやったことがなかったので、かなり貴重な体験をさせて頂きました. 今回の執筆にあたり、 kosakiさん、takeoka さん、syuu1228 さん、研究室の皆さんを始めとした多くの方に、お忙しい中内容のチェックをして頂き、大変感謝しております. ありがとうございました. 記事は Linux カーネル 2.6.31.4 ベースに書いていたので、新しい話にも追従できているのではないかと思います. もし、この本があなたのカーネルハックの第一歩になれば幸いです.
高精度カーネルタイマ hrtimer のコールバックの仕組み(途中)
hrtimer は、 tick ベースの timer_list を用いた従来のカーネルタイマよりも、よりきめ細やかにタイマ管理を行いたい、というニーズに合わせて実装されました*1. カーネルタイマはタイマ割り込みのカウンタ jiffies が指定した値になると起動しますが、hrtimerでは ktime_t という単位を使ってコールバックが発生する時間を指定します.
hrtimerを使うための api の一覧は以下の通りです:
- hrtimer_init
- hrtimer 構造体の初期化を行う.
- hrtimer_start
- 高精度カーネルタイマの開始.
- hrtimer_try_to_cancel
- 高精度カーネルタイマのキャンセルを試みる. コールバック処理が実行中だったら、あきらめる.
- hrtimer_cancel
- 高精度カーネルタイマのキャンセル. 成功するまで hrtimer_try_to_cancel し続ける.
- hrtimer_get_remaining
- タイマが起動するまでの残り時間を、 ktime_t 型で返す.
- hrtimer_forward
- 現在時刻から、 ktime_t 分だけタイマの起動時間を進める.
その他、ktime_t と timespec 構造体の変換や、ktime_tの計算を行うための関数がいくつか用意されています.
(続く)
ktime_t の定義
// linux-2.6.27.8/linux/ktime.h 46 union ktime { 47 s64 tv64; 48 #if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR) 49 struct { 50 # ifdef __BIG_ENDIAN 51 s32 sec, nsec; 52 # else 53 s32 nsec, sec; 54 # endif 55 } tv; 56 #endif 57 };
カーネルタイマー add_timer のコールバックの仕組み(途中)
今回は、前者について調べてみました.
呼び出しの仕組み
カーネルタイマの基本的な呼び出しフローは、以下のようになっています.
- init_timer で構造体を初期化
- add_timer で監視リストに追加.
- 以下の3つのうち、どれかが発生.
- イベントが発生し、コールバックされる. リストから削除される.
- mod_timer が呼ばれ、再度要求を投げる.
- del_timer が呼ばれ、要求が監視リストから削除される.
個々のケースを追っていきたいと思います.
イベントが発生した場合
(途中)
タイマイベントの監視方法
タイマイベントの監視はどのように行っているのでしょうか. 従来のタイマの場合、 tick ベースで動作しますから、タイマ割り込みのタイミングでtimer_listを走査しているような気がします.
(続く)
hrtiemr
PCが突然落ちる!
PCが突然落ちるという状態になってしまったので、原因究明のために lm-sensors というパッケージを導入.
sudo aptitude install lm-sensors sudo sensors-detect # 基本全部デフォルトでOK(ひたすらEnter!) #----cut here---- it87 coretemp #----cut here---- sudo insmod it87 && sudo insmod coretemp sudo sensors # 温度などが出る
結果として出る温度表示が、90℃くらいになっていました...修理に出そう.