Linux Device Driver 輪講 2. モジュールの作成と実行

Slides:



Advertisements
Similar presentations
ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
Advertisements

TeX で数式を書くための PowerPoint アドイン Ver (2011/06/26) Ver. 0.1 (2007/5/30)
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
Generic programming と STL
■プロセスとfileの関係 プロセスが一つファイルをオープンすると以下のようなデータ構造が作られる。
PROCESS 14:一般情報(2) InstallShieldLecture
榮樂 英樹 LilyVM と仮想化技術 榮樂 英樹
Android と iPhone (仮題) 情報社会とコンピュータ 第13回
中村孝介(九州工業大学) 光来健一(九州工業大学/JST CREST)
JTAG ICEによる 組み込みLinuxデバッグ
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
オペレーティングシステム (OSの機能と構造)
App. A アセンブラ、リンカ、 SPIMシミュレータ
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
Linuxカーネルについて 2014/01.
オペレーティングシステム i386アーキテクチャ(2)
CC/7700,CC32を用いた データ収集システム 筑波大学 木村 博美 小松原 哲郎 (c)2007 木村博美 筑波大学.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネストした仮想化を用いた VMの安全な帯域外リモート管理
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
補足説明.
コンパイラの解析 (2) GCJのデータ構造 - 1.
型付きアセンブリ言語を用いた安全なカーネル拡張
SpectreとMeltdown ITソリューション塾・第28期 2018年5月30日 株式会社アプライド・マーケティング 大越 章司
全体ミーティング 金田憲二.
分散IDSの実行環境の分離 による安全性の向上
関数の定義.
OSの仕組みとその機能 1E16M001-1 秋田 梨紗 1E16M010-2 梅山 桃香 1E16M013-3 大津 智紗子
オープンソフトウェア利用促進事業 第3回OSSモデルカリキュラム導入実証
インターネットにおける真に プライベートなネットワークの構築
実行時情報に基づく OSカーネルのコンフィグ最小化
Windows Vista ウィルスバスターインストール方法 ユーザーアカウント制御の無効化 ウィルスバスターのインストール
オペレーティングシステム イントロダクション
キャンパスクラウドによる 実験環境の構築 情報ネットワーク特論 講義資料.
Linux Device Driver 輪講 7. 時の流れ
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
オペレーティングシステム 第2回 割り込みとOSの構成
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
オペレーティングシステムJ/K 2004年11月15日2時限目
組込みシステムとは コンピュータ制御システム?
仮想環境を用いた 侵入検知システムの安全な構成法
C言語 はじめに 2016年 吉田研究室.
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
オペレーティングシステム (OSの機能と構造)
アルゴリズムとプログラミング (Algorithms and Programming)
実装について 前田俊行.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
オペレーティングシステムJ/K 2004年10月4日
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
6.5 セマフォ セマフォ(semaphore): 複数のタスク(もしくはスレッド)が「同期」または「相互排除」の制御のために取得(acquire)・リリース(release)できるカーネルオブジェクトの総称.
ネットワーク・プログラミング デバイスドライバと環境変数.
SpectreとMeltdown ITソリューション塾・第27期 2018年3月20日 株式会社アプライド・マーケティング 大越 章司
第5回 プログラミングⅡ 第5回
Microsoft® Office® 2010 トレーニング
強制パススルー機構を用いた VMの安全な帯域外リモート管理
Make の使い方.
モジュール分割.
オペレーティングシステム (OSの機能と構造)
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
L4-Linux のメモリ管理における問題点とその解決策
printf・scanf・変数・四則演算
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

Linux Device Driver 輪講 2. モジュールの作成と実行 ACE suzuk

table of contents テスト用システムのセットアップ Hello Worldモジュール モジュール対アプリケーション コンパイルとロード カーネルシンボルテーブル 準備情報 初期化とシャットダウン モジュールパラメータ ユーザ空間を使う

1.テスト用システムのセットアップ Linuxドライバ実装&テスト環境を構築 2.6からはシステム上にカーネルツリーが必要 kernel.orgから2.6カーネルソースをDLし、/usr/src以下にインストールする 実行カーネルと同じバージョンのカーネルソースをインストールするのが望ましい

