Linux x86_64のブートステップを知りたいと思っていますが、いくつかの記事を読んでlinux-3.14.65/Documentation/x86/boot.txt
実行する最初の手順はほとんど知りたいのですが、次の内容の説明を見ると次のvmlinux
ようになります。startup_x86
arch/x86/kernel/head_64.S
startup_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_64
fromへのジャンプが発生する可能性があります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 ファイルもこれらの制御レジスタを使用します。