Kernel Module実戦ガイド(二):カーネルモジュールとアプリケーションの違い

2347 ワード

原文アドレス:Kernel Module実戦ガイド(二):カーネルモジュールとアプリケーションの違い
Introduction
最初のカーネルモジュールHello Worldを書いた!カーネルモジュールとアプリケーションの書き方の違いは見つかりましたか?カーネルモジュールとアプリケーションがなぜ異なるのかを概念と原理から紹介します.
カーネルモジュールとアプリケーションの違い
出入り口
アプリケーションのエントリは常にmain()関数であり、エクスポートはmain()関数のreturnです.カーネルモジュールのエントリはinit_module()で、出口はcleanup_module().
関数ライブラリ
アプリケーションはprintf()などの多くのC標準ライブラリの関数を呼び出すことができます.これらの関数はlibcにコンパイルされ、コードがコンパイルされたリンクフェーズにある場合にのみlibcの実際の関数アドレスにバインドされます.カーネルモジュールは異なり、カーネルには標準ライブラリは存在せず、printf()のような関数はありません.ただし、カーネルにはいくつかの関数/記号があります.次のコマンドで確認できます.
$ cat /proc/kallsyms | grep printk
...
0000000000000000 T printk
0000000000000000 T printk_emit
...

すべてのカーネルで使用できる関数/記号は/proc/kallsymsにあります.言い換えれば、ここ以外の関数/記号は使用できません.
CPU実行モード
Intel x 86アーキテクチャでは、ring 0-ring 3とも呼ばれる4つのモードがあり、モード間の権限が異なります.ここでの権限は、読み書きメモリ、読み書きハードディスクなどのハードウェアデバイスの操作を指します.Linuxは、カーネルモード/特権モード/supervisor mode/ring 0と、ユーザモード/非特権モード/user mode/ring 3の2つのモードを使用します.アプリケーションが実行するコードは、呼び出されたC標準ライブラリを含めて、ユーザーモードで実行されます.カーネルモジュールが走るコードは、カーネルモードを走っています.ユーザモードはカーネルモードに入りたいが,エントリの1つはシステム呼び出し関数である.
ユーザ状態とカーネル状態のインタラクション
ユーザ状態とカーネル状態がインタラクティブになる方法の1つは、上述したシステム呼び出し関数です.システム呼び出し関数とは?libc呼び出しの下層関数は、libcにおけるopen()のようなシステム呼び出し関数の実装であり、最終的にはシステム呼び出し関数を呼び出す必要があると簡単に考えることができます.NR_Open()は、カーネルに入り、カーネル状態でハードディスクにアクセスし、ファイルを開きます.もう1つの方法は、Linuxのデバイスドライバが/devの下に格納され、ユーザ状態プログラムとデバイスドライバが相互作用すると、デバイスドライバはカーネル状態でコードロジックを実行し、結果をユーザ状態に返すデバイスドライバである.
デバイスドライバ
HDDドライブを表示するには、次の手順に従います.
$ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 Jan 26 23:00 /dev/sda
brw-rw---- 1 root disk 8, 1 Jan 26 23:00 /dev/sda1
brw-rw---- 1 root disk 8, 2 Jan 26 23:00 /dev/sda2
brw-rw---- 1 root disk 8, 3 Jan 26 23:00 /dev/sda3

sdaが見つからない場合はls-l/dev/hda*を問い合わせることができます.ここでは、列の意味を簡単に紹介する必要があります.第1列のbは、blockを意味し、コードというデバイスはブロックデバイス(c,char文字デバイスに対応)である.
≪ブロック・デバイス|Block Devices|emdw≫:記憶単位は通常、固定サイズのブロックであり、ランダムな読み書きをサポートします.リード/ライトリクエストにキャッシュがある場合は、最適な場所ストレージを選択できます.(ハードディスク(HDD)のアドレスアルゴリズムは思いませんか?)文字デバイス:サイズが不定で、ストリームデータを格納し、一般的にランダムな読み書きはサポートされず、順序の読み書きのみがサポートされます.
8の意味は、ドライバのプライマリ・バージョン番号は8で、このプライマリ・バージョン番号はカーネルに表示されます.次の0-3の意味は、サブバージョン番号は0-3で、このサブバージョン番号はデバイスドライバに見せて、カーネルは関心がありません.ここはレンガを投げて玉を迎えるだけで、後で設備の駆動を詳しく紹介します.
Summary
カーネルモジュールにさらに深く入り込み,カーネルモジュールとアプリケーションの違いを紹介した.概念的な内容は多いが,カーネルモジュールを理解するためには必ず通らなければならない道である.