IDマッピングページテーブルをロードした人は誰ですか?

IDマッピングページテーブルをロードした人は誰ですか?

Linux x86_64のブートステップを知りたいと思っていますが、いくつかの記事を読んでlinux-3.14.65/Documentation/x86/boot.txt実行する最初の手順はほとんど知りたいのですが、次の内容の説明を見ると次のvmlinuxようになります。startup_x86arch/x86/kernel/head_64.Sstartup_64

    .text
__HEAD
.code64
.globl startup_64
startup_64:
/*
 * At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
 * and someone has loaded an identity mapped page table
 * for us.  These identity mapped page tables map all of the
 * kernel pages and possibly all of memory.

CPU runs in 64bit modeコメントはまだ混乱しています。誰が投稿したのかわかりませんhas loaded an identity mapped page table for us。これはGrub?私は何を見逃していますか?

答え1

startup_64入場可能

/* The entry point for the PE/COFF executable is efi_pe_entry. */
ENTRY(efi_pe_entry)
...
    movl    BP_code32_start(%esi), %eax
    leaq    startup_64(%rax), %rax
    jmp *%rax
ENDPROC(efi_pe_entry)

あるいは、Linux対応EFIブートローダがhandover_entryルーチンの内部に直接移動できると思います。efi_pe_entryこのハイブリッドアプローチにより、ブートローダはカーネルがEFI固有の機能を使用できるようにしながら、いくつかのLinux固有の機能を引き続き提供できます。バラよりEFIシステムの起動プロセス(LWN.net)

最後に、startup_64fromへのジャンプが発生する可能性がありますstartup_32。これは、Linux対応BIOSブートローダによってカーネルがロードされたときに発生します。

(まあ、もう1つのケースがあります。64ビットカーネルにポイントがあり、efi32_stub_entryそのポイントにジャンプできます。startup_32私はそれを無視します。とにかく、32ビットEFIの64ビットカーネルはまだ実験的なものとしてマークされています。)

startup_64上記の内容によると、これは不明です。一度実行する最初のコマンドですvmlinux。コメントには「64ビットブートローダから直接」をインポートできると記載されていますが、私はその事実を知りません。

BIOSでは、startup_32最初の64ビットページテーブル(「初期4Gブートページテーブル」)を設定し、もちろん64ビットモード(「長いモード」とも呼ばれる)に切り替える役割を果たすことが明らかになります。

EFI64の場合、CPUはすでに64ビットモードです。 efi_pe_entry電話make_boot_params()してefi_main()入力してくださいeboot.c。 (handover_entry電話をかけるだけですefi_main()。この場合はブートローダが提供しますstruct boot_params。) eboot.cページテーブルが設定されていません。したがって、コメントは、ロードするカーネルのすべてのページ(すべてのページを含む)に対して少なくともEFIを想定します。BSSspace)、それは私にとって意味があります:-).

https://elixir.bootlin.com/linux/v4.20/source/arch/x86/boot/compressed/head_64.S

答え2

「ページテーブルの初期化」セクションの最初の箇条書きによるとhttp://www.cse.iitd.ernet.in/~sbansal/os/lec/l14.html、Entry.Sはページテーブルの設定を担当します。私たちはロジックを見つけましたhttps://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S問題を解決します(「ページテーブルは次のように設定されています...」)。

存在するhttps://github.com/torvalds/linux/blob/v4.14/arch/x86/boot/compressed/head_64.Sしかし、ページテーブルの設定へのより多くの参照が見つかりました。これには、「初期4Gブートページテーブルの構築」と「ブートページテーブルの有効化」が表示されます。

この資料では、ID ページングを含むページングを有効にする方法の例を示します。https://github.com/littleosbook/littleosbook/blob/master/paging.md。この例では、次のように制御レジスタcr3、cr4、およびcr0を使用します。https://en.wikipedia.org/wiki/Control_register。 Entry_64.S および head_64.S ファイルもこれらの制御レジスタを使用します。

関連情報