ウォンツテック

そでやまのーと

OS作成 - シェル編

 ユーザランドmallocのコード中にmuse_list(使ったメモリ構造体を連結しておくリストのhead)の操作中にpage fault起こすので調べてました。最初は.bss領域を初期化したのがまずいと思ったのですが。特に0で初期化されてまずい領域もなく、次にリストが空の時のリストへの挿入操作がまずいのかと思いましたがそれも問題なし。とりあえずユーザランドでputsとfor(;;);を注入してどこで止まるか調べてると、どうもコード量(生成バイナリ量)に依存してpage faultが起きたり起きなかったり。これはどうもカーネル内部だなと考え、バイナリ量が大きい時にmallocの初期化時に呼び出すbrkの内部の処理後におかしくなっている事を突き止め、さらにそのプロセスのheap領域を示す最初のアドレスがおかしい事がわかりました。結局heapの先頭領域が0x804c000となっており、readelfでmallocを使用しているユーザランドバイナリのeshellを見てみると0x804c040〜0x804c080にmuse_listやらの領域が存在し、そこがbrkにより上書きでpaging設定されている事が原因でした。

デバッグ .text .rodataと.bssの間

alignがあるから.rodataの直後に.bssが配置されるわけではない。elf program headerのvirtaddr(0x8048000)から各メモリサイズを足しても間にalignの空白があるから後ろが切り捨てられる。とりあえず最後のvirtaddrに最後のメモリサイズを足した場所(さらにそれを0x4000 alignで整地)したのをheap先頭領域としておこうかな。

続々デバッグ

直ったと思った直後に違う原因と思われるpage faultが発生しました。かわいいやつです。