読者です 読者をやめる 読者になる 読者になる

livaの雑記帳

OSとか作ってみたい

2016/8

書き溜めた知見(というよりは独り言)を転記

 

8/28

  • cpuid 1における謎な例外発生は単純なプログラミングミスだった。関数ポインタのポインタでコールバック呼び出しをしていたのだけど、実体となる関数ポインタ変数自体がスタックに置かれているので、そのポインタを取ってしまうと事故る、という話。
    • これ自体は些細なバグなのだけど、これによって変な場所を関数callしてしまい、invalid operand例外が発生した。ユーザーランドプログラミングだとinvalid operandになった場合はまあ関数ポインタの向き先を間違えた、と分かるのだけど、カーネル開発だとメモリ破壊を含めたいろいろな可能性を考慮しなければいけないから、バグの特定が面倒。

 

8/27

  • 現状AHCI実装の進捗生産を阻んでいるのは、cpuid 1(割り込み処理CPU)における謎な例外発生現象。一つの可能性として、カーネルスタックのオーバーフローによるメモリ破壊が起きていると仮定。カーネルスタックの両端に未割当ページを配置する事で、オーバーフロー時にページフォルトが発生するようにした。(Raphine/Raph_Kernel#81
    • ついでに、カーネルスタックの先頭にカーネルスレッド情報を格納する構造体を配置。CPU ID等を格納しておく事で、ハードウェアアクセスがなくなり、性能劣化を防げる。
      • なんでこんな事をしたかというと、APIC ID取得命令って結構遅いから。デッドロック検出のためにスピンロック確保時はCPU IDによる簡易チェックが走るようになっているのだけど、その度にハードウェアアクセスすると、馬鹿にならない程の性能低下が起きる。一回一回は大した事が無くても、スピンロックは結構呼ばれるので、これはよろしくない。
  • カーネルスタックの未割当ページガードを実装したものの、どうやら問題はここではないらしい。まあスタックガードはいずれ実装しなければならなかったし、これで一つ問題の切り分けができたので、良しとする。続きの実装はまた明日。

 

8/25

  • カーネルスタックって、仮想アドレスで(スレッド毎に)同じ場所に配置するのと、別々に配置するのだったらどちらが良いのだろう?
    • 前者だとTSSやIDTを全スレッドで共通化できる。(物理ページレベルで)ただし、別のスレッドの変数を参照すると事故る。(そもそもそんな事をするべきでないけど、万が一の場合)
    • 後者だとカーネル空間を完全に共通化する事ができる。ただし、コンテキストスイッチの際にTSSやIDTを毎回切替えないといけない
    • I/O permissionをスレッド毎に切り替える(かどうかは未定)とすると、結局TSSはスレッド毎に必要なので、後者で良いのでは
  • ラズパイ3移植の際に参考になりそうなページを発見。http://d.hatena.ne.jp/cupnes/20160529/1464513206
  • とりあえずgoogle検索にこのサイトが引っかかるようになった(→8/24)

 

8/24

  • リアルの生活が忙しくていろいろ滞り気味だけど、半分くらい解消したので、少しづつ記事も書いていかねば。
  • まずはgoogle検索に引っかかるよう、登録した。といってもまだ中身ないから引っ掛かってもしょうがないんだけどね

 

8/21

  • カーネルスタックオーバーフローを検知できるようにしよう。今はオーバーフローするとそのまま何に使われているかよく分からないメモリ領域を破壊し続けるので、謎なバグが発生してしまう。対応方針としては、カーネルスタックの直上にマップされていないページを配置し、カーネルスタックが伸びたらページフォルトが起きるようにする。Raphine/Raph_Kernel#79

 

8/19

 

8/17

  • カーネル解説のページがどんどん増えていって、執筆が追いつかない
  • カーネル開発、別プロジェクトの活動、本業、でやる事多すぎててんやわんや
  • BSDのDEVMETHODに対する理解が少し進んだ。結果、設計が崩壊して、bsddev_pci_ctrlとかいう謎グローバル変数が誕生する事になった。後でもう少し綺麗にしなくちゃなぁ。。。
  • ↑のように一瞬思ったけど、BSDではparent側に定義されているDEVMETHODをchild側に定義するだけでかなり綺麗な設計になる気がしてる。これで勝った!

 

 

8/14

  • self mergeとかforce pushを検出できるようにしたい。webhookでなんとかなるかな?

 

8/12

  • 昨日、ストックからカーネル解説を書くと言ったが、2記事書いた所でストックが切れた。本当にわずかなストックだった。ここからは0から書かなければならないのか。。。はぁ。

 

8/11

  • Raph Libraryにスマートポインタを追加した。(issue:L26)
    • 実装的にこれで大丈夫か怪しいが、ひとまずうちのプロジェクトで使う分には問題なさそう。マルチスレッド対応にもしてある。
  • LEDiAさんのお陰で環境構築方法のページが出来上がってきた。
  • カーネル解説、とりあえず時間もないから、以前書いたテキスト(非公開)を流用しよう。手抜き、大事。

 

8/10

  • 昨日このサイトを作ったが、暫くは未完成のままになりそう。早くいろいろコンテンツを作らないと。
    • TODO: カーネルに関する解説を上げていく
    • WordPressデフォルトテーマ(Twenty Ten)がダサいので、何かお洒落なのに変えたい
  • cpuidを毎回取得するボトルネックを減らすために、Taskにcpuidを突っ込む設計にしよう。関数ポインタの扱いがなかなか難しいけれど、良い案はないものか。。。
  • slack的なチャットシステムを作りたい。
    • slackがもうちょっとオープンになったようなものがいいなぁ
    • IRCよりもナウい奴で(?)