Nighpher, sorunuzu cevaplamaya çalışacağım, ancak önyükleme işleminin daha kapsamlı bir açıklaması için IBM makalesini deneyin .
Tamam, sanırım, açıklama için önyükleyiciniz olarak GRUB veya GRUB2 kullanıyorsunuz. Öncelikle, BIOS önyükleyiciyi yüklemek için diskinize eriştiğinde, ünlü 13 saat kesintisinde depolanan disk erişimi için yerleşik yordamlarını kullanır. Bootloader (ve kurulum aşamasında çekirdek) bu rutinleri diske eriştiklerinde kullanır. BIOS'un gerçek mod (16 bit) işlemci modunda çalıştığına dikkat edin, bu nedenle gerçek moddaki her adres segment_adresi * 16 + ofsetinden oluştuğu için 2 ^ 20 bayttan fazla RAM (2 ^ 20 değil 2 ^ 16) hem segment adresi hem de uzaklık 16 bit olduğunda, bkz. http://en.wikipedia.org/wiki/X86_memory_segmentation ). Bu nedenle, bu rutinler 1 MiB'den fazla RAM'e erişemez, bu da katı bir sınırlama ve büyük bir rahatsızlıktır.
BIOS, önyükleyici kodunu doğrudan MBR'den yükler - diskinizin ilk 512 baytı ve yürütür. GRUB kullanıyorsanız, bu kod GRUB aşama 1'dir. Bu kod, DOS uyumluluk bölgesi olarak adlandırılan disk alanının ilk 32 KiB'sinde veya dosya sisteminin sabit bir adresinden bulunan GRUB aşama 1.5'i yükler. Bunu yapmak için dosya sistemini anlamasına gerek yoktur, çünkü aşama 1.5 dosya sisteminde olsa bile, "ham" koddur ve doğrudan RAM'e yüklenebilir ve yürütülebilir: http://www.pixelbeat.org/ dokümanlar / disk / . Stage1.5'in diskten RAM'e yüklenmesi, BIOS disk erişim rutinlerini kullanır.
Stage1.5 dosya sistemi yardımcı programlarını içerir, böylece stage2'yi dosya sisteminden okuyabilir (yine de diskten RAM'e okumak için BIOS 13h'yi kullanır, ancak şimdi inodes vb. Hakkında dosya sistemi bilgilerini deşifre edebilir ve ham kodu disk). Eski BIOS'lar, disk adresleme modundaki sınırlamalar nedeniyle tüm HD'ye erişemeyebilir - Silindir Başlı Sektör sistemini kullanabilirler, ilk 8 GiB disk alanından fazlasını ele alamazlar : http: //en.wikipedia. org / wiki / Silindir kafası sektörü .
Stage2 çekirdeği RAM'e yükler (yine BIOS disk yardımcı programlarını kullanarak). 2.6+ çekirdeğe sahipse, içinde derlenmiş initramfs vardır, bu yüzden yüklemeye gerek yoktur. Daha eski bir çekirdekse, bootloader bağımsız initrd görüntüyü belleğe yükler, böylece çekirdek onu bağlayabilir ve diskten gerçek dosya sistemini monte etmek için sürücüler alabilir.
Sorun şu ki, çekirdek (ve ramdisk) 1 MiB'den daha ağırdır, bu yüzden bunları RAM'e yüklemek için ilk 1 MiB'ye çekirdek yüklemeniz, ardından korumalı moda (32 bit) atmanız, yüklü çekirdeği yüksek belleğe taşımanız (ücretsiz gerçek mod için ilk 1 MiB), ardından tekrar gerçek (16 bit) moda dönün, diskten ilk 1 MiB'ye (ayrı bir initrd ve daha eski çekirdekse) ramdisk alın, muhtemelen tekrar korumalı (32 bit) moda geçin, ait olduğu yere koyun, muhtemelen gerçek moda geri dönün (veya değil: /programming/4821911/does-grub-switch-to-protected-mode ) ve çekirdek kodunu yürütün. Uyarı: Açıklamanın bu bölümünün tamlığı ve doğruluğundan tam olarak emin değilim.
Şimdi, nihayet çekirdeği çalıştırdığınızda, zaten var ve ramdisk, bootloader tarafından RAM'e yüklenmiştir , böylece çekirdek, size gerçek kök dosya sistemini monte etmek ve ona kök döndürmek için ramdisk'ten disk yardımcı programlarını kullanabilir. ramfs sürücüleri çekirdeğin içinde bulunur, bu yüzden initramfların içeriğini anlayabilir.