ベストアンサー1
より良い答えが欲しいが、私が理解したことは、これがアセンブリによって直接書かれたカーネルスタートコード(アーキテクチャ固有)であるということです(この時点では、ベアメタルCPUとメモリへの生のアクセスのみがあり、ストレージコンプレックスにアクセスできないことを覚えておいてください)してください)。まだファイルマネージャがないので、ファイルシステムのライブラリは、誰がビッグバンを作成したのかを尋ねるのと同じです。これをブートローダ(ディスクからRAMにブートセクタをロードする)と混同しないでください。私自身も以前の回答で混乱していました。
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
' bootloader ' ' kernel '
' ' ' '
+------+ ' +-----------------------------------+ +------------------------------+ ' ' +-----------------------------+ +---------------------------------------+ '
| BIOS | --> ' | arch/x86/boot/header.S::call main | --> | arch/x86/boot/main.c::main() | ' --> ' | init/main.c::start_kernel() | --> | arch/x86/kernel/setup.c::setup_arch() | '
+------+ ' +-----------------------------------+ +------------------------------+ ' ' +-----------------------------+ +---------------------------------------+ '
' ' ' '
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
(編集:これはMinixです。元々誤って入れました。)
+------+ +--------------------+ +------------------+ +------------------------+
| BIOS | --> | Bootloader (mbr.S) | --> | startup (head.S) | --> | kernel/main.c::kmain() |
+------+ +--------------------+ +------------------+ +------------------------+
head.S の末尾に次の行が表示されます。
call _C_LABEL(kmain)
これはカーネルのエントリポイントです。
kernel/main.c
私はhead.S
それがコンパイル時にカーネルイメージの先頭に追加されると思います。 BIOSは、このコードが最初にあり、RAMディスクのルートファイルシステムであるため、実行することを知っています。
圧縮された部分と圧縮されていない部分がある理由は、どのプログラマも圧縮するほど熟練していないカーネルイメージのアーキテクチャ固有のアセンブリ部分のためだと思います。kmain
Cで書かれたルーチン(ただしアセンブリでコンパイルされたルーチン)にジャンプできると、解凍ルーチンにアクセスでき、カーネルスペースがはるかに小さくなります。
http://duartes.org/gustavo/blog/post/kernel-boot-process/
アセンブリエントリポイントの使用
私たちはすべてをCで書くのが好きですが、いくつかのアセンブリを避けることはできません。カーネルの始点として、x86アセンブリ言語で小さなファイルを作成します。アセンブリファイルがすべきことは、Cで書いた外部関数を呼び出してからプログラムフローを停止することです。
このアセンブリコードがカーネルの始点として機能することをどのように保証できますか?
リンカスクリプトを使用してオブジェクトファイルをリンクし、最終的なカーネル実行可能ファイルを生成します。 (詳細は後述)このリンカスクリプトで、バイナリがアドレス0x100000にロードされることを明示的に指定します。前述したように、このアドレスはカーネルがあると予想されるアドレスです。したがって、ブートローダはカーネルのエントリポイントをトリガする役割を担います。
http://arjunsreedharan.org/post/82710718100/kernel-101-lets-write-a-kernel