2.Hello Worldモジュール 2つの関数に注目 printk module_init (カーネルマクロ) モジュールのカーネルにロード時に実行 module_exit (カーネルマクロ) モジュールのカーネルからの削除時に実行 printk Cライブラリなしに実行するためのprintfに似た関数 モジュールがprintkを呼び出せるのはなぜ?  insmodでロードするとモジュールがカーネルにリンクされ、 カーネルのパブリックシンボルにアクセスできるようになるため

printkについてもう少し・・・ i.e. printk(KERN_ALERM “hello\n”); KERN_ALERM メッセージの重要度

3.モジュール対アプリケーション カーネルモジュールは全てイベントドリブン モジュールはカーネルだけにリンクされる カーネルヘッダ 終了関数は初期化関数で作成したオブジェクトを全て注意深く消去する必要がある システムリブートまで資源を解放できなくなるため モジュールはカーネルだけにリンクされる 呼び出せる関数はカーネルがエクスポートしたもの リンクすべきライブラリがない! 通常のヘッダファイルをインクルードしてはだめ! ライブラリがリンクされないため(stdarg.hはOK) カーネルヘッダ include/linux, include/asm カーネルサブシステムヘッダ 上記ディレクトリ以外のサブディレクトリ カーネルモジュールの深刻なエラーはシステム全体を巻き込む

カーネルモジュールの役目 カーネルの機能を拡張すること システムコールの一部として実行される 割り込み処理を担当する カーネル空間で実行される

ユーザ空間とカーネル空間 カーネルモードとユーザモード 異なるCPUのランレベルを利用する セキュリティと安全性のため異なる特権状態で命令を実行する 異なるCPUのランレベルを利用する Linuxでは特権モードと非特権モードの2つを使い分ける

カーネルモード あらゆるハードウェア資源にアクセス可能 オペレーティングシステムの実行モード プロセス プロセス プロセス ユーザモード システムコール カーネル カーネルモード デバイス

ユーザモード ハードウェア資源へのアクセスを制限・監視下でプログラムを実行 通常のプログラムの実行モード プロセス プロセス プロセス システムコール カーネル カーネルモード デバイス

CPUのランレベル 多くのCPUは2つ以上の実行モードを保有 実行レベルを使い分けることで安全性、安定性を向上させる Intel 80x86は4つの実行リング(特権の階層)を持つ ランレベル0をカーネルモード それ以上をユーザモードに割り当てる

カーネル内の並行処理 常に並行処理を意識した実装が必要 複数プロセスがドライバを同時に使用した時 デバイスの非同期の割り込み実行 ソフトウェア割り込み実行 カーネルタイマ(7章) マルチプロセッサ プリエンプティブ対応のリエントラントな実装 同時に複数のコンテキストで実行できなくてはだめ 共有データの安全性 競争状態の回避(実行順序の依存性をなくす)

カレントプロセス カーネルモジュールは、順々に実行されない カーネルの多くのアクションは個々のプロセスに関連付けられる ユーザプロセスと違う! カーネルの多くのアクションは個々のプロセスに関連付けられる currentグローバル変数でカレントプロセス情報を利用する asm/current.h, linux/sched.hを参照のこと linux/sched.hをincludeして参照できる printk(KERN_INFO “process is %s (pid:%i)\n”, current->comm, current->pid);

カーネルの海路に旅立つあなたへ 心に留めておくべき事柄 カーネルのスタックは非常に小さく、スタックを共有する必要がある 大きな自動変数は良くない! 大きな構造体の場合動的割り当てにする __(ダブルアンダースコア)関数の使用に注意 インタフェースの下位レベルコンポーネント 浮動小数点の計算ができない

4.コンパイルとロード カーネルソースはコンパイラに関して非常に多くの仮定を持つ(コンパイラ依存) Documentation/Changesに必要ツールとバージョンのリスト 全てを知りたい Documentation/kbuild以下を読む

モジュールのロードと削除 insmod (モジュールのロード) modprobe rmmod モジュールコードとデータをカーネルにロード モジュール内の未解決シンボルをカーネルのシンボルテーブルとリンクする ファイルでなくメモリイメージを修正する点がリンカと違う 全てを知りたい人kernel/module.cを参照! sys_init_module(systemcallには先頭がsys_) modprobe 他のモジュール依存を解決してからロード rmmod モジュールをカーネルから削除

helloworldのコンパイルとロード Makefile obj-m := helloworld.o コンパイル make -C /usr/src/linux-2.6.16 M=`pwd` modules ロードと削除 insmod ./helloworld.ko rmmod ./helloworld.ko 結果 /var/log/messages May 3 05:07:48 localhost kernel: Hello, world May 3 05:07:58 localhost kernel: Goodby, cruel world Makefileはサンプルを参照のこと

