xv6のソースコードとテキストを読んでみる1_chapter0_1

前回に書いたとおり、
Unix v6の移植版xv6のソースコードと、テキストを読んでいこうと思います。

本当はchapterごとに1記事書いていこうと思ってたんですが、
思っていた以上に僕の英語力がダメで翻訳にものすごい時間かかってしまっているので、
chapter内でもキリのいいところで、紹介していこうと思います。

翻訳ははっきりいってかなりお粗末なもので、
僕が独自に解釈したものが多く含まれています。

間違った内容が載っている可能性もあります。ご注意ください。
(※お気づきの方いらっしゃいましたら、教えてくれるととてもありがたいです。)

概要が伝わること、少しでも興味を持つきっかけなんかになれば
とても嬉しく思います。

Chapter 0

OSのインターフェース

OSの仕事は複数のプログラムや複数のサービスを提供し、
低レイヤーのハードウェアの動作を管理して、抽象化します。

またOSはインターフェースを通してユーザが作成したプログラムに
OSのサービスを提供します。より良いインターフェースをデザインすることは
難しいことです。私達プログラマは実装を正しく簡単に行うために、
シンプルで簡単なインターフェースを望むこともあれば、
アプリケーションに多くの機能を盛り込みたい場合、複雑で詳細に設定したり命令可能な
インターフェースを望むこともあります。この2つの言い分をバランス良く解決する
方法として、多くの一般的な機能を抽出して、それらを結合することもできる、
いくつかのメカニズムに依存するインターフェースをデザインする必要があります。

(中略)

実行されているプログラムはプロセスと呼ばれ、テキスト、データ、
そしてスタックをメモリ上に保持しています。
テキストはプログラムの命令が、データには演算に利用される
変数など、そしてスタックはプログラムのプロシージャが含まれています。
(ここはかなり僕の解釈で原文ままではない、と思います。)

プロセスがカーネルが提供するサービスを利用するときは、OSのインターフェース
経由で呼び出します。そのような命令をシステムコールと呼びます。システムコールは
カーネルの内部に入り込み、サービスを実行し結果を返します。このように
ユーザプログラムがシステムコールを利用するとき、
プロセスはユーザスペースとカーネルスペースの間を行き来します。

カーネルは、それぞれのプロセスが自身のユーザスペースで実行されることを確実にするために、
CPUのプロテクション機構を利用し、保護を実現するために必要な権限で実行されます。
ユーザプログラムにこの権現はありません。ユーザプログラムがシステムコールを呼び出すときは
ハードウェアで権限を上げ、カーネルで準備された機能を実行します。

xv6カーネルが提供するシステムコールは以下の通りです。

シェルはユーザが入力したコマンドを読み込み、実行する通常の
ユーザプログラムであり、カーネルの一部ではありません。これはシステムコールの
インターフェースのおかげで、シェルは内部的にシステムコールを利用しているだけです。

そのためUnixではシェルをsh,bash,zshなど、それぞれユーザが
好きなものに変更することが可能になっています。

原文

後ほど復習と確認のため、今回書いた場所の原文も中略した部分を含めて載せておきます。(図やイメージなどは省略してます。)

オリジナル

The job of an operating system is to share a computer among multiple programs and to provide a more useful set of services than the hardware alone supports. The operating system manages and abstracts the low-level hardware, so that, for example, a word processor need not concern itself with which type of disk hardware is being used. It also multiplexes the hardware, allowing many programs to share the computer and run (or appear to run) at the same time. Finally, operating systems provide con- trolled ways for programs to interact, so that they can share data or work together.

An operating system provides services to user programs through an interface. Designing a good interface turns out to be difficult. On the one hand, we would like the interface to be simple and narrow because that makes it easier to get the imple- mentation right. On the other hand, we may be tempted to offer many sophisticated features to applications. The trick in resolving this tension is to design interfaces that rely on a few mechanisms that can be combined to provide much generality.

This book uses a single operating system as a concrete example to illustrate oper- ating system concepts. That operating system, xv6, provides the basic interfaces intro- duced by Ken Thompson and Dennis Ritchie’s Unix operating system, as well as mim- icking Unix’s internal design. Unix provides a narrow interface whose mechanisms combine well, offering a surprising degree of generality. This interface has been so successful that modern operating systems—BSD, Linux, Mac OS X, Solaris, and even, to a lesser extent, Microsoft Windows—have Unix-like interfaces. Understanding xv6 is a good start toward understanding any of these systems and many others.

As shown in Figure 0-1, xv6 takes the traditional form of a kernel, a special pro- gram that provides services to running programs. Each running program, called a process, has memory containing instructions, data, and a stack. The instructions im- plement the program’s computation. The data are the variables on which the computa- tion acts. The stack organizes the program’s procedure calls.

When a process needs to invoke a kernel service, it invokes a procedure call in the operating system interface. Such procedures are call system calls. The system call enters the kernel; the kernel performs the service and returns. Thus a process al- ternates between executing in user space and kernel space.

The kernel uses the CPU’s hardware protection mechanisms to ensure that each process executing in user space can access only its own memory. The kernel executes with the hardware privileges required to implement these protections; user programs execute without those privileges. When a user program invokes a system call, the hardware raises the privilege level and starts executing a pre-arranged function in the kernel.
The collection of system calls that a kernel provides is the interface that user pro- grams see. The xv6 kernel provides a subset of the services and system calls that Unix kernels traditionally offer. The calls are:

he rest of this chapter outlines xv6’s services—processes, memory, file descrip-
tors, pipes, and file system—and illustrates them with code snippets and discussions of how the shell uses them. The shell’s use of system calls illustrates how carefully they have been designed.
The shell is an ordinary program that reads commands from the user and exe- cutes them, and is the primary user interface to traditional Unix-like systems. The fact that the shell is a user program, not part of the kernel, illustrates the power of the sys- tem call interface: there is nothing special about the shell. It also means that the shell is easy to replace; as a result, modern Unix systems have a variety of shells to choose from, each with its own user interface and scripting features. The xv6 shell is a simple implementation of the essence of the Unix Bourne shell. Its implementation can be found at line (7850).

感想

この辺の導入部分は、ひとまず知識としては既に知っていることも多く、内容の理解よりも
翻訳に時間がかかりました。

今回はソースコードを読む箇所はゼロ。

そしてシステムコールの数すくない!ここには載せていませんが、ソースコードも9000行未満です。
頑張って最後まで読みたいなぁ。

結構書き溜めているので、できればサクサク次の記事アップロードしたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です