ラベル MochiOS開発記 の投稿を表示しています。 すべての投稿を表示
ラベル MochiOS開発記 の投稿を表示しています。 すべての投稿を表示

2024年7月21日日曜日

MochiOS開発記@突然のTripleFaultの原因判明!

 デバッグログ強化を進めたお陰でタイトルの通り原因判明に至った。

以下、なりゆき。


(1) デバッグログをメモリ上にも吐き出すように機能追加

(2) TripleFaultを再現させるも、吐き出したメモリ上のログが破壊されていることに気づく

(3) GDB繋いでログメモリ先頭アドレスにwatchpoint設定して監視するも、引っ掛からない

 ⇒つまり、別の仮想アドレスからメモリ破壊していることに気づく

(4) ページマッピング箇所にトレースログを仕込み

(5) どんどんページに割り当ててる物理アドレスが加算されていることに気づく

 ⇒つまり、メモリリーク

(6) 怪しい所にどんどんトレースログ追加していき原因判明



直接的原因1:

 プロセスのヒープ領域を縮小する時に、ページマッピング解除は行っているが、割り当てている物理メモリを解放していなかった。

直接的原因2:

 普通に設計上固定的に使っている物理メモリ領域をカーネルの物理メモリ管理くんが未使用と認識していて、割当てを行っていた。


直接的原因1の動機的原因(根本)は、後で実装すればいいや精神でテキトーに実装したからだな・・・。ページマッピング解除時に関数のインタフェース仕様が理由で割り当てていた物理メモリアドレスがわからないから解放ができず、割と大がかりな構成変更が必要だったから後回しにしていたようだ。なんにも残してない自分が悪いね。個人開発でもTODO管理やチケット管理ってやっぱ必要だと思う。うん。


直接的原因2のほうは・・・なんでだろうね。どう考えていたか覚えていない。



あー超スッキリした!メモリマネージャ大改造しよ。これが当面の目標。


2024年6月1日土曜日

MochiOS開発記@デバッグログ強化検討

 MochiKernelのデバッグログは下記情報を持っている。

・ログ出力したモジュール-サブモジュール(つまりひとつのソースファイル)のID

・ログ出力した行数

・文字列


デバッグログ種別やレベルなどは持たせていなくて、好き勝手していた。

いざ不具合があると情報が足りなくなるし、不具合がないと不要なログで埋め尽くされて見たいものが見れなくなる、ということに悩まされてきたので、種別の概念を追加することにする。


大体、世の中のシステムログ種別は以下のような感じか(超適当)

種別 概要
emergency システムが使用できなくなった系
alert 対処しないとまずい系
critical 致命的で対処しようがない系
error エラー全般
warning 警告全般
notice エラーでも警告でもないがちょっとあやしい系
informational なんか処理したよ系
debug プログラムデバッグ情報系

参考にしてこんな感じにしよう。(全然参考にしてない)
種別 概要
abort あぼーと。もう何もできない。死んだ。
error 想定外のエラー。処理を続けられないので中断。
warning 想定内のエラー。処理を続けられないので中断。
info なんか処理した。頻度低(HW割込みとかタスクスイッチ系はダメ)。
trace コードここ通ったよ。頻度低(HW割込みとかタスクスイッチ系はダメ)。
temp デバッグ中に使う専用。残さない。

種別ごとに有効化マクロ定義しとこ。

2024年5月28日火曜日

MochiOS開発記@当面の目標

突然のフリーズ。 カーネルログを見ても解析困難。
というわけで、このバグ修正を当面の目標にしよう。
INT14なのでページフォルトなのだけど、誰かがメモリ破壊してる気がするなぁ。。。
とりあえず、カーネルログのレベル実装してもうちょい情報増やしてみよう。

Rust@naked関数

Rust@naked関数 multiboot仕様でブートローダを自作せずGRUBから自作カーネル(もどき)を起動できたので、起動情報も色々受け取りたい。multiboot準拠していれば、起動直前にブートローダがレジスタEAXにマジック値を...