1 điểm bởi GN⁺ 2024-07-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • Mọi người phân biệt giữa thứ phức tạp và thứ chỉ đơn thuần là rắc rối. Tính phức tạp được xem là thú vị, còn sự rắc rối thì bị xem là có hại. Quá trình thiết lập CPU x86_64 phần lớn thuộc về kiểu thứ hai.
  • Bài viết giải thích cách thiết lập CPU từ chế độ thực 16-bit sang chế độ dài 64-bit từ một boot sector được BIOS nạp. Thiết lập này chỉ là phần cơ bản, và vẫn cần thêm nhiều bước khác.
  • Cần có Intel 64 and IA-32 Architectures Software Developer’s Manual, assembler (dùng nasm) và QEMU. Bạn cũng cần biết x86 assembly và cú pháp nasm.

Điểm khởi đầu: BIOS

  • Sau khi reset, CPU x86 ở trong "real mode". Chế độ này có kích thước toán hạng mặc định là 16-bit. Nó có thể định địa chỉ 1MB bộ nhớ bằng segmentation.
  • Đoạn mã đầu tiên chạy sau BIOS nằm trong boot sector. BIOS sẽ tìm sector đầu tiên trong hệ thống kết thúc bằng 0xaa55, rồi nạp boot sector đó vào địa chỉ bộ nhớ 0x7c00.
  • BIOS chỉ cung cấp 512 byte, nên bạn phải dùng chúng để bootstrap phần còn lại của bootloader.

Thiết lập boot sector

  • Thiết lập một boot sector đơn giản để dùng routine của BIOS in thông điệp ra màn hình rồi dừng lại. Điều này giúp xác nhận rằng công cụ đang hoạt động đúng.
  • Boot sector được thiết lập bằng mã assembly và Makefile.

Giai đoạn 1 – Nạp giai đoạn 2 từ đĩa

  • Có thể chia bootloader thành hai giai đoạn. Giai đoạn 1 là mã trong boot sector, tức toàn bộ những gì BIOS nạp. Mục đích duy nhất của giai đoạn 1 là nạp giai đoạn 2 vào bộ nhớ.
  • Ở giai đoạn 2, hệ thống chuyển từ real mode 16-bit sang protected mode 32-bit. Trong protected mode, bạn không thể dùng routine của BIOS. Việc nạp sector từ đĩa trở nên phức tạp hơn nhiều.
  • Bài viết giải thích cách truy cập đĩa bằng BIOS.

Protected mode 32-bit

  • CPU được chuyển từ real mode (16-bit) sang protected mode (32-bit). Trong protected mode, memory protection được triển khai bằng segmentation.
  • Trước khi chuyển sang protected mode, cần định nghĩa Global Descriptor Table (GDT). GDT được định nghĩa như một cấu trúc liên tục trong bộ nhớ.
  • Bài viết giải thích cách định nghĩa GDT và chuyển sang protected mode.

Long mode 64-bit

  • Trước khi chuyển sang long mode, CPU phải đang ở protected mode và paging phải được bật. Protected mode đã được thiết lập, nhưng vẫn cần paging.
  • Paging thay thế segmentation để quản lý không gian địa chỉ ảo, quyền truy cập và các yếu tố khác. Bài viết giải thích cách tạo page table để chuyển sang long mode.
  • Bài viết giải thích cách định nghĩa GDT cho long mode, và cách chuyển từ protected mode sang long mode.

Tóm tắt của GN⁺

  • Bài viết này giải thích chi tiết quá trình thiết lập CPU x86_64 từ real mode 16-bit sang long mode 64-bit. Qua đó, người đọc có thể hiểu rõ hơn về phát triển bootloader và kernel hệ điều hành.
  • Bài viết đề cập nhiều khái niệm như BIOS, boot sector, protected mode, long mode, đồng thời cung cấp mã assembly và cách cấu hình cần thiết cho từng bước.
  • Bài viết hữu ích cho những ai quan tâm đến phát triển hệ điều hành, đặc biệt là những người muốn hiểu sâu về kiến trúc x86. Một dự án có chức năng tương tự là "Writing a Simple Operating System – from Scratch".

1 bình luận

 
GN⁺ 2024-07-16
Bình luận trên Hacker News
  • Có một cách để chuyển sang long mode mà không cần tự chuyển sang protected mode
    • Đã tạo một bootloader nạp một kernel 64-bit nhỏ vào boot sector
    • Bao gồm quá trình nạp kernel từ đĩa và thiết lập chế độ VESA
  • 80286 có MSW là thanh ghi 16-bit, và 80386 đã mở rộng nó thành CR0 32-bit
    • Long mode 64-bit bổ sung EFER MSR và mở rộng CR0 lên 64-bit
    • Hiện tại chỉ đang dùng 11 bit của CR0 và 8 bit của EFER
    • Thắc mắc vì sao Intel/AMD không dùng các bit trống trong những thanh ghi hiện có
  • Phần phức tạp không cần thiết nhất trong bài này là Makefile và linker script
    • NASM có thể tạo đầu ra binary phẳng, nhưng có vẻ tác giả cho rằng dùng cách đó quá "mang tính hack"
  • Mọi bước cần thiết để chuyển CPU sang đúng chế độ đều phức tạp một cách không cần thiết
    • Có vẻ tất cả đều cần thiết vì mục đích tương thích ngược
    • Intel lẽ ra có thể cung cấp một cờ hoặc lệnh để khởi động ngay từ đầu vào đúng chế độ
    • Hoặc có thể loại bỏ toàn bộ khả năng tương thích ngược
    • Nhớ là đã từng tìm hiểu xem ARM64 có vấn đề tương tự không
    • Tò mò không biết có CPU nào được thiết kế 64-bit ngay từ đầu hay không
    • Có lẽ mục tiêu/thiết kế của Itanium là như vậy
  • Có thể sẽ có những người ủng hộ UEFI không hiểu vì sao lại tạo ra một cách tiếp cận bootloader mới
    • Như tác giả nói, "nếu bạn đã đi được đến đây thì thật tuyệt"
  • Tò mò không biết UEFI đã cũ đến mức nào
    • Thật tiếc là BIOS đã không bị loại bỏ cùng với long mode
  • Tò mò không biết quy trình boot này có tương thích với EFI/UEFI hay không
    • Tò mò không biết firmware UEFI có mô phỏng real mode/protected mode/long mode trên phần cứng thực hay không
  • Tò mò không biết trên ARM quá trình này có đơn giản hơn không