UNIX V6の仮想アドレス変換をC言語で読む

UNIX V6の仮想アドレス変換をC言語で読む

PARとオフセットを、読める変数名と計算式に分解する

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。

記事要約

OSコードリーディングで難しいのは、抽象的な概念とC言語の低レベルな記法が同時に出てくることです。仮想アドレスから物理アドレスへの変換も、ページやレジスタの言葉だけで読むと、何を計算しているのかが見えにくくなります。

この記事では、プログラミングナイト016回目の投稿を素材に、仮想アドレス変換を変数と式に分解して読みます。上位ビットでPARを選び、ブロックとオフセットから物理位置を求める、という流れをC言語の読解として整理します。

本記事の対象とゴール

想定読者

  • UNIX V6やOSコードリーディングに興味があるが、仮想記憶の式で止まりやすい人

  • C言語のビット演算、配列、ポインタの混在記法を読む練習をしたい人

  • 抽象概念を説明変数に落として読む方法を学びたい人

本記事で得られること

  • 仮想アドレス変換を、セレクタ、PAR、ブロック、オフセットに分けて読めます。

  • C言語の式を、仕組みに忠実な説明変数へ置き換える読み方が分かります。

  • 配列とポインタの読みづらさを、評価順序と代入可否から整理できます。

本記事で扱わないこと

  • 元Togetter/Posfieの投稿全文を転載すること。

  • 画像内の細かなコードを、判読できない状態で推測して再現すること。

  • C言語、OS、アルゴリズムの仕様を網羅的に解説すること。

先に結論

OSコードリーディングでは、難しい式を気合いで読むより、まず仕組みに忠実な名前へ分解します。名前が付けば、C言語の記法は追跡可能な部品になります。

1. 仮想アドレスを部品に分ける

仮想アドレスを部品に分ける

仮想アドレス変換を読むときは、最初にアドレスを意味のある部品へ分けます。素材上は、仮想アドレスの上位3ビットをPARのセレクタとして使い、残りのブロックとオフセットから物理アドレスを求める整理が示されています。

仮想アドレスを部品に分ける

この読み方のよいところは、いきなりビット演算の式を追わないことです。まず、どのビットが何を選び、どの値が足され、何が最終的な位置になるのかを名前にします。名前を付けることで、式が説明になります。

2. C言語の記法を構造に戻す

C言語の記法を構造に戻す

C言語は、配列とポインタ、後置演算子、間接参照が混ざると、同じ処理でも複数の書き方ができます。そのため、見た目のトリックに引っ張られず、基本規則へ戻す必要があります。

C言語の記法を構造に戻す

配列名は代入先にはできませんが、要素には代入できます。ポインタ変数に代入する場合は、変数そのものが指している領域と、指された先の領域を分けて読みます。この区別をせずに式だけを追うと、どこに書き込んでいるのか分からなくなります。

3. 式を読むときは仕組みに忠実な名前を付ける

式を読むときは仕組みに忠実な名前を付ける

OSコードを読むとき、短い変数名をそのまま頭に入れようとすると失敗しやすくなります。読み手側では、仮想アドレス、PARセレクタ、選択されたPAR、ブロック、オフセット、物理アドレス候補のように、仕組みに忠実な説明変数を補います。

式を読むときは仕組みに忠実な名前を付ける

これはコードを書き換えるという意味ではありません。読解のために、式の役割を言語化するということです。説明変数を作ると、ビット演算やポインタ記法が、OSの仕組みを表す部品として見えるようになります。

4. 元投稿から記事化した要点

原型として使った投稿の範囲

この記事は、元Togetter URLから到達したPosfieページの投稿本文、ページ説明、画像参照を素材にしています。投稿本文はそのまま転載せず、LWP公開記事として読めるように、主張、前提、判断軸、実務への接続を補って再構成しました。

投稿本文から拾った主要論点

  • プログラミングナイト、OSコードリーディング編雑記(2021-06-16)

本日のプログラミングナイトは、仮想記憶の仮想アドレスから物理アドレルへの変換の仕組みを簡単にC言語のプログラムとして実装してみました。

  • 変換ルールは次のとおりです。

