トランジスタの ON/OFF から Python コードまで——ハードウェアとソフトウェアをつなぐ「抽象化の橋」を理解しよう。
各レイヤーをクリックして詳細を見てみよう
print("Hello") の1行で、ディスプレイに文字が出る。
printf()・malloc() など。ADD / MOV / JMP などのアセンブリ命令がこの層に対応する。コンパイラ・アセンブラ・リンカ・ローダーの役割
複数の .o ファイルと標準ライブラリを1つの実行ファイルに結合する。
例:printf() の実体は libc.a の中にある。コンパイル時には「後で繋ぐ」という参照だけ残し、リンカが最終的に繋ぎ合わせる。
実行ファイルをメモリに展開して CPU が実行できる状態にする。OS の一部として動く。
コード領域・データ領域・スタック・ヒープをメモリ上に配置し、プログラムカウンタを先頭命令に設定してプログラムが始動する。
a = 1 + 2 の変身コンパイラが最適化すると、コンパイル時に 1+2=3 を計算して直接 mov [a], 3 に置き換えることもある(定数畳み込み)。
アプリと OS の境界線
| システムコール | 何をOSに頼む? | アプリから見ると |
|---|---|---|
| read() / write() | ファイル・標準入出力の読み書き | print() の裏で動く |
| open() / close() | ファイルのオープン・クローズ | open("file.txt") |
| fork() / exec() | 新しいプロセスの生成・プログラム置き換え | シェルがコマンドを実行するとき |
| mmap() / brk() | メモリの確保・解放 | malloc() の裏で動く |
| socket() / connect() | ネットワーク接続 | HTTP 通信の裏で動く |
| exit() | プログラムの終了をOSに通知 | プログラム終了時に必ず呼ばれる |
アプリが自由にハードウェアを操作できると、悪意あるプログラムがメモリ全体を覗いたり、
他のプロセスのデータを改ざんしたりできてしまいます。
OS が唯一の「門番」となることで、セキュリティ・安定性・公平なリソース分配が実現されます。
トランジスタ→ゲート→回路→ISA→OS→ライブラリ→アプリ。各層が下の詳細を隠す。
コンパイラ→アセンブラ→リンカ→ローダーで、ソースコードが実行される。
アプリとOSの唯一の境界線。read()・fork()・mmap() など。
ユーザー空間 / カーネル空間の分離がセキュリティと安定性を保証する。