カーネルやシステムコールはプログラムが機能を提供する上でなくてはならない存在です。これらを理解することで、プログラムでどのようにデバイス操作や、ファイルシステムの操作をしているかがわかるようになります。
カーネルとは
カーネルはOSの基本機能の役割を担うソフトウェアのことを言う。
なぜカーネルが必要かと言うと、例として、デバイスにアクセスをする場合に、命令の順序が正しくないと危険だったり、本来アクセスする権限がないプログラムがデバイスにアクセスできてしまう問題がある。
CPUにはユーザーモードとカーネルモードの2つのモードがある。
- ユーザーモード:プロセスはユーザーの空間で実行している。ユーザーモードはデバイスにアクセスできずに、カーネルを介してデバイスにアクセスする。
- カーネルモード:何の制限もなく実行ができる。カーネルのみがカーネルモードで動作してデバイスにアクセスできる
システムコールとは
システムコールはプロセスがカーネルに処理を依頼するための方法。
プロセスはユーザーモードで実行しているが、システムコールをすると、CPUにおいて例外(実行中のコードに割り込んで別の処理を実行する)イベントが発生してCPUのモードがユーザーモードからカーネルモードに遷移して、依頼された内容のカーネルの処理が実行される。
システムコールの例
- プロセス生成、削除
- メモリ確保、解放
- 通信処理
- ファイルシステム操作
- デバイス操作
デバイスアクセス
前節でシステムコールの例にデバイスの操作ができると書いていましたが、どのように実行されているかを説明していきます。
デバイスファイルはデバイスごとに存在して、LInuxではプロセスがデバイスファイルに操作すると、カーネルの中のデバイスドライバというソフトウェアがユーザーの代わりにデバイスにアクセスをする。
デバイスファイルは/devディレクトリ配下に置かれている。
% ls -l /dev/
total 0
crw------- 1 root wheel 0x14000001 6 1 08:20 afsc_type5
brw-r----- 1 root operator 0x1000000 6 1 08:20 disk0
デバイスファイルには次のような情報が保持されている。
- ファイルの種類:頭にcがついていたらキャラクタデバイス、bがついていたらブロックデバイス
- デバイスのメジャー番号、マイナー番号:組み合わせが同じなら同じデバイスを見ていて、違えばそれぞれ違うデバイスを見ている
キャラクタデバイス、ブロックデバイス
キャラクタデバイスは読み出しと書き込みができるが、読み出し・書き込みの目標位置に移動できない。例として、キーボードやマウスになります。
ブロックデバイスは、読み出しと書き込みも読み出し・書き込みの目標位置に移動できます。例として、HDDやSSDなどのストレージデバイスになります。
理解度チェック
今回の内容がわかっているかの問題を作成しています。
問題をクリックすると、答えが表示されますので、今回の内容を理解できたかチェックをしてみてください。
まとめ
今回はカーネルやシステムコールについて解説をしてきました。今回のような低レイヤーな話はプログラムを書いていてるだけだと、気にすることが少ないのですが、プログラムがどのように動いているかを知ることで、技術力が向上するので、この記事で興味わいたら、参考に書いてある書籍を読んでみることをオススメします。
また低レイヤーの知識として他にもCPUやメモリとは何かについて書いている記事がありますので、そちらを読んでもらえたらと思います。
【おすすめ記事のリンク】
コメント