Nighpher, tôi sẽ cố gắng trả lời câu hỏi của bạn, nhưng để mô tả toàn diện hơn về quy trình khởi động, hãy thử bài viết của IBM .
Ok, tôi giả sử rằng bạn đang sử dụng GRUB hoặc GRUB2 làm bộ tải khởi động để giải thích. Trước hết, khi BIOS truy cập vào đĩa của bạn để tải bộ tải khởi động, nó sử dụng các thói quen tích hợp sẵn để truy cập đĩa, được lưu trữ trong ngắt 13h nổi tiếng. Bootloader (và kernel ở giai đoạn thiết lập) sử dụng các thường trình đó khi chúng truy cập đĩa. Lưu ý rằng BIOS chạy ở chế độ xử lý ở chế độ thực (16 bit), do đó, nó không thể xử lý nhiều hơn 2 ^ 20 byte RAM (2 ^ 20 chứ không phải 2 ^ 16 vì mỗi địa chỉ trong chế độ thực bao gồm phân đoạn_address * 16 + offset , trong đó cả địa chỉ phân đoạn và phần bù là 16 bit, hãy xem http://en.wikipedia.org/wiki/X86_memory_seributionation ). Do đó, các thói quen này không thể truy cập nhiều hơn 1 MiB RAM, đây là một hạn chế nghiêm ngặt và bất tiện lớn.
BIOS tải mã bộ tải khởi động ngay từ MBR - 512 byte đầu tiên của đĩa của bạn và thực thi nó. Nếu bạn đang sử dụng GRUB, mã đó là GRUB giai đoạn 1. Mã đó tải GRUB giai đoạn 1.5, được đặt trong 32 KiB đầu tiên của không gian đĩa, được gọi là vùng tương thích DOS hoặc từ một địa chỉ cố định của hệ thống tệp. Không cần hiểu hệ thống tệp để thực hiện việc này, vì ngay cả giai đoạn 1.5 nằm trong hệ thống tệp, đó là mã "thô" và có thể được tải trực tiếp vào RAM và được thực thi: http://www.pixelbeat.org/ tài liệu / đĩa / . Tải giai đoạn1.5 từ đĩa vào RAM sử dụng các thói quen truy cập đĩa BIOS.
Stage1.5 chứa các tiện ích hệ thống tập tin, để nó có thể đọc giai đoạn 2 từ hệ thống tập tin (tốt, nó vẫn sử dụng BIOS 13h để đọc từ đĩa sang RAM, nhưng bây giờ nó có thể giải mã thông tin hệ thống tập tin về inodes, v.v. đĩa). Các BIOS cũ hơn có thể không thể truy cập toàn bộ HD do các giới hạn trong chế độ địa chỉ đĩa của chúng - chúng có thể sử dụng hệ thống Xi lanh-Đầu-Khu vực, không thể xử lý nhiều hơn 8 GiB không gian đĩa đầu tiên: http: //en.wikipedia. org / wiki / Xi lanh-đầu-ngành .
Stage2 tải kernel vào RAM (một lần nữa, sử dụng các tiện ích đĩa BIOS). Nếu đó là kernel 2.6+, nó cũng có initramfs được biên dịch bên trong, do đó không cần tải nó. Nếu đó là kernel cũ hơn, bootloader cũng tải hình ảnh initrd độc lập vào bộ nhớ, để kernel có thể gắn kết nó và lấy trình điều khiển để gắn hệ thống tập tin thực từ đĩa.
Vấn đề là kernel (và ramdisk) nặng hơn 1 MiB, do đó để tải chúng vào RAM, bạn phải tải kernel lên 1 MiB đầu tiên, sau đó chuyển sang chế độ được bảo vệ (32 bit), di chuyển kernel đã tải sang bộ nhớ cao (miễn phí 1 MiB đầu tiên cho chế độ thực), sau đó quay lại chế độ thực (16 bit) một lần nữa, đưa ramdisk từ đĩa sang 1 MiB đầu tiên (nếu đó là một initrd riêng và kernel cũ hơn), có thể chuyển sang chế độ được bảo vệ (32 bit), đặt nó ở nơi nó thuộc về, có thể quay lại chế độ thực (hoặc không: /programming/4821911/does-grub-switch-to-protected-mode ) và thực thi mã hạt nhân. Cảnh báo: Tôi không hoàn toàn chắc chắn về tính kỹ lưỡng và chính xác của phần mô tả này.
Bây giờ, khi cuối cùng bạn chạy kernel, bạn đã có nó và ramdisk được tải vào RAM bằng bootloader , vì vậy kernel có thể sử dụng các tiện ích đĩa từ ramdisk để gắn kết hệ thống tập tin gốc thực của bạn và xoay trục gốc vào nó. Trình điều khiển ramfs có mặt trong kernel, vì vậy nó có thể hiểu nội dung của initramfs, tất nhiên.