コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2015年5月9日 >>> 2015年5月9日
link もっと後

2015年5月9日

自作ARMエミュレータ - 今さら気づいたブートローダのバグ

目次: Linux

ずっと気づいていなかった自作ARMエミュレータememuのバグを直しました。

エミュレータは、内部に簡易ブートローダを持っているのですが、この簡易ブートローダが変なパラメータをLinuxカーネルに渡していたため、Linuxのブート時に「Ignoring unrecognised tag 0x00000000」と怒られていました。

変なパラメータを渡してLinuxに怒られる
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.18.11 (katsuhiro@falcon) (gcc version 4.9.1 20140710 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.07 - Linaro GCC 4.9-2014.07) ) #1 Fri Apr 17 03:18:38 JST 2015
[    0.000000] CPU: ARM926EJ-S [41069260] revision 0 (ARMv5TEJ), cr=00003137
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] Machine: ARM-Versatile PB
[    0.000000] Ignoring unrecognised tag 0x00000000★★★これ★★★
[    0.000000] Memory policy: Data cache writeback
[    0.000000] On node 0 totalpages: 16384

古き時代からARM LinuxではATAGという仕組み(ATAGの仕様はここにあります)でカーネルのロード位置、InitramFSのイメージの位置、カーネルのコマンドラインなどをブートローダからカーネルに渡しています。

このうち、もうパラメータはない、すなわちパラメータの配列の終端を示すためのATAG_NONEの渡し方が間違っていました。わざわざ仕様書にも0x2を渡すなよ、0x0だぞ(※)と強調して書かれているのに、サイズに0x2を渡していました。マヌケです…。

このバグに気づいたとき、パラメータの終端が無い状態でも動くのか、さすがLinuxなどとアホなことを思っていたのですが、実はRAMの初期値が0だったため、パラメータの配列の終端を突き抜けた後に、0x00が4連続する部分(ATAG_NONEと同じ意味で解釈される)で解析が終了していただけでした。

つまり、今まで動いていたのは偶然!ってことですね。

このバグは現状では問題を引き起こしませんが、今後RAMを初期化しないが、ブートローダは通る、と言う処理を実装すると問題が起きます。例えば、リセット例外によるソフトリセット処理が当てはまりそうです。恐らくRAMの内容に応じてランダムにクラッシュする厄介なバグとして表面化するでしょう。

(※)引用するとThis tag is used to indicate the list end. It is unique in that its size field in the header should be set to 0 (not 2). とのこと。

編集者:すずき(2024/03/05 03:00)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2015年5月9日 >>> 2015年5月9日
link もっと後

管理用メニュー

link 記事を新規作成

<2015>
<<<05>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント5件

  • link 20年6月19日
    すずきさん (04/06 22:54)
    「ディレクトリを予め作成しておけば良いです...」
  • link 20年6月19日
    斎藤さん (04/06 16:25)
    「「Preferencesというメニューか...」
  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」

最近の記事3件

  • link 24年4月17日
    すずき (04/18 22:44)
    「[VSCodeとMarkdownとPlantUMLのローカルサーバー] 目次: LinuxVSCodeのPlantUML Ex...」
  • link 23年4月10日
    すずき (04/18 22:30)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linuxのstruct pageって何?Linu...」
  • link 20年2月22日
    すずき (04/17 02:22)
    「[Zephyr - まとめリンク] 目次: Zephyr導入、ブート周りHello! Zephyr OS!!Hello! Ze...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 04/18 22:44