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

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

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

取り組んだ内容

・OS自作入門,pp.213-221

取り組んだ内容の詳細

・マウスカーソルが画面の外に移動したときの処理を加えた,座標の更新制限を少し変更し,マウスカーソルが画面外に出ようとする場合は更新値を一定にすることで実現

・これまで作ってきた矩形描画関数を使ってウィンドウを表示した,実際には複数の矩形描画関数を内部にもつ新たなウィンドウ表示関数として実装.

・クローズボタン(✖ボタン)はフォントデータと同様の方法で作成

・複数のウィンドウを管理する際のshtctl関数やsheet_slide関数の理解が足りない

f:id:oirom0528:20201018003616p:plain

ウィンドウが出たよ!

所感

とうとうウィンドウが出てきました!ここまでくると「パソコン」感が増しますね.当然のことながらウィンドウは内部的な設定は一切行っていないため動かしたり✖ボタンをクリックして閉じたりすることはできません.意外にもウィンドウ表示がこれまで作ってきた矩形描画関数の集合体でできていたのには驚いた.案外シンプルなこともあるんだな~,と.

余談

最近知ったOSにMINIXと呼ばれるものがある.Linuxの先祖にあたるとされていて,もともとはオランダ・アムステルダム自由大学のタネンバウム教授が教育用に開発したもの.教育用なだけあってシンプルかつ実装規模も小さいためUNIXの学習に最適らしいけれどいかんせん日本語の文献が少ない.英語文献読もうかな….とほほ.

言い訳になりますが論文作成などで忙しく二日ほどスキップしてしまいました,明日からまた気を取り直して頑張っていこうと思います.

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

取り組んだ内容

・OS自作入門,pp.194-213

取り組んだ内容の詳細

・引き続きメモリ管理,これまで1byte単位で管理していたメモリを0x1000バイト単位で管理するように変更,これによって連続しない小さな空きメモリを減らすことができる

・アプリケーションなどを表示する際の基本となるウィンドウの重ね合わせ処理を実装した,構造体を用意しサイズや何番目のウィンドウかなどの情報を記憶,そのほか最下部にあるウィンドウから順に描画する関数などを作成

・ウィンドウ描画(リフレッシュ)関数において,リフレッシュ部分を画面全体ではな一部分指定できるようにし処理を軽くした

所感

今回は内部的な設定が多くビジュアル的な進歩はなかった.しかし,今日行った内容は後々アプリケーションやブラウザなどのソフトウェア的な機能に必須となる部分である.しっかり理解していきたい.

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

取り組んだ内容

・OS自作入門,pp.175-193

取り組んだ内容の詳細

・キーボードやマウスからの信号受け取りやハンドラの設定によってソースファイルが大きくなりすぎたため,分割した

・メモリチェックを行った,キャッシュを停止することでメモリ操作が維持されているかどうかを確認した

・メモリチェック用のプログラムをコンパイルした際に生成されるアセンブリソースを見ると想定していた内容と異なっていた,これはコンパイラの最適化が働いてしまいメモリチェックのために記述していたメモリ内容の反転処理などを勝手に省略していたことに起因する

・上記の問題を解消するためにメモリチェック処理の一部を最初からアセンブリで書いた

・メモリ管理を始めた,メモリ管理の方法が少し動的計画法ぽかった,開始番地とサイズで記録するかんじ

f:id:oirom0528:20201013214451p:plain

メモリ管理できてるよ

所感

OSらしい機能の話になってきました.メモリ管理については低レイヤー界隈でよく出てくる話題であるだけに早く理解したいが,今回取り組んだ内容は結構難しかった.復習したい.ただメモリ管理のアイデア自体はけっこうシンプルな印象.分割して記憶されているメモリの空き領域について重複部分があれば結合させるなど,意外と古典的なアルゴリズム

余談

なんと昨日の投稿を忘れてしまっていました.10日目にして早速企画倒れです.過ぎたことを気にしていてもしょうがないので気を取り直してまた明日から頑張っていきます!

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

取り組んだ内容

・OS自作入門,pp.166-174

取り組んだ内容の詳細

・今日取り組んだ部分はコーディンではなく過去の実装で充分に説明されていなかった部分の説明を読んだかんじ

・PICの初期化前にすべての割り込みを受け付けないようにしたり,メモリの全領域を使用できるように信号線を解放したりなど

・コントロールレジスタ0(CR0)の32bitのうち,最上位を0,最下位を1にするとプロテクトモードに移行することができる

・プロテクトモードとはセグメントレジスタにGDTを使うようになるモードのことであり,アプリケーションがセグメント設定を変更したりOS用のセグメントを使うことができいように保護するモードである

・命令実行の高速化 = パイプライン

・memcpy関数がちょっとわからない

所感

今日取り組んだ内容をまとめると,OSの起動時には色々な設定がある中でも割り込みに関する設定を迅速に終わらせて割り込みを受け付けるようにしなければハードウェアから送られてくるデータの取りこぼしが発生してしまう可能性があるため,そういうことにならないように割り込みの設定を早めに終わらせている,という説明を読んだ.

