-
Notifications
You must be signed in to change notification settings - Fork 151
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
tviewをLLVM 10でビルドするとページフォルトが発生する #4
Comments
ld.lld-10, clang-10, clang++-10 を使ってビルドすると PF が発生する。 とりあえず lld-7 と lld-10 でリンクした場合のマップファイルの違いを見てみる。まず注目するのは .text 領域の開始アドレスが lld-7 のときは 0xffff80000000b000,lld-10 になると 32 バイトだけ後方にずれ,0xffff80000000b020 になること。 lld-7 でリンクした場合のマップファイル(.text 開始位置付近):
lld-10 でリンクした場合のマップファイル(.text 開始位置付近):
|
.text の開始アドレスが 32 バイトだけ後ろになるため,ELF の LOAD セグメントの開始アドレスもずれるようだ。
Read + Exec の LOAD セグメント(.text 領域が含まれるセグメント)の仮想アドレスが lld-10 では 0xffff80000000b020 になっていることが分かった。仮想アドレスが 4KiB 境界にないことは想定しておらず,そのへんでバグが発生している可能性がある。 |
lld-10 で 0x20 だけ後ろにずれる理由を推測する。 注目するのは Read Exec の LOAD セグメントのオフセットが lld-7 は 0xb000 で lld-10 は 0xa020 になっていること。 ファイル内オフセットが,そのままメモリ上のオフセットに影響している。 |
lld-10 から ELF の LOAD セクションが 4KiB ページ境界にアラインされなくなった。 そのためページ数の計算にページ内オフセットを加算する必要がある。
lld-10 から ELF の LOAD セクションが 4KiB ページ境界にアラインされなくなった。 そのためページ数の計算にページ内オフセットを加算する必要がある。
lld-10 から ELF の LOAD セクションが 4KiB ページ境界にアラインされなくなった。 そのためページ数の計算にページ内オフセットを加算する必要がある。
Measures taken: uchan-nos#4 uchan-nos@b5f7740
MikanOSのビルドはLLVM 7(llvm-7, lld-7, clang-7)で動作確認しているが,
ふとした思いでtviewアプリをLLVM 10でビルドしたらカーネル側でページフォルトが起きることが分かった。
カーネルをLLVM 7,tviewをLLVM 10でビルドし,QEMUで起動させ,
tview jpn.txt
を実行するとページフォルトが発生する。例外時の RIP は 0x14efb4 であった。その周辺の逆アセンブル結果は次。例外が起きたのは movnti 命令。例外が起きたときのスクリーンショットは下図。
The text was updated successfully, but these errors were encountered: