2016-10-05 20 views
0

現在、私はACPIテーブルとインターフェイスしたい単純なカーネルを開発中です。カーネル環境:RSDPが無効なRSDTを指しています

私のコードは仮想マシン、すなわちBochsでしか動作していないようですが、実際のハードウェア(2003年から2011年までのハードウェア)では、明らかに無効なルートシステムディスクリプタテーブルを指しています。

ここにBochsの画面があります。すべてのディスクリプタテーブルが見つかりました。

enter image description here

しかしBIOSがそう私に関する限り、それはV1のACPIリビジョンの完全なサポートを持っている必要があり、2003年から日付が確かではなく、古いAMD Athlon64などのプラットフォームは、特にを以下に示します。

enter image description here

私はまた私に有効なルートシステム記述子ポインタを与えたどちらも、2010年と2011年からのラップトップ上で私の検出プログラムを実行しようとしたが、ポインタが0xFFで満たさヌルメモリ、メモリのいずれかを指摘または単にジャンクです。同じことが常に実際のハードウェアのために言うことができないのに対し、電源投入時にBochsのは、ゼロにすべてのレジスタを初期化するよう


第明らか可能性は、初期化されていないレジスタのことです。しかし、私はこの可能性について、これらのフォーラムで質問を掲示することを保証するのに十分な時間を確認しました。

また、2002年にLinuxカーネルのメーリングリストのメッセージがいくつか見つかりました。このメッセージでは、画像の中で実行されているPCと同様のノースブリッジがありました。彼らは上記のPCと同じRSDTアドレスを持っていて、RSDPが間違っていないことをさらに保証します。

チェックサムも有効です(低eax(AX)レジスタではゼロになります)。

メモリ領域を印刷する私のルーチンが初期化されていない値で動作し、ハードウェアではなくレジスタを初期化するBochsの傾向がハードウェアではないことが推測されましたが、これは不規則で再現不可能な動作観察されたが、私がテストした各マシンでは、RSDPが指すメモリ領域は一貫して同じジャンクだった。


私も問題を探すためには、私は読者の要求に応じて追加の詳細やソースコードを記入する場所が不明だとして

- 単にここに不便で、読み、これが不快になるだろう、それのすべてをダンプ。

カーネルのエントリポイント:

void __kernel_entry() { 

    clear_scr(0x0000); 

    set_cur(0, 0); 
    print_str("Scanning RSDP header: 0xe0000 - 0xfffff", 39); 

    struct RSDP_descriptor* rd = __RSDP_find_address(); 

    if(rd) { 
     set_cur(0, 1); // Set cursor position 
     __RSDP_print(rd); // Prints the RSDP location, OEM string and the contained RSDT pointer 

    } 

    struct ACPI_SDT_header* rsdt = (struct ACPI_SDT_header*)rd->RSDT_address; 
    memdump((void*)rd, 5, 15); 
    memdump((void*)rsdt, VH-8, VH); //VH: Console height 

    loop:; 
    goto loop; 
} 
+4

あなたはA20を乗り越えていないと確信していますか?それは当初、Bochsの本物とは違っています。AFAIK – tofro

+3

私はtofroに同意します。BIOSがブートセクタを呼び出すときにA20が有効になっていない場合(私が知っているほとんどの実際のハードウェアの場合)、アクセスするメモリアドレスが奇数メガバイトの領域にある場合、実際には1メガバイト低いメモリでデータを読み込みます。 0x3FFF3000は奇数メガバイトの範囲にありますので、0x3FEF3000から読み込みます。BOCHSはほとんどのビルドでA20を有効にしますが、BOCHSをソースから再コンパイルした場合は無効にすることができます。技術的にはほとんどの386はA20を有効にして起動しますが、BIOSはブートローダに制御を移す前にBIOSを無効にします。 –

+0

ほとんどのLinuxディストリビューションで利用できる 'acpidump'という名前のプログラムがあります。ソース(GPL、法的理由からそれをしたくないかもしれないので)を調べるか、少なくとも実際にテーブルにあるものをチェックしてください。私は自分自身をチェックするために、その時代のハードウェア(もっと近代的でも古代的でも)を持っていませんが、出力はあまり見えません。 – deamentiaemundi

答えて

2

あなたの問題は、(当然です)A20有効になっていないかもしれません。ほとんどのリアルハードウェアは、標準のBochsスタートアップとは対照的に、その方法で起動します。

A20が有効になっていないと、考えている以外のアドレスから読むことになります(マイケルのコメントを参照)。

関連する問題