A Heavily Commented Linux Kernel Source Code の2章まで読んでみた(1)

@aintek on Sun Sep 01 2019
10.7 min

目次

本書について

A Heavily Commented Linux Kernel Source Code
という良質な資料があったため、これを読んだコメントと現代風に読み替えた内容を記していく。

2.1 マイクロコンピュータ の構成

CPUアーキテクチャの1つである 80386 を題材にしている。
ちなみに80386は 16bitCPUアーキテクチャである 80286 の後継である。
よく見るi386はこれが由来。

参考: i386

             +------------+
     +----+  | Interrupt  | +---+
     |CMOS|  | Controller | |DMA| ...
     +----+  +------------+ +---+
        |          |          |
 +-+    |          |          |    +---------------+
 | |----+----------+----------+----| Address Line  |
 | |    |          |          |    +---------------+
 |C|    |          |          |    +---------------+
 | |----+----------+----------+----|   Data Line   |
 |P|    |          |          |    +---------------+
 | |    |          |          |    +---------------+
 |U|----+----------+----------+----| Control Line  |
 | |    |          |          |    +---------------+
 +-+    |          |          |
        |          |          |
    +-------+  +-------+  +-------+
    |       |  |       |  |       | ...
    +-------+  +-------+  +-------+ 
  • アドレスライン: メモリや IOデバイスのアドレスを供給するために利用される
  • データライン: CPUやメモリ、IOデバイス間でデータをやり取りするためのライン
  • コントローラライン: 書き込み読み込みといった操作を扱うためのライン

があり、これをまとめてBusと呼ぶ。

80386 CPU (i386) は、32bit の アドレスライン、データラインを持っており、
2 の 32乗 のスペースつまり 4GB までの領域を扱うことができる。
i386 なプロセッサが メモリ4GBまでしか扱えないとよく言われるが、これが所以だ。

なお、このbusには、いくつかの標準的なインターフェースが存在し、

  • Industry Standard Architecture (ISA)
  • Extended Industry Standard Architecture (EISA)
  • Peripheral Component Interconnect (PCI)
  • Accelerated Graphics Port (AGP)

などが存在する。

現在のシェアでいえば、ほとんどがPCIEであろうか(多分そうだろう)。
参考: PCI Express

これらの違いは、データ転送率と拡張性にあり、
例えば PCIE(PCI Express)であれば、全2重化のシリアル通信によって片方向2.5Gbps(双方向では5Gbps)
の通信速度を実現している。
一方でオリジナルの 80368 に用いられていた ISA bus は、
データ転送のためにたったの16bitのデータラインしかもっていないかったのだ。

以上から、CPUとメモリ、デバイスはbusを経由してデータをやり取りすることがわかった。

また、最近(今となっては昔)のマザーホードには、2つないしは大容量のチップで構成されるチップセットがある。
これが、ノースブリッジ及びサウスブリッジだ。

+--------------------+                +--------+
|       CPU          |----------------| Memory |
|  (North Bridge)    |   Memory Bus   +--------+
+--------------------+  ...           ...
          |
+---------------------+
| Sourth Bridge (ICH) |
+---------------------+
   |       |       |
   |       |       |
+------+ +-----+ +------+
| BIOS | | USB | | SATA | ...
+------+ +-----+ +------+

ノースブリッジは、CPU、メモリ及び AGP Video 等のインターフェースとして利用され、
これは高速なデータ転送をもたらした。
このことから、ノースブリッジは、MCH(Memory Controller Hub)とも呼ばれた。

一方のサウスブリッジは、低速または中速な転送を担い、IDE、ATAハードディスクやUSBインターフェースとして利用される。
サウスブリッジは、ICH(I/O Controller Hub)とも呼ばれる。
※ICHと呼ぶ人もいればIOH(I/O Hub)と呼ぶ人もいるので揺らぎがありそう。

参考: ノースブリッジ

なお、ノースブリッジの説明が全て過去形なのは、
ノースブリッジはAMD64でもIntel製x86でもCPUに内蔵される形となったため現在では存在していないからだ。

2.2 I/O ポートアドレッシング 及び アクセスコントール

CPUとI/Oデバイスのデータのやり取りを行う前に必ず必要なことは、通信用のポートアドレスを決めることだ。
また、データ転送において、様々なデータ転送モードを考慮する必要がある。
例えば、プログラムからの命令だったり、プロセスの割り込みだったり、DMA(Direct Memory Access)だったり。
DMAはメモリ間やメモリとI/Oデバイス間で直接データ転送を担うアクセス方法をいう。

さて、CPUがI/Oデバイス(正確にはデバイスのコントローラカード)と通信するには、そのアドレスを決める必要がある(2回目)。
このアドレスを、I/Oポートアドレスまたは単にポートといったりする。
なお、I/Oコントローラは通常 データへアクセスするためのデータポート、コマンドを送るためのコマンドポート、
ステータスを確認するためのステータスポートをもっている。
そして、このポートアドレスを決めるための方法は2つあり、Unified アドレッシングと Independentアドレッシングだ。

この Unified と Independent はなんて訳すのがよいだろうか・・・悩む
Unified Addressing は メモリマップトI/O というやつだろうか??
でIndependent Addressing は ポートマップトI/O というやつだろうか??
いったんは Unified /Independent Addressingという 表記で進める。

Unifiedアドレッシングポートは、I/Oコントローラのポートアドレスをメモリアドレス空間上に共存するもので、
CPUからポートにアクセスする際はメモリへの操作を行えばよい。
I/Oを扱うための操作が簡略化できるため、高速にアクセスできるという利点があるが、
メモリ空間に共存するためにその空間を余分に利用する欠点がある。

一方、Independentアドレッシングは、I/OコントローラとI/Oデバイスを(メモリアドレス空間とは別の)I/Oアドレス空間として分離する方式である。
限られたメモリ空間を節約できるというメリットがあるが、特別な命令を使って入出力を行わなければならないという欠点がある。

これを欠点というかどうかはまぁ、、、

モダンなPCでは、64KBの I/O アドレス空間があり、このI/Oアドレス範囲はI/Oコントローラや
/proc/ioports に見られるポートの設定に用いられる。

cat /proc/ioports を実行して見てみよう。

0000-0000 : PCI Bus 0000:00
  0000-0000 : dma1
  0000-0000 : pic1
  0000-0000 : timer0
  0000-0000 : timer1
  0000-0000 : keyboard
  ...

こんな出力が得られただろうか。

最後に

2章の前半部分を読んでみて、コンピュータの構成を整理できた。
まだ整理が追いついていない部分もあるが、今後読み進めていく中でわかったことがあれば追記していきたい。

日別に記事を見る