Product SiteDocumentation Site

B.4. カーネルが担当している一部の操作

B.4.1. ハードウェアの操作

カーネルの責務は何を差し置いてもまず、ハードウェア部分を制御したり、検出したり、コンピュータ起動時にハードウェア部分のスイッチを ON にしたりすることです。さらにカーネルは単純化されたプログラミングインターフェースを使った高レベルソフトウェアからハードウェアを利用できるようにします。こうすることで、アプリケーションは拡張カードがどの拡張スロットに接続されているかなどの詳細を気にすることなくデバイスをうまく活用することが可能になります。さらにこのプログラミングインターフェースは抽象化レイヤを提供します。そして抽象化レイヤを使うことで、たとえばビデオ会議ソフトウェアは種類やモデル番号を気にせずにウェブカメラを使うことが可能です。すなわち、ビデオ会議ソフトウェアは Video for Linux (V4L) インターフェースを使うだけでよいのです。そしてカーネルが V4L インターフェースの機能呼び出しを特定のウェブカメラを制御するために必要な実際のハードウェアコマンドに変換します。
The kernel exports many details about detected hardware through the /proc/ and /sys/ virtual filesystems. Several tools summarize those details. Among them, lspci (in the pciutils package) lists PCI devices, lsusb (in the usbutils package) lists USB devices, and lspcmcia (in the pcmciautils package) lists PCMCIA cards. These tools are very useful for identifying the exact model of a device. This identification also allows more precise searches on the web, which in turn, lead to more relevant documents.

例 B.1 lspcilsusb で提供される情報の一例

