Linuxカーネルコミッタの夢を見る

10年以内にLinuxカーネルにコミットしたい(2020/10/1).無理だって?まあ見てなさい.

低レイヤー学習記【4日目】

取り組んだ内容

[1] OS自作入門,pp.69-95

[2] 低レイヤーを知りたい人のためのCコンパイラ作成入門,step.1-2

[3] コンピュータアーキテクチャの基礎,pp.246-264

 

取り組んだ内容の詳細

[1] OS自作入門

アセンブリ側で画面描画のための関数を定義,これをC言語から使う(C言語アセンブリが連携する場合に使用可能なレジスタはEAX,ECX,EDXの3つだけらしい)

・定義した関数と繰り返し処理を組み合わせてVRAMへ書き込み,縞々模様を画面出力

・ポインタを使用してC言語から直接メモリ操作を行って先ほど定義した関数と同様の処理を実装

C言語における配列はポインタの表現の一種,配列名はアセンブリのラベルである

・デバイスへのIO命令や割り込み禁止処理などを追加して安全な画面描画関数を定義

・前述の割り込み禁止処理などはやはりアセンブリ側で定義しC言語側で呼び出すことで実装

・矩形描画関数を定義し画面に色付きのボックスを描画,これはVRAMの線形性を利用してウィンドウ高さ×先頭アドレス+ウィンドウ幅によって指定,これが後々アプリケーションのフレームになったりする?

・矩形描画関数を使って画面表示をOSっぽくした

f:id:oirom0528:20201006234519p:plain

現状のOS実行画面

[2] 低レイヤーを知りたい人のためのCコンパイラ作成入門

・簡単なCプログラムとそれに対応するアセンブラプログラムを作成,実行,見比べた

・入力として加算・減算の演算式を受け取ってパースする簡易なコンパイラC言語で作成

Makefileを作ってテスト自動化

 

[3] コンピュータアーキテクチャの基礎

第7章にある仮想メモリの説明部分を読み終えた.ページングやセグメンテーションなどの仕組み,利点や欠点について書かれていた.ページングが固定長単位で仮想アドレス空間と実アドレス空間マッピングするのに対してセグメンテーションは論理的に意味のある単位でマッピングを行うため断片化などの問題が起きにくい,その代わり後者は実装コストが高い.

などなど,おそらく真面目に勉強してきた情報系の学生なら当たり前に知っているであろう内容を読んでは「ほー,そうなんだ!」と納得の連続.恥ずかしい.しかし読んでいて楽しいので頑張れそうです.

 

所感

OSを自作しているとやはり暗黙知が多くて難易度の高さを実感(VRAMの開始番地が0xa0000とか).続けていれば覚えられるのか…?

今日からコンパイラ自作にも手を伸ばしました.とは言っても少し前に始めてはいたんです,OS自作同様に続いてなかったので再開しました.OS自作で慣れていたこともありアセンブリがスラスラ読めます(大袈裟).普通に考えればわかることなんですけど,コンパイラの基本的な作業ってパースなんですよね,pythonのbeautifulsoupとかを思い出しました.あと,C言語のソース中にアセンブリ言語を直書きしてファイル出力するってのが意外でした.Webフロントのフレームワークみたいですね.

コンピュータアーキテクチャについての本をずっと読んでいるんですが,今さらながらブログに記録を書くことにしました.もうかなり後半に差し掛かっていて,自分にしては珍しく技術書を読了することができそうです(笑).読んでいて楽しいのはいいのですが,やはり一度読んだだけだと理解は深くないです.ただ,OS自作に並行して取り組んでいることもあり,コンピュータのOS周りについてざっくりと知識がついてるような感覚があります.低レイヤー,たのしいです.