ふつうのLinuxプログラミング

第1回 Linuxカーネルの作り出す世界

青木峰郎
2008/9/2

1 2次のページ

本連載では、Linuxで行うC言語プログラミングを初歩から解説します。ただし、C言語の基礎とLinuxでエディタが使えること、cd、ls、cat、lessといった基本的なコマンドを知っていることが前提になります。C言語の入門書を読み終えた人、WindowsでCやC++を使ってプログラミングをしていた人で、これからLinuxでのプログラミングを学びたい人、プログラミングを通じてLinuxの仕組みを理解したい人、LinuxやUNIXプログラミングに関するほかの書籍を読んだが難しくて挫折した人に向け、Linuxプログラミングの仕組みを解説します。

@IT自分戦略研究所カンファレンス
上級ITプロフェッショナルのスキルとキャリア 開催
日時:2008年9月27日(土)
11:00〜18:00(受付開始 10:30〜)
場所:秋葉原UDX 6F RoomA+B
詳しくは開催概要をご覧ください。

 本連載はLinuxプログラミングの入門編です。つまり、この連載を読むことで読者のみなさんがLinux向けのプログラムをバリバリと作れるようになる、あるいはそこまでいかなくとも、そうなるために何が必要なのか判断できるようになることを目標としています。

 そのために、本連載ではLinux世界を構成する3つの概念についてお話しします。それは次の3つです。

ファイルシステム
プロセス
ストリーム

 Linux世界はこの3つの概念によって成立しています。つまり、Linuxプログラミングを理解するためにはこの3つの概念をよく理解しなければならないということです。そして、それこそがこの連載の目的です。

 今回から数回にわたり、Linux世界という部分に注目してみましょう。Linux世界とは、より具体的に言うと何なのでしょうか。

 素朴に考えてみたときにまず思いつくのは、それはOSのことではないか、ということです。

◆今回学ぶこと
・オペレーティングシステム
・カーネル
・デバイスとデバイスドライバ
・システムコール
・Linuxを理解するとは

本連載は、ソフトバンククリエイティブ刊行の『ふつうのLinuxプログラミング』のうち第1部「Linuxの仕組み」の中から「第2章 Linuxカーネルの正解」と「第3章 Linuxを描き出す3つの概念」を、同社の許可を得て転載するものです。

本書は、LinuxにおけるC言語プログラミングの入門書です。「Linuxの世界が何でできているのか」に着目し、「ファイルシステム」「プロセス」「ストリーム」という3つの概念を紹介しています。

なお、本連載は転載を行っているため@IT自分戦略研究所の表記とは一部異なる点があります。ただし、Webで掲載するに当たり、(例えば「本書は」としている部分は「本連載は」としていること、図版などの省略など)、表現を若干変更している点がありますが、その点ご了承ください

■オペレーティングシステム

 今どきのコンピュータにはオペレーティングシステム(OS:Operating System)というものが入っていることはみなさんもご存知でしょう。OSの例を挙げれば、WindowsやMac OS X、それにもちろんLinuxがあります。

 では、OSとは何でしょうか。実のところ、OSという単語の意味するところは厳密には決まっていません。OSの種類や実装の方法は、時代によって変遷するものです。極端な例を挙げれば、ウェブブラウザがOSの一部であるとかそうでないとかで最近アメリカ司法省と喧嘩をした企業がありましたね。つまり、OSというのは裁判の結果によって範囲が変わってしまうような、わりとテキトーな概念なのです。

 しかし、一般的にはそのように曖昧であっても、特定のOSに限定すれば、それなりにOSについて話すことはできます。例えばLinuxについて言えば、次のようなソフトウェアパッケージ(部品のこと)がOSに含まれています。

シェル(bash,ash,csh,tcsh,zsh,pdksh,…)

util-linux(init,getty,login,reset,fdisk,…)

procps(ps,pstree,top,…)

GNU coreutils(ls,cat,mkdir,rmdir,cut,chmod,…)

GNU grep,find,diff

GNU libc

各種の基本ライブラリ(ncurses,GDBM,zlib,…)

開発環境(gcc,binutils,make,bison,flex,ヘッダファイル類,…)

X Window System

GNOMEやKDE

 普段から使っているものもあれば、見たことがないものもあるでしょう。今の段階で全部を知っている必要はありません。「こんなものが入っているんだな」と思っておいてください。

 もっとも、普段我々が「Linux」としてCD-ROMやDVD-ROMで受け取っているものは、OSとは呼ばれていません。これはディストリビューション(distribution)と呼ばれています。Linuxディストリビューションには例えば、Red Hat,Debian,Fedora Core,Vine,Momonga,SUSE,Gentoo,KNOPPIXなど多数あります。

COLUMN:UNIXとUNIX風OSの歴史

 LinuxというOSをさらに広く見ると、そこにはUNIXというOSの一群が見えてきます。この「UNIX」という呼び名には著作権やライセンスの問題が根深く絡んでいることもあり、単純に「LinuxはUNIXだ」と言うのははばかられます。しかし、「LinuxはUNIX風OSの一種だと考えてプログラミングできる」ことについては文句を言う人はいないでしょう。

 ここでUNIXについて少し話しておきましょう。UNIX風OSの系譜は、ごくごく簡潔には、図1のようにまとめられます。

図1 UNIX系OSの簡単な系譜

 最初にAT&Tのベル研究所でオリジナルUNIXが生まれたのが1969年のことです。誕生以来、UNIXにはさまざまな事情から無数の分派が発生しました。その中でも重要なのが、1980年前後ごろにUNIX version 6から派生したBSDとSystem Vです。

 その後も離合集散がいろいろあるのですが、現在の状況は、System V系に連なる商用UNIXと、BSDから派生した各種BSDの二派にまとめることができます。

 そして、Linuxは、このSystem VとBSDのどちらからの派生でもなく、一から開発されたOSです。しかし、その仕様は明らかにUNIXに類似しており、SystemVとBSDの両方の特徴を(節操なく)受け継いでいます。

 なお、商用UNIXにしても各種BSDにしても、現在ではかなり柔軟にお互いの機能を取り入れており、昔ほどの決定的な差はなくなる傾向にあります。その背景には、POSIXを初めとする標準規格があるのですが、それはあらためてお話しすることにしましょう。

■カーネル

 カーネルに話を戻します。「Linux世界」というのはOSのことではないかと想像してみたわけですが、結論を言えばそれは外れです。本連載で話したい「Linux世界」というのは、カーネル(kernel)が作り出している世界のことです。kernelとは英語で「核」のことで、文字どおりOSの核であることに由来しています。通常、カーネルはただ1つのプログラムで構成されていて、コンピュータを構成するすべてのハードウェアとソフトウェアを管理しています。

 すでにLinuxマシンが動いているなら、ルートディレクトリ(/)でlsコマンドを実行してみてください。vmlinuzやvmlinux,vmlinuz-X.X.Xといった名前のファイルがあると思います。あるいは/bootにあるかもしれません。これがLinuxカーネルのプログラム本体です。

 普段「Linux」と言えばOSのことだと考えられていますが、厳密には「Linux」という単語はカーネルだけを指しています。Linuxの作者として有名なLinusTorvaldsさんが管理しているのもカーネルだけです。ですから、今後、「カーネルとしてのLinux」と「OSとしてのLinux」を区別する必要があるときには、明示的に「Linuxカーネル」や「Linux OS」のように呼び分けることにしましょう。

デバイスとシステムコール について学びます

1 2次のページ

自分戦略研究所、フォーラム化のお知らせ

@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。

現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。

これからも、@IT自分戦略研究所をよろしくお願いいたします。