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

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

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

取り組んだ内容

OS自作入門,pp.312-335
Linux2.0 カーネルブック,pp.1-32
Linuxカーネルの教科書,pp.1-91

取り組んだ内容の詳細

OS自作入門

  • タスク管理を自動化するためにタスクの初期化関数や構造体を定義.タスク割り当てと実行が簡単になった
  • 時間を無駄に使うタスクをスリープさせるためにタスク管理用の構造体に対してずらし処理を行う関数を作成
  • バッファが入力を受けとったときにタスクを指定して実行できるようにFIFOを変更
  • タスク管理自動化の恩恵を感じるため表示ウィンドウを増やし,それぞれにタスクを割り当てた

f:id:oirom0528:20201129033506p:plain:w500
複数ウィンドウ表示しているよ!

  • タスク構造体に優先度を保持する変数を追加,この優先度をもとにタスク切替までの時間が決まる
  • 優先度の同じタスクが存在する場合により優先するタスクを決められるようにした

所感

前回はマルチタスクに取り組み始めたところだったんですね,期間が開きすぎて忘れていました.上記の内容の最後の部分でマウスの動きがかなりスムーズになりました.これってFIFOへの入力(マウス操作)が忙しいときにはマウス関連のタスクを優先してるってことでいいんですよね?疑問は残りますがとりあえず進めていきます.最近はLinuxカーネル関連の本を読み始めました.図書館に購入依頼を出していたものがやっと購入されたのです.Linux以外の書籍だとCPUやRISC-V,Rust,コンパイラなど低レイヤー関連の書籍が9冊ほど蔵書に加わりました.早く読んでレビュー(購入依頼者の義務)も提出したいです.個人的には「Linuxカーネルの教科書」という書籍が内容が易しく分かりやすいので気に入っています.今はタスクスケジューリングの章に差し掛かったところ,なぜかOS開発とリンクしていますね(笑).

余談

論文を書いたり資料作ったり学会で発表したりと忙しかったこともあり,一ヶ月ほど更新しておりませんでした.OS自作は進められてませんでしたが,コンピュータアーキテクチャLinuxカーネルに関する書籍を読んだり地道に低レイヤー学習は続けてました.いろいろな書籍を同時進行で読んでいると,頻出ワードや基本となるシステムなど自然と覚えていくのでいいですね.最近は書籍を読むときにあまり気合を入れず,分からない部分はスルーしてもいいやくらいの気持ちで読んでいます.誰かのブログに,知識には「知らない(聞いたこともない)」,「知ってる(聞いたことはある)」,「理解している」の3つの段階があり,「知らない」の段階から「知っている」の段階に遷移するだけでも成長だと書かれていました.このマインド,いいですね.

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

取り組んだ内容

OS自作入門,pp.290-311
Flask ~web development, one drop at a time~, Tutorial.1-3

取り組んだ内容の詳細

OS自作入門

  • 2つ分のTSS(task state segment)を作成し,セグメンテーション導入の時に作ったGDTに登録
  • アセンブリでタスクスイッチ関数(JMP)を書いて,一定時間ごとに別タスクへJMPさせることでマルチタスクを実現
  • タスクスイッチの間隔を非常に短く(0.02秒)設定して動作確認,スイッチ時の割り込み停止を感じないほど
  • タスクスイッチのプログラムを独立したファイルにして動作するように変更(これが本物のタスクスイッチらしい)

Flask ~web development, one drop at a time~

  • FlaskのアプリケーションはFlaskクラスのインスタンス
  • Flaskインスタンスをグローバルに作るよりも,application factoryとして関数内に定義することが種々のコンフリクト回避の観点からも一般的
  • インスタンス作成や最小限の設定を書いたscriptをパッケージとして保存し,flaskコマンドを使って実行できた
  • データベースの作成,初期化,アプリケーションとの接続を行った

所感