日曜日なので少し気が緩んでしまい取り組んだ内容が少ない.明日からはまた気合を入れて頑張っていく!

余談

久々にバイクに乗って外出らしい外出をした.近くのデパートでラーメンとクレープを食べただけだけど.しばらくロングツーリングに行っていないので気分転換に阿蘇あたりまで走りに行きたい.

f:id:oirom0528:20201012003209j:plain

僕の相棒

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

取り組んだ内容

・OS自作入門,pp.157-165

取り組んだ内容の詳細

・マウスから送られてくるデータを解読した,具体的には最初に送られてくるデータ(0xfa)を読み捨てて以降のデータを3つのフェーズに分けて受信し,それぞれをバッファに保存する.3つのデータとはボタン,x座標移動量,y座標移動量である.

・3つのデータが揃った時点でその内容を画面描画した

・画面描画する直前にフェーズ記憶変数を1に設定することで再び3つのフェーズに分けてマウス信号を受け取ることができる

・マウス信号の1バイト目が取りうる値は範囲が限られているため,これをチェックする機構をビット演算によって実現

・マウス信号をもとにマウスカーソルを再描画することでマウスカーソルの移動を実現

f:id:oirom0528:20201010195147p:plain

マウスカーソルが動いたよ

所感

やっとマウスカーソルが動きました!やはり目に見えて変化が現れると達成感がありますね.ここに来るまで割り込みテーブルやバッファ,こまごまとした関数の設定など変化が目に見えない部分ばかりいじっていたのでかなり嬉しいです(笑).

 

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

取り組んだ内容

・OS自作開発,pp.137-156

 

取り組んだ内容の詳細

・キー入力を連続して受け取れるようにした,具体的にはキー入力を受け付ける割り込みハンドラ関数について,IRQ1受付を完了を通知した後に入力されたキーを画面出力,その後HLT(停止)せずにリターンするよう変更した

・割り込み処理中に描画処理を行っていた部分について,描画処理を外部で実行するように変更し,割り込み処理は割り込み処理だけを行うように変更した

・キー入力用のバッファを用意し,連続したキー入力を十分に扱えるようにした

・キー入力に対して行っていた作業をマウス入力にも適用し,マウス入力を扱えるようにした,キーボード制御回路などの設定が複雑(要復習)

f:id:oirom0528:20201010022933p:plain

キーボードとマウスからの割り込みを受け付けたよ

所感

とうとうマウス入力を受け取れるようになりました.まだマウスカーソルが動くには至っていませんが,マウスを動かすとOS実行画面にて入力信号の内容を確認できるようになったので,マウス操作まであと少しです.上図の38という数字がキー入力信号,01という数字がマウス入力信号を表しています.機能の充実に伴って内容もどんどん難化しているように感じますが,一つ一つ丁寧に取り組めば必ず理解できる内容になっていると思います.ここまで学んだことを忘れないように,明日からは過去に取り組んだ内容について復習しながら進めていきたいです.

 

余談

ブログを開始して一週間が経過しました.いまのところ順調に進んでいるように感じていますが,それと同時に自分ならもっとやれるという思いもあります.企画名「本気出してみた」に見劣りしない内容にするためにはもっと本気出さないとですね.

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

取り組んだ内容

・OS自作入門,pp.115-136

 

取り組んだ内容の詳細

・GDTとIDTの設定を完了した,具体的にはそれぞれの構造体を用意しセグメントの大きさ,開始番地,管理用属性を保持するようにした

・リミットと番地を指定するにはGDTRというレジスタを操作する必要があるが,これはアセンブリのMOV命令では代入が行えないので専用のLGDTという命令を使った

・またセグメントのベース番地指定の際,構造体内部のメンバをわざわざ3つに分けていたがこれは古いCPU規格との互換をとるためらしい

・複数の割り込みを扱えるようにPICの初期化をした

・マウスとキーボードからの割り込みに対するハンドラを用意した,このハンドラをIDTに登録することで割り込みが発生した場合にCPUが対応する処理を自動で呼び出してくれる

 

所感

今日はOS開発にしか時間を割くことができなかった.加えて内部的な設定ばかりが続いたのでOSの見た目に変化がなくモヤモヤしている.明日取り組む内容を少し覗いてみたところマウスカーソルを動かすことができていそうなので早く続きに取り組みたい.

 

余談

Netflixで『エミリー、パリへ行く』という海外ドラマを観始めた.アメリカのマーケティング企業に勤めるエミリーがパリへ異動することになり,慣れないフランス語やいじわるな上司に翻弄されながらも自分らしさを忘れずに強く生きるストーリー.主人公のエミリーがめちゃ可愛いし,登場人物がみんなお洒落で視覚的にも観ていて楽しい作品.作中でエミリーの顧客が落ち込んだ気分のときクリームブリュレの表面を叩いてたのが面白かった.フランス映画の名作『アメリ』が公開された年に日本でクリームブリュレが流行したらしいけど,フランス人ってほんとにクリームブリュレが好きなのね.