$ lspci
[...]
00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (rev 05)
00:01.0 PCI bridge: Intel Corporation 6th-9th Gen Core Processor PCIe Controller (x16) (rev 05)
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 (rev 04)
00:14.0 USB controller: Intel Corporation 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller (rev 31)
00:14.2 Signal processing controller: Intel Corporation 100 Series/C230 Series Chipset Family Thermal Subsystem (rev 31)
[...]
02:00.0 Network controller: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter (rev 32)
03:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTL8411B PCI Express Card Reader (rev 01)
03:00.1 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 12)
04:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0bda:5621 Realtek Semiconductor Corp. HD WebCam
Bus 001 Device 002: ID 04ca:3016 Lite-On Technology Corp. 
Bus 001 Device 018: ID 145f:01bc Trust GXT 155 Gaming Mouse
Bus 001 Device 004: ID 04f3:0c03 Elan Microelectronics Corp. ELAN:Fingerprint
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
These programs have a -v option that lists much more detailed (but usually not necessary) information. Finally, the lsdev command (in the procinfo package) lists communication resources used by devices.
アプリケーションは /dev/ 内に作られた特殊ファイル (補注BACK TO BASICS デバイスアクセスパーミッション」を参照してください) を介してデバイスにアクセスする場合が多いです。/dev/ 内には特殊ファイルがあり、これらはディスクドライブ (たとえば /dev/hda/dev/sdc)、パーティション (/dev/hda1/dev/sdc3)、マウス (/dev/input/mouse0)、キーボード (/dev/input/event0)、サウンドカード (/dev/snd/*)、シリアルポート (/dev/ttyS*) などを表しています。

B.4.2. ファイルシステム

ファイルシステムはカーネルの最も卓越した側面の 1 つです。Unix システムはすべてのファイル保存領域を単独の階層構造の中に融合させます。こうすることで、ユーザ (とアプリケーション) は階層構造の中のファイルの場所を知るだけでデータにアクセスすることが可能です。
階層構造ツリーの基点はルート、/、と呼ばれています。ルートディレクトリには名前を付けられたサブディレクトリが含まれます。たとえば、/home サブディレクトリは /home/ と呼ばれます。このサブディレクトリには、さらに別のサブディレクトリを含めることが可能です。各ディレクトリには、実際のデータが保存されるファイルを含めることも可能です。そんなわけで、/home/rmas/Desktop/hello.txt ファイルはルートディレクトリ内の home サブディレクトリ内の rmas サブディレクトリ内の Desktop サブディレクトリ内の hello.txt と名付けられたファイルを表します。カーネルはこの命名システムと実際のディスク上の物理的な保存領域を変換します。
他のシステムと異なり、階層構造は 1 つしかありません。そしてこの単独の階層構造は複数のディスクに保存されたデータを統合できます。1 台のディスクがルートディレクトリとして使われ、他のディスクは階層構造中のディレクトリに「マウント」されます (これを行う Unix コマンドは mount と呼ばれます)。マウントされたディスクは「マウントポイント」の下から利用できるようになります。これのおかげで、2 台目のハードディスクに rhertzogrmas ディレクトリなどのユーザホームディレクトリ (伝統的に /home/ の中に保存されます) を保存することが可能になります。2 台目のハードディスクを /home/ にマウントすると、ユーザのホームディレクトリの通常の場所からこれらのディレクトリにアクセスできるようになり、/home/rmas/Desktop/hello.txt などのパスが動作するようになります。
There are many filesystem formats, corresponding to many ways of physically storing data on disks. The most widely known are ext3 and ext4, but others exist. For instance, vfat is the system that was historically used by DOS and Windows operating systems, which allows using hard disks under Debian as well as under Windows. In any case, a filesystem must be prepared on a disk before it can be mounted and this operation is known as “formatting”. Commands such as mkfs.ext3 (where mkfs stands for MaKe FileSystem) handle formatting. These commands require, as a parameter, a device file representing the partition to be formatted (for instance, /dev/sda1). This operation is destructive and should only be run once, except if one deliberately wishes to wipe a filesystem and start afresh.
さらに NFS などのネットワークファイルシステムも存在します。ネットワークファイルシステムを使った場合、データはローカルディスクに保存されません。その代わり、データはネットワークを介してサーバに送信されます。サーバは要求に応じてデータを書き込んだり、読み出したりします。ファイルシステムを抽象化したことにより、ユーザが特に心がける点はなくなります。すなわち、ファイルは通常の階層構造的な方法を使ってアクセスできます。

B.4.3. 機能の共有

数多くの同じ機能がすべてのソフトウェアで使われますから、これらの機能をカーネルに集中させることは合理的です。たとえば、共有のファイルシステム操作機能を使うことで、名前から簡単にファイルを開くことが可能になります。ファイルが物理的に保存されている場所を気にする必要はありません。ファイルは 1 台のハードディスクの複数の異なる部分に保存したり、複数のハードディスクにわたって分割保存したり、リモートファイルサーバに保存することが可能です。アプリケーションはデータを交換するために共有の通信機能を使います。アプリケーション側からするとデータを転送する方法を意識する必要はありません。たとえば、データ転送はローカル、ワイヤレスネットワーク、固定電話回線の任意の組み合わせを通じて行われるかもしれません。

B.4.4. プロセス管理

プロセスとはプログラムの実行中インスタンスです。プロセスはプログラム自身とその動作データを保存するためのメモリを要求します。カーネルはプロセスの作成と追跡を担当します。プログラムが実行されると、カーネルは最初に幾らかのメモリを確保し、次にファイルシステムから確保したメモリに実行コードを読み込み、次にコードの実行を開始します。カーネルはプロセスに関する情報を保持します。中でも最もよく目にする情報は pid (プロセス ID) として知られる識別番号です。
Unix 系カーネル (Linux を含めて) は、多くの他の現代的なオペレーティングシステムと同様、「マルチタスク」機能を備えています。言い換えれば、Unix 系カーネルは多くのプロセスを「同時に」実行することが可能です。ある時点で動いているのは 1 つのプロセスだけですが、カーネルは時間を小さな単位に切り分け、順繰りにそれぞれのプロセスを実行しています。これらの時分割単位は極めて短い (ミリ秒程度) ので、プロセスが並列実行されているような錯覚を起こさせます。しかし実際のところプロセスはある時間周期で活動しており、残りの時間は動いていません。カーネルの作業はこの錯覚を保つためにスケジューリングメカニズムを調節し、同時にシステム全体の性能を最大化することです。時分割単位が長すぎる場合、アプリケーションが要求通りの反応をしていないように感じるかもしれません。時分割単位が短すぎる場合、タスク切り替えが頻繁に起こるようになり、システムは処理時間を損することになります。プロセス優先度を使えば、時分割単位を微調整することが可能です。優先度の高いプロセスは優先度の低いプロセスに比べて長くそしてより頻繁な時分割単位で実行されます。
もちろん、カーネルは同じプログラムの複数の独立したインスタンスも取り扱うことが可能です。しかし各プロセスは自分自身以外の時分割単位とメモリにアクセスすることは不可能です。このため、プロセスごとのデータは独立に管理されています。

B.4.5. 権限管理

Unix 系システムはマルチユーザに対応しています。Unix 系システムはグループとユーザの別々な管理をサポートする権限管理システムを提供しています。さらに、パーミッションに基づいて動作を制御することも可能です。カーネルは各プロセスに対するデータを管理し、そのデータを使ってパーミッションを制御します。ほとんどの場合、プロセスはプロセスを開始したユーザと同じユーザ ID を持ちます。そして、プロセスは自分を開始した所有者が実行できる動作だけを実行することが可能です。たとえば、プロセスがファイルを開くためには、カーネルによってそのプロセスのユーザ ID が対象のファイルへのアクセスパーミッションを持つことが確認されなければいけません (具体的な例についてのより詳しい情報は第 9.3 節「権限の管理」をご覧ください)。