システムコール
ソフトウェアはハードウェアを操作することで、その役割を果たします。 例えば、キーボードから入力を受け付けたり、ディスプレイにデータを出力したり、ソフトウェアはハードウェアがあってはじめて成り立つわけです。 しかしアプリケーションはハードウェアを直接操作することはできません。 ハードウェアと直接やりとりできるのはカーネルだけです。 つまり、ソフトウェアはハードウェアを操作したいとき、カーネルに処理を依頼して、間接的に操作することになります。 では、カーネルに処理を依頼するにはどうしたら良いのでしょうか。 その方法が「システムコール」です。 システムコールの「システム」はここでは「カーネル」と捉え、「カーネルをコール」すると考えるとわかりやすいです。 システムコールには下記のような種類が用意されています。 ・open ・close ・read ・write ・ioctl ・fork ・exec ・stat ・unlink etc 上記したのは一部であり、他にもたくさんあります。 ソフトウェアはこのようなシステムコールを介して、ハードウェアを操作することになります。
API
API(Application Programming Interface)とは、アプリケーションから利用できる、OSやプログラミング言語で用意されたライブラリなどの機能の入り口(インターフェイス)のことです。 例えば、C言語のライブラリのAPIは関数やマクロであり、カーネルのAPIはシステムコールとなります。 当然、APIは自作することもできます。 自作のモジュールが他のモジュールに関数を提供するケースを考えた場合、他のモジュールに公開する関数がAPIとなります。 APIとシステムコールを同意だと捉えている方も多いようですが、上記のとおり両者の意味は異なります。
システムコール
システムコールについては以前の記事でも少し解説していますが、今回はもう少し掘り下げてみます。 アプリケーション(ユーザー空間)とデバイスドライバ(カーネル空間)間でデータを送受信するために、デバイスファイルを使用するということは前回の記事で解説しました。 このデバイスファイルを操作することが、デバイス(ハードウェア)を操作することにつながります。 それはつまり、デバイスファイルがデバイス(ハードウェア)を表しているということです。 では、デバイスファイルの操作はどのように行うのでしょう。 その方法が「システムコール」というわけです。 システムコールにはいくつか種類がありますが、まずは基本的な下記の4つについて考えてみます。 ・open ・close ・read ・write デバイスファイルは特殊なファイルではありますが、ファイルであることには変わりありません。 ですので、まずファイルを開いてやる必要があります。 そのためのシステムコールが「open」です。 あとはデバイスに対して何らかのデータを送ったり、受け取ったりする方法です。 「read」がデータを読み込む、つまり、デバイスから送られるデータを受け取るためのシステムコールです。 逆に「write」はデータを書き込む、つまり、デバイスにデータを送るためのシステムコールとなります。 そして最後に、用が済んだら開いていたファイルを閉じてやる必要があります。 そのためのシステムコールが「close」です。 このようにデバイス(ハードウェア)を操作してくわけです。 これらの手順は、普通のテキストファイルをプログラム上から扱うときとそっくりだということがわかります。