OS自作はマルチタスクに突入しました.タスクのスイッチが意外にもメモリ内容の対比,読み出しの連続を高速で行うというパワーで押し切ってる感.CPU性能が重要な理由が垣間見えました.また,今回のタスクスイッチにおいても過去に作っておいたGDTを活用したりなど,基本的な仕組みは色々な場面で応用が効くんだなと実感した.記憶が正しければGDTってセグメンテーションのために備えていたはずだけど,どうやら最近のOSではセグメンテーションは基本的に使わないらしい(ページングが主流?).このあたりのOSの今昔での差分はhikaliumさんが分かりやすくまとめたスライドがあったはずなのでまた読んでおく.書籍の続きをみるとマルチタスクが引き続くようです.頑張ります.

Flaskは低レイヤーではありませんが勉強の記録として書いてます.これまでDjangoやReactなどのウェブフレームワークは触ったことはあるのですがなかなか理解できずに放置することが多かったところ,Twitterにて初心者はFlaskなどの必要最小限の機能を備えたフレームワークから始めるのが吉とのつぶやきを目にしたため取り組みました.まだチュートリアルを進めている段階ですが割と理解できている気がする(コンパクトさゆえなのかは分からない).あと,このチュートリアルはもともと英語で書かれており有志による翻訳版もネットにはあるのですが,リーディングや単語の勉強も兼ねて頑張って原文を読み進めています.最近は英語で論文を書く機会も多いですし,自分のこれからのキャリアも考えてみると技術英語には最低限慣れておかないとな,と.

余談

前回からかなり(4日??)更新の間隔が開いてしまいました.バイトの連勤や体調不良が続いた…,というのは言い訳ですね,反省します.ただ,ブログを更新しないと少し罪悪感を感じるようになってきていて,これは割といい変化なのではないかと感じている.アウトプットとまでは言わなくとも日々の成果を記録する習慣がついてきている.とりあえず当初の目標だった30日分のブログ投稿までは頑張ります.30日って思ったよりも長いですね.

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