カーネルのバージョンへの依存性 カーネルのバージョンが変わるたびに再コンパイルする必要がある 複数バージョンに対応するには モジュールから見たカーネルインタフェースはバージョン毎にかなり変更される 複数バージョンに対応するには #ifdefとマクロを活用する

5.カーネルシンボルテーブル グローバルなカーネルアイテムのアドレステーブル 関数や変数のテーブル ロードされたモジュールのエクスポートされたシンボルは全てカーネルシンボルテーブルに追加される 通常はエクスポートする必要はない モジュールを積み重ねる(stack)こともできる USB入力デバイスモジュールはusbcoreとinputモジュールに積み重ねられる スタックされたモジュールにはmodprobeが便利 インストール済みモジュールだけ探索することに注意

5.カーネルシンボルテーブル 2 シンボルをエクスポート 宣言 モジュールのELFセクションにストアされる 5.カーネルシンボルテーブル 2 シンボルをエクスポート 宣言 EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name); モジュールのELFセクションにストアされる 全てを知りたい人はlinux/module.h 下位レベル のデバイス操作 parport_pc カーネルAPI (メッセージ出力、 ドライバ登録、 ポート割り当てなど) ポートの共有と デバイスの登録 parport lp ※パラレルポートドライバvモジュールのスタックの様子

6.準備情報 全てのモジュールで必要なヘッダ その他のヘッダ ライセンス指定 linux/module.h linux/init.h シンボルと関数の定義 linux/init.h 初期化とクリーンアップの関数指定 その他のヘッダ moduleparam.h モジュールロードにおけるパラメータ指定 ライセンス指定 MODULE_LICENSE(“GPL”); マクロで! フリーライセンス指定しないとロード時にカーネルが汚染されたと表示される

7.初期化とシャットダウン module_init(initfunc_name) module_exit(cleanupfunc_name) __initdataタグ 初期化の間だけ使用されるデータ module_exit(cleanupfunc_name) __exit cleanupfunc_name __exitはクリーンアップの際に使用されるものと宣言 facilityの登録 モジュールは多くの異なるfacilityを登録できる 装備には、facilityごとに特定の登録カーネル関数がある

初期化関数におけるエラー処理 常に戻り値をチェックしたエラー処理が必要 モジュールロードを継続できない場合は、そこまでの登録を取り消す エラー処理にはgoto文が有効

モジュールロード時の競争 facilityをサポートする内部の初期化手続きが完了するまで、そのfacilityを登録しない 初期化関数の実行が終了しない状態で、カーネルがモジュールを呼び出す可能性がある 初期化が決してエラーにならないようにする

8.モジュールパラメータ ロード時にinsmodかmodprobeで指定できる modprobeは/etc/modprobe.confからパラメータを読み取る module_param, module_param_arrayマクロを使う(moduleparam.hで定義) static char *whom = “world”; static int howmany = 1; module_param(howmany, int, S_IRUGO); module_param(whom, charp, S_IRUGO);

9.ユーザ空間を使う ユーザ空間ドライバの利点 ユーザ空間ドライバを書く場合・・・ Xサーバ Cライブラリをリンクできる 整備されたデバッガでデバックできる ハングしてもシステム全体に影響しない スワップできる(RAMを占有しない) デバイスの同時アクセスを許可できる ライセンスやカーネルインタフェースの変更問題をユーザ空間のオプションによって回避できる ユーザ空間ドライバを書く場合・・・ サーバプロセスをつくり、ハードウェアを制御する唯一の仕事人の役割をカーネルから引き継ぐ Xサーバ

9.ユーザ空間を使う 2 ユーザ空間ドライバの欠点 新しいデバイスを扱う場合は、まずはユーザ空間で実装するのも良い 割り込みを使えない 9.ユーザ空間を使う 2 ユーザ空間ドライバの欠点 割り込みを使えない IA32では、vm86システムコールがある メモリへの直接アクセスが/dev/memに対するmmapシステムコールのみしかない I/Oポートへのアクセスは、iopermかiopl呼び出し後にしか行えない 反応に時間がかかる ディスクスワップされている場合は特に! ネットワークインタフェースやブロックデバイスなどはユーザ空間で扱えない 新しいデバイスを扱う場合は、まずはユーザ空間で実装するのも良い