Tập 48: DUY trong kernel

Khi OS lab đã có khung xương vững chắc bằng assembler và C, câu hỏi tiếp theo là: liệu chúng tôi có dám thay thế phần nhân C đó bằng code DUY? Nếu DUY thực sự là một ngôn ngữ hệ thống, nó phải có khả năng viết chính cái kernel đang chạy nó.

Sprint 27 là câu trả lời. Chúng tôi viết freestanding/kernel_spike.duy.

fn kernel_main() -> i32
  effect unsafe
{
  let serial_port: *u8 = 0x3F8 as *u8;
  // Ghi trực tiếp ký tự ra cổng serial
  return 99;
}

Hàm này được compiler dịch thành duy_kernel.o thông qua LLVM backend ở chế độ freestanding, sau đó linker sẽ link nó trực tiếp vào file kernel.elf của hệ điều hành.

Khoảnh khắc QEMU khởi động, đi qua assembly bootstrap, rồi nhảy vào hàm kernel_main viết bằng DUY và in ra dòng chữ duy kernel: 99 qua cổng serial port là một khoảnh khắc kỳ diệu. Tôi đã nhảy lên reo hò giữa đêm khuya. Một ngôn ngữ vừa được khai sinh cách đó vài tuần nay đã chạy trực tiếp trên kim loại nóng của CPU ảo hóa, không còn hệ điều hành nào che chở phía dưới.

Đến Sprint 31 và 32, chúng tôi tiến thêm một bước: biên dịch chương trình user bằng DUY, đóng gói nó vào một RAM disk ban đầu (initrd) bằng công cụ mkinitrd.js, rồi nạp và chạy nó từ kernel space. DUY đã tự hoàn thiện luồng đi của mình: từ kernel viết bằng DUY, load chương trình user viết bằng DUY, chạy và tương tác qua syscall.

Sơ đồ kiến trúc OS Lab & DUY Kernel Boot

graph TD
    subgraph "Kiến trúc OS Lab & DUY Kernel Boot"
        A[GRUB Bootloader / Multiboot2] -->|Load ELF Kernel| B[Assembly Bootstrap Entry]
        B -->|Initialize GDT / IDT / PMM| C[C/Assembly OS Kernel Core]
        C -->|Jump to freestanding main| D[DUY kernel_main - kernel_spike.duy]
        D -->|Ghi trực tiếp phần cứng| E[Serial Port / 0x3F8]
        D -->|Load initrd RAM disk| F[initrd Loader]
        F -->|Parse & execute bin| G[DUY User Space Program]
        G -->|Yêu cầu dịch vụ kernel| H[Syscall Interface - INT 0x80]
        H -->|Xử lý và phản hồi| C
    end

Bình luận (0)

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