取り組んだ内容

  • OS自作入門,pp.282-289
  • 取り組んだ内容の詳細

  • 今までキーボードを打鍵すると対応するキーコードが出力されていたが,このキーコードをもとに対応する文字を描画するように変更した
  • 矩形描画関数を使ってテキストボックスを描画し,カーソルを重ねることで入力フォームらしくした,またキー入力がある度にカーソルを進める処理を加えた
  • f:id:oirom0528:20201023184421p:plain:w500
    テキスト入力できるよ!
  • マウスカーソルが移動する際にボタン信号が右クリックを押している状態のとき,マウスカーソルの移動量をウィンドウ描画関数に渡すことでウィンドウの移動を実現した
  • f:id:oirom0528:20201023185056p:plain:w500
    ウィンドウが動くよ!

    所感

    過去に作った関数を使ってどんどん高機能化することができています,大満足です.ウィンドウの重ね合わせの処理などに時間をかけていただけあって,ここにきてその恩恵を受けています.そろそろ復習も兼ねてプログラムのリコーディングを始めたいのですが,せっかくなのでC言語じゃなくてC++あたりで書きたいですね.Rustで実装している人もいるので参考にするとよさそう.

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

    取り組んだ内容

  • OS自作入門,pp.271-281
  • 取り組んだ内容の詳細

  • 昨日取り組んだタイマ性能の改良効果があったのか確認した,改良前と後では微々たる差しかなかったが割り込み処理の高速化という観点から見ると充分らしい
  • VBE(VESA BIOS Extensio)を使って画面の高解像度化を行った
  • MOV    BX, 0x4101        ;VBEの640x480xbitカラーモード
    MOV    AX, 0x4f02        ;VBEカラーモードの時のお決まり
    INT    0x10
    

  • VBEが使用可能かを勝手に確かめて使用可能なら使う,不可能なら320x200のままにするようアセンブリを書き直した
  • f:id:oirom0528:20201023072507p:plain:w500
    画面が大きくなったよ

    所感

    画面が大きくなりました!書籍の中でこれからの内容は今までつくった色々な機能を使うことがメインになると書いてあったのでそろそろ理解がおろそかな部分を復習しないとですね.

    余談

    今日,Go言語のフレームワークであるginを使って簡単なウェブサーバを書いてみました.書いてみて思ったのはどんなに便利なフレームワークであっても,フレームワークを使わずに実装した場合の動きや仕組みを理解していないと使いこなせないということですね.ウェブアプリケーションの仕組みについてはRailsチュートリアルが分かりやすく丁寧だった記憶があるので再度勉強してみようかな(こちらも量が膨大).

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

    取り組んだ内容

    [1] OS自作入門,pp.250-266

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

    取り組んだ内容の詳細

    [1] OS自作入門

    ・背景色とフォントの描画,そして画面更新を一つの関数にまとめて起動用プログラムの行数をリダクション

    ・タイマー用のバッファを一つにまとめて,タイムアウト時に書き込まれる値でどのタイマがタイムアウトしたのかを判別するようにした

    ・タイマカウント用の変数を用意し,性能比較した,エミュレータ上で起動するよりも実機の方がやはり速いらしい(実機確認できないので書籍で確認)

    ・キーボードやマウス用のバッファも同様に一つにまとめた,この際データ型をcharからintに変更して対応した

    ・以上の改良によってタイマの性能がおよそ1.3倍向上(まじか笑)

    ・タイマ管理用の構造体にnextという構造体を設けて次の時刻のタイマが入るようにした,ずらし処理によって次のタイマを管理するのではなく配列を途中でつなぎ変えるようなイメージ

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

    ・キャッシュの種類や制御機構,性能指標などについて読んだ

    ・キャッシュに関する用語(ライン,ラインサイズ,ブロック,etc...)を知った

    ・キャッシュとメインメモリの中間に位置するテーブルとかが仮想メモリの機構と似てるな思ったらやはり書籍内でも言及されていた

    所感

    疲れていたのでコード部分はほとんど読んでない,説明文章のみ.タイマ管理は後々アプリーション開発で重要になってくるという予想はやはり当たっていて書籍の中でも述べられていた.今日はもう寝て明日早起きして続きしようかな~.

    コンピュータアーキテクチャにおける性能向上のための機構は,機能は異なっても似た手法がとられていることがあったりして「こういうの前にもあったな~」となって楽しい.また,これまでよく知らなかった用語なども使いどころと共に知ることができていて楽しい(どう楽しいか説明する気力がない).また,性能向上のために考えられている複数の手法がトレードオフの関係にあるとき,それらを上手く組み合わせたハイブリッドな手法が現代のコンピュータの主流となっているケースが多い気がする.いや~,感心します

    『コンピュータアーキテクチャの基礎』は第7章のメモリアークテクチャ編を読み終えたので次回からは入出力アーキテクチャ編に突入です.外部デバイスに足を踏む入れる時が来ましたね,楽しみです.

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

    取り組んだ内容

    [1] OS自作入門,pp.231-249

    [2] オペレーティングシステム ~設計と理論およびMINIXによる実装~,pp.

    取り組んだ内容の詳細

    [1] OS自作入門

    ・タイマを扱うためにPITの設定を行った,IRQ0につながれたPITに対して10msごとに割り込みを行うようにinit_pit関数を定義,そしてIRQ0発生時に呼び出される割り込みハンドラを作成し,IDTに登録

    タイムアウト機能を実装するために時間管理用の構造体に新たにtimeout変数を追加し,割り込みハンドラが呼び出されるたびに減少するようにした

    ・複数のタイマを扱うために構造体内のtimeout変数を配列化,さらにそれぞれのタイマの状態を記憶するためのフラグを用意

    ・複数のタイマを実行するためのCプログラムも実装,意外にもシンプル

    ・点滅するカーソルを実装,これはタイマが切れるたびに新たにタイマを設定し直すこと点滅間隔を実現していた

    ・割り込みハンドラ内の無駄な処理(タイムアウト変数を一つ一つ減らしていく処理)を変更,タイムアウト予定時刻と現在時刻との比較によってタイムアウト判定を行うように改良した

    ・割り込みハンドラ内でタイムアウト変数の数だけ実行されていた if 文(ほとんど空打ち)を廃止し,次のタイムアウト時間を保持する next 変数を導入することで,この next 変数と現在時刻を比較して無駄な空打ち処理をなくすよう再実装した

    f:id:oirom0528:20201020231257p:plain

    カーソルが点滅してるよ

    [2] オペレーティングシステム ~設計と理論およびMINIXによる実装~

     

    所感

    タイマを実装したので,将来プログラムが一定時間内に終了しなかった場合に強制終了させることができるようになりましたね(デッドロックの回避とか??).次章以降もまだタイマに関する話が続きそうです,ちょっと退屈なのでこの機会にしっかり復習してみようかな~.

    MINIXの本は読み進めてはいるんだけどなかなか理解で来ていない気がします.システムコールの説明ばかりなのが原因か(一体何の説明なら理解できる?).そういえば付属のCD-ROMをまだ使ってなかったので,早くインストールして実際に操作しながら本を読み進めたほうが理解が深まる気がする.

    余談

    少し前になるが図書館の選書ツアーに参加して読みたい本を10冊ほど購入依頼した.まだ発注をかけている段階で届くのがいつになるかは分からないらしいが非常に楽しみ.選書したほんのほとんどが低レイヤー関係の技術書.卒業するまでに何としてでも読み切りたいけど果たして可能なのか.とりあえず今借りている5冊を年末までに読み切ろうと思う.

     

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

    取り組んだ内容

    [1] OS自作入門,pp.222-230

    [2] オペレーティングシステム ~設計と理論およびMINIXによる実装~,pp.1-22

    [3] AtCoder

    取り組んだ内容の詳細

    [1] OS自作入門

    ・カウンタを実装した

    ・具体的には,ウィンドウ描画関数の上にフォントを描画し,描画されているフォントのメモリ内容を繰り返し処理によって随時更新するというもの

    ・カウンタの速さはおそらくマシンに依存していて実時間とはことなる

    ・カウンタ実装後,ウィンドウにちらつきが発生した,これは背景,ウィンドウという順に描画を行っているため二重に描画されている部分があるため.描画の必要のない背景などは描画しないようにウィンドウごとにパラメータを保持させて重なりを考慮するようにした

    ・マウスと重なった場合にちらつきが発生するためウィンドウのマップ(画面上のどの部分にウィンドウが位置するか,重なりはどうなっているか)を作成し,マップに基づいた描画を行うことで変化のあった部分のみ再描画するように変更した.

    f:id:oirom0528:20201019202824p:plain

    カウンタが動いてるよ

    [2] オペレーティングシステム ~設計と理論およびMINIXによる実装~

    ・OSの歴史をコンピュータの歴史と重ねて説明していた,発展の経緯など

    ・プロセスやファイルの説明などOSの基礎についての説明

    ・プロセス間の橋渡しとなるパイプの概念など

    [3] Atcoder

    ・ABC179-Eを解説を見て理解した

    ・周期性のある数列について周期部分をうまく管理するために配列を使ったり,累積和を保存しておくことで周期+余り分の数列を上手く取り扱っていた

    所感

    カウンタを実装しました.少し前からCプログラムソースばかりいじるようになってアプリケーション開発をしているような感覚です(違うか?).違いますね,アプリケーションを開発するための土台として必要な機能の開発なのでやはりOS開発です(アプリケーションつくるときにシステム由来の画面のちらつきとか考慮しないと思うので).最近ペースが落ちています,怠けてますね,だめです.ペースアップしていくぞ~!!

    先日ブログにも書いたMINIXの書籍を学校の図書館で見つけてしまった(こんなマイナー?な本が所蔵されているなんて!)ので早速借りて読んでみた.総ページ数が1000ページと物凄い量だが文章が意外にも堅くないのでなんとか読み進められそう.OSの基礎について具体的な事例を挙げながら説明しておりとても良い.さすが教育用に開発されたMINIXを題材にしているだけある.

    AtCoderの過去問に久しぶりに取り組みました.最近まったく精進できていなかったのでレート上げのためにもこれからまた続けたいと思う.先日参加したABC180では4コンテストぶりにレートが上がったのでうれしかった(灰色のくせにレート下がるってやばい).精進量に目を向けるのではなくアルゴリズムを丁寧に理解しながら実装力を身に着けて入茶を目指します.

    f:id:oirom0528:20201019203506p:plain

    次のコンテストでカラーリングしたい…