①仮想アドレスの上位3ビットはPARのセレクタとして使用する(範囲は0~7までの8値)

②(仮想アドレスのブロック+選択されたPARの値)*64 + オフセット

というものです。

  • 仕組みに忠実に変数を定義して計算式を構築します。このような場合は変換対象を忠実に説明変数化するとわかりやすいとおもいます。

  • このあたりはC言語ぽいですね。ビット演算、マスク、(みえてはいませんが)配列とポインタの混在記法を使用しています。

  • このaはすべて同じ値となります。C言語は少々トリッキーな書き方ができますが、基本のルールはごく少ないのでルールを覚えれば迷うことなく読めるようになります(後置演算子から評価されます)。

  • 配列は、配列定数ですので代入はできません。C言語の

抽象解析木をみることはできませんが、アセンブラ出力はみることができるので、なんとなく想像が付きますね。変数はそれぞれラベル(アドレス)になっていますね(たぶんw)

  • なのでPAR_proto1に代入はできません。当然ですがその要素には代入できます。PARはint *と宣言していますので4バイト確保されているようです(読み方未調査部分おおし)。PARに代入するとこの領域に書き込まれます。

  • 生徒さんが作成したコードです。OSコードリーディングのC言語から初めて随分上達されたように思います。すばらしい成長だとおもいます。あとはポインタとC言語の不思議記法のルールを覚えれば結構コードが読めるようになると思います。

画像・添付の扱い

HTML上で検出した画像・添付候補は次のとおりです。今回の記事本文では、画像そのものに依存しない形で論旨を閉じています。画像内の細かなコードや図は、現時点では目視判読済みとして断定せず、投稿本文とページ説明から確認できる範囲だけを記事本文に反映しました。

  • https://pbs.twimg.com/media/2x.png

  • https://pbs.twimg.com/media/82a11368304f5dc49743a3869a3a9d11-1200x630.jpeg

  • https://pbs.twimg.com/media/82a11368304f5dc49743a3869a3a9d11-1200x675.jpeg

  • https://pbs.twimg.com/media/Do4mE7t2_normal.jpg

  • https://pbs.twimg.com/media/E37y6-PVgAIfk_a.jpg

  • https://pbs.twimg.com/media/E37y6-PVgAIfk_a.jpg:thumb

  • https://pbs.twimg.com/media/android-icon-192x192.png

  • https://pbs.twimg.com/media/apple-icon-180x180.png

  • https://pbs.twimg.com/media/logo.png

  • https://pbs.twimg.com/media/mE370HHJVgAMGPoY.png:medium

  • https://pbs.twimg.com/media/mE370VmNVoAA-teq.png:medium

  • https://pbs.twimg.com/media/mE3714YwUcAQhGOK.png:medium

まとめ

OSコードリーディングでは、難しい式を気合いで読むより、まず仕組みに忠実な名前へ分解します。名前が付けば、C言語の記法は追跡可能な部品になります。 この考え方を持っておくと、古典的な設計手法やOSコードリーディングを、単なる昔の話ではなく、現在の業務マクロ、Excel VBA、データ処理設計にも接続できます。

出典メモ- 元Togetter URL: https://togetter.com/li/1731362

  • 正規Posfie URL: https://posfie.com/@hoehoe1234/p/Watsueb

  • 元リンクファイル: C:\Users\hoehoe\マイドライブ\LWP記事\03過去記号\プログラミングナイト\プログラミングナイト016回目OSコードリーディング補講(2021-06-16) - Togetter.URL

  • 元ページタイトル: プログラミングナイト114相当の過去記録ではなく、ファイル名記載の回次を優先

  • 元投稿日または開催日: 2021-06-16

  • 取得日: 2026-06-12

  • 投稿者: ほえほえ@マクロ師のひとりごとDX/AX(@hoehoe1234)

  • 画像確認: HTML上の画像URL候補 25 件を検出。本文は画像任せにせず、投稿本文から確認できる内容を中心に再構成。