Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Linuxカーネルの インタフェースは変わりうる?

Linuxカーネルの インタフェースは変わりうる?

以下動画のスライドです。
https://youtu.be/i8zsuhX8xmk

Avatar for Satoru Takeuchi

Satoru Takeuchi PRO

August 25, 2026

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

  1. Linuxカーネルのインタフェースの種類 • ユーザが意識する外部インタフェース(e.g. システムコール, sysfs, procfs) ◦ ◦ ◦ ◦

    • 一般的なユーザが使用するようなものは通常互換性は保たれ続ける 開発初期の機能は変わることもある 誰も使ってないなどの理由によって稀に削除されることもある 詳細は公式ドキュメントを参照 ▪ Documentation/ABI/README カーネルのサブシステムが内部で使うインタフェース(API) ◦ ◦ 変わりうると明言されている (Documentation/process/stable-api-nonsense.rst) これをもって外部インタフェースが変わり得ると誤解している人が多い 2
  2. カーネルモジュール用にexportされているAPIも変わる • • Linuxはカーネルの機能をカーネルモジュールという形で挿入できる Linuxのソースに同梱されていなくてもカーネルモジュールは作れる ◦ • • • Linuxに同梱ではないカーネルモジュールを

    out-of-treeモジュールと呼ぶ カーネルモジュールを作るためにLinuxはAPIをexportしている このAPIもカーネルバージョンが違えば変わりうる カーネルバージョンが変わるとout-of-treeモジュールがビルドできなくなった…とい うことはザラに起きる ◦ 追従が大変! 3
  3. 例: 2012年に私が教育用に書いたカーネルモジュール … struct timer_list mytimer; #define MYTIMER_TIMEOUT_SECS 10 static

    void mytimer_fn(unsigned long arg) { printk(KERN_ALERT "10 secs passed.\n"); } static int mymodule_init(void) { init_timer(&mytimer); mytimer.expires = jiffies + MYTIMER_TIMEOUT_SECS*HZ; mytimer.data = 0; mytimer.function = mytimer_fn; add_timer(&mytimer); } … return 0; 4
  4. このようなことが起きたときの対処 • カーネルソース内の機能 ◦ ◦ ◦ • インタフェースを変えた人が全呼び出し箇所を置き換えることがある init_timer()のように新旧インタフェースをしばらく共存させて、いずれ全部新しいほうで置き換えるこ とがある

    どちらにせよ、いずれ対応される out-of-treeモジュール ◦ ◦ ◦ 気づかないうちにビルドできなくなっていることがある 定期的に追従できているか確認する必要がある 公式カーネルに取り込むと比較的楽ができる 7