低レイヤー学習記【5日目】
取り組んだ内容
[1] OS自作入門,pp.96-114
[2] 低レイヤを知りたい人のためのCコンパイラ作成入門,step.3-6
取り組んだ内容の詳細
[1] OS自作入門
・構造体を導入し,アセンブリ側でメモした画面表示に関するメモリ情報をポインタを介して受け取るようにした
・フォントファイルを作成した
・フォントファイルの内容はバイナリの並びであることを利用して繰り返し処理によってフォントを描画する関数を定義
・メモリ操作命令であるsprintfを使って変数の内容をメモリ内に生成し画面表示できるようにした
・マウスカーソルのデータを配列で用意しフォント描画のときと似た関数を使って表示した
[2] 低レイヤを知りたい人のためのCコンパイラ作成入門
・演算式に空白文字列が混ざっていてもコンパイルできるようにトークナイザを導入した
・エラー発生時にエラー部分が分かりやすいよう改良
・スタックマシンの勉強
・再帰下降構文解析とスタックマシンをコンパイラに導入して四則演算を可能にした
・単項プラスと単項マイナスの導入
所感
OSらしい見た目になってきましたが,マウスカーソルがまだ動かないです.はやく操作できるようにしたいですね.マウス操作は割り込み処理に分類されるため,割り込みについて記述した割り込み記述指標(Interrupt Descriptor Table: IDT)について設定しなくてはならないのですが,そのためにはセグメントの設定を完了しておかなくてはいけないので必然的に大域セグメント記述子表(Global Descriptor Table: GDT)の設定も行わなければならないらしいです.
ここにきて急に難易度が上がったように感じますが,セグメンテーションや割り込みテーブルの話はコンピュータアーキテクチャの基礎でつい先日読んだばかりなので理解し易そうです.楽しいですね~.
コンパイラは構文解析の話が少し難しく,コードも完全には理解できていないので復習必須ですね.
明日も頑張りますよ~!
低レイヤー学習記【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っぽくした
[2] 低レイヤーを知りたい人のためのCコンパイラ作成入門
・簡単なCプログラムとそれに対応するアセンブラプログラムを作成,実行,見比べた
・入力として加算・減算の演算式を受け取ってパースする簡易なコンパイラをC言語で作成
・Makefileを作ってテスト自動化
[3] コンピュータアーキテクチャの基礎
第7章にある仮想メモリの説明部分を読み終えた.ページングやセグメンテーションなどの仕組み,利点や欠点について書かれていた.ページングが固定長単位で仮想アドレス空間と実アドレス空間をマッピングするのに対してセグメンテーションは論理的に意味のある単位でマッピングを行うため断片化などの問題が起きにくい,その代わり後者は実装コストが高い.
などなど,おそらく真面目に勉強してきた情報系の学生なら当たり前に知っているであろう内容を読んでは「ほー,そうなんだ!」と納得の連続.恥ずかしい.しかし読んでいて楽しいので頑張れそうです.
所感
OSを自作しているとやはり暗黙知が多くて難易度の高さを実感(VRAMの開始番地が0xa0000とか).続けていれば覚えられるのか…?
今日からコンパイラ自作にも手を伸ばしました.とは言っても少し前に始めてはいたんです,OS自作同様に続いてなかったので再開しました.OS自作で慣れていたこともありアセンブリがスラスラ読めます(大袈裟).普通に考えればわかることなんですけど,コンパイラの基本的な作業ってパースなんですよね,pythonのbeautifulsoupとかを思い出しました.あと,C言語のソース中にアセンブリ言語を直書きしてファイル出力するってのが意外でした.Webフロントのフレームワークみたいですね.
コンピュータアーキテクチャについての本をずっと読んでいるんですが,今さらながらブログに記録を書くことにしました.もうかなり後半に差し掛かっていて,自分にしては珍しく技術書を読了することができそうです(笑).読んでいて楽しいのはいいのですが,やはり一度読んだだけだと理解は深くないです.ただ,OS自作に並行して取り組んでいることもあり,コンピュータのOS周りについてざっくりと知識がついてるような感覚があります.低レイヤー,たのしいです.
低レイヤー学習記【3日目】
取り組んだ内容
・OS自作入門, pp.48-68
取り組んだ内容の詳細
・昨日に引き続きBIOSプログラムを呼び出す複数の処理を加えた
・フロッピーディスクの内容を読み出し,メモリへ移した
・画面モードを変更することで8bitカラーモードにした
・アセンブラソースにBOOT_INFO(起動情報)を設定し,複数あるVRAMのうちどれを使うかなどを記憶
・C言語を導入し,アセンブラで定義した関数(HLT関数)を実行した
所感
C言語が登場してきました.アセンブラプログラムで作った関数をC言語で使えるのには驚きました.また,C言語で書かれたプログラムをオブジェクトファイルに変換したりして他のオブジェクトファイルとリンクさせる必要があったのですが,詳しい解説はスルーされていたので今後時間があれば深掘りしてみたいです.(低レイヤー界隈でよく聞くリンカというものがこれに当たるのか??)
C言語の導入にあたってコンパイラの制約によりCPUを32bitモードに切り替える必要がありました.これは以降でBIOSプログラムが使えなくなることを意味しており,画面モードの切り替えをここで行ったのもそれが理由です.
機能を増やすことによって新たな制約が生まれるというケースはOS開発で頻発するイベントのようなので,やはりシステムを深く理解していなければなかなか諳んじることができないコーディング内容だなと感じました.
低レイヤー学習記【2日目】
取り組んだ内容
・OS自作入門, pp.30-47
取り組んだ内容の詳細
・イメージファイルを生成するアセンブラソースを変更し,文字出力を行った
・MOV命令などを使ってレジスタを操作しBIOSプログラムを呼び出すことでキャラクター出力(文字出力)した
・どのBIOSプログラムを呼び出すかはINT命令(インタラプト?)への引数によって選択可能
・ラベルやレジスタが保持しているデータを使って番地指定が可能
・Makefileを導入してアセンブル,インストール,実行を自動化
所感
アセンブリ言語の命令が色々と出てきました,CPUと対話している感じがしてきましたね(大袈裟).
Makefileはコンパイル自作とかでしか使ったことがないですけど改めて有り難さを痛感しますね,自動化は大切.
2日目も無事終えることができました!
これからどんどんペースアップしていきますよー!
余談
コンピュータアーキテクチャの教科書を読んでいて現在は仮想メモリの章に差し掛かっているんですが,OSの話と直結する内容もあり読んでいて非常に楽しいです.知識と知識の結びつきは学習意欲を加速してくれるので複数の技術書などを並行して読むのは大事だと実感しました.
低レイヤー学習記【1日目】
取り組んだ内容
・OS自作入門, pp.1-29
取り組んだ内容の詳細
・バイナリエディタを使ってごく簡単なOSのイメージファイルを作成し,エミュレータ上で起動することを確認
・上記のイメージファイルと同様のものを生成するアセンブラのソースプログラム作成の後,アセンブルしイメージファイルを作成・起動確認
所感
取り組んだ内容が少ないですが1日目ということで大目に見ましょう.
自分にとってアセンブリ言語プログラミングは馴染みないものなのですが,記述された命令の直感的な理解が可能でソースコードが読み易い気がします.
CPUを直接操作している感じもグッドですね.
自作OS完成への第一歩を踏み出した感じがしてワクワクしてきました.
明日も頑張ります!
低レイヤー学習記【0日目】
情報系の大学院に在籍している者です。
2020年2月に就職活動を終え、これから研究やその他の活動にも精力的に取り組もうと考えていた矢先、コロナウィルスによる外出自粛や学校閉鎖でやる気を削がれてしまい、日々をだらだらと過ごして気が付けば修士二年の10月になっていました。
というのは言い訳でもともとずぼらな性格ですし、物事に継続的に取り組むことが下手かつそのための努力もしないような人間なので自業自得ではあります。
思い返せば人生において何かに本気で取り組んだ経験もありません。
このままではダメだと急に思い立ち、勢いでブログを開設することにしました。
このブログでは特定のテーマを設け、そのテーマに対して一定期間本気で取り組み、その過程を記録することを目的としています。
この「本気出してみた企画」の記念すべき最初のテーマはこちらです!
『OS自作』!!!!!!!
Operating System : OS とはコンピュータのオペレーション(操作・運転・運用)を司るシステムソフトウェアのことです。身近なもので言うとWindowsやMacOS、Linuxなどがあります。少し前にこのOSというものを自作するための技術書(OS自作入門)を購入したのですがなかなか読み進めることができずにいたため、今回のテーマに選びました。
そして企画第一弾ということもあり、あまり期間を長く設けても自分がつらくなりそうなので、今回は継続期間を一ヶ月(30日)とします。
一ヶ月後の自分がどうなっているか(OSが完成しているのか)が楽しみですね~。
明日からバリバリやっていきますよー!!