本日発売の Software Design 2009/12 月号にメモリ管理の記事をかかせて頂きました

色々ご縁がありまして、id:syuu1228 さんと一緒に Software Design 2009/12月号の Linux カーネルの特集にメモリ管理の記事をかかせて頂きました.

Software Design (ソフトウェア デザイン) 2009年 12月号 [雑誌]

Software Design (ソフトウェア デザイン) 2009年 12月号 [雑誌]

目次は以下のようになっています.

特集 何が,なぜ,どうなっているのか 教えて!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 の一覧は以下の通りです:

  1. hrtimer_init
    • hrtimer 構造体の初期化を行う.
  2. hrtimer_start
  3. hrtimer_try_to_cancel
    • 高精度カーネルタイマのキャンセルを試みる. コールバック処理が実行中だったら、あきらめる.
  4. hrtimer_cancel
    • 高精度カーネルタイマのキャンセル. 成功するまで hrtimer_try_to_cancel し続ける.
  5. hrtimer_get_remaining
    • タイマが起動するまでの残り時間を、 ktime_t 型で返す.
  6. 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 };

*1:どうもPOSIXタイマtimer_crateなどを実装するために導入されたように見えます.

カーネルタイマー add_timer のコールバックの仕組み(途中)

現状のLinuxには、2種類のカーネルタイマがあります.

  1. timer_list構造体を使用するカーネルタイマ.
  2. hrtimer構造体を使用する高精度カーネルタイマ(hrtimer).

今回は、前者について調べてみました.

呼び出しの仕組み

カーネルタイマの基本的な呼び出しフローは、以下のようになっています.

  1. init_timer で構造体を初期化
  2. add_timer で監視リストに追加.
  3. 以下の3つのうち、どれかが発生.
    • イベントが発生し、コールバックされる. リストから削除される.
    • mod_timer が呼ばれ、再度要求を投げる.
    • del_timer が呼ばれ、要求が監視リストから削除される.


個々のケースを追っていきたいと思います.

イベントが発生した場合

(途中)

タイマイベントの監視方法

タイマイベントの監視はどのように行っているのでしょうか. 従来のタイマの場合、 tick ベースで動作しますから、タイマ割り込みのタイミングでtimer_listを走査しているような気がします.

(続く)

hrtiemr

Qemu に VNC オプションつけたときに、Grubの画面で矢印キーがきかなくなる

QemuVNC オプションつけたときに、Grubの画面で矢印キーがきかなくなるという問題があったのですが、Qemuの起動オプションに

-k ja

をつけると、日本語キーボード対応してくれて、動くようになります. ちなみに、-vnc オプションは -kernel オプションと一緒には動かないみたいです. ぐぬぬ.

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℃くらいになっていました...修理に出そう.