Tập 47: OS lab — Phòng thử nghiệm áp suất

Many người hỏi tôi: tại sao một dự án phát triển ngôn ngữ lập trình lại đi viết cả một hệ điều hành (OS lab)? Đó không phải là một sự lan man vô ích sao? Viết ngôn ngữ đã mệt rồi, sao còn tự làm khổ mình bằng việc viết cả OS kernel?

Thực tế, OS lab chính là phòng thử nghiệm áp suất khắc nghiệt nhất cho mọi giả định của compiler.

Sprint 20 đến 23 đặt nền móng cho phòng lab này: một kernel skeleton khởi động qua GRUB (Multiboot2), chạy trên QEMU, có linker script riêng định vị kernel tại địa chỉ 0x100000, tự cấu hình bảng ngắt (IDT/ISR) để bắt các lỗi CPU fault, và tự quản lý bộ nhớ vật lý thông qua bộ phân phối trang (PMM - Physical Memory Manager).

Ở trong môi trường kernel, không có mạng lưới an toàn nào bảo vệ bạn. Nếu compiler sinh sai một địa chỉ pointer, CPU sẽ lập tức kích hoạt lỗi Page Fault. Nếu trình xử lý ngắt cấu hình sai, máy tính sẽ rơi vào trạng thái Double Fault rồi Triple Fault và tự động reboot trong tích tắc.

Tôi nhớ có lần tôi debug một lỗi Page Fault trong kernel. Máy ảo QEMU liên tục reboot không ngừng. Không có màn hình xanh, không có log file, chỉ có một tiếng "bíp" khô khốc của máy ảo tự khởi động lại. Tôi phải mở log của QEMU, đọc từng dòng dump của các thanh ghi CPU tại thời điểm crash, và phát hiện ra compiler của tôi khi gộp các struct trong kernel đã tính toán sai alignment của biến lưu trữ IDT pointer.

OS lab bắt compiler phải tuyệt đối trung thực. Nó loại bỏ mọi cơ hội cho sự "tạm được". Mỗi lần kernel boot thành công và hiển thị banner chào mừng qua cổng serial là một bằng chứng cứng rắn rằng compiler đã sinh ra machine code chính xác đến từng byte.


Bình luận (0)

Đang tải bình luận...