Trong mô hình an ninh của máy tính hiện đại, chương trình của người dùng (user program) sống trong một chiếc lồng kính gọi là User Space (Ring 3). Nó không được phép tự ý chạm vào phần cứng, đọc file hoặc gửi dữ liệu qua mạng. Khi muốn làm những việc ấy, nó phải gõ cửa hệ điều hành thông qua các lời gọi hệ thống (syscall).
Sprint 28 và 29 đưa ngôn ngữ DUY chạm trực tiếp vào biên giới an ninh này.
Để một chương trình DUY chạy ở user space có thể in ra chữ "hi", compiler không thể gọi printf của C. Nó phải tự phát biểu lệnh asm syscall (trên x86_64) để chuyển đổi đặc quyền của CPU lên Ring 0 (Kernel Space).
User Space (Ring 3) Kernel Space (Ring 0)
DUY user program
|
v (assembly: syscall)
SYS_WRITE -------------> OS Kernel -> Serial Port
Chúng tôi định nghĩa syscall ABI cơ bản gồm ba lệnh: SYS_READ (1), SYS_WRITE (2), và SYS_EXIT (3). Hàm runtime của user program nạp số hiệu syscall vào thanh ghi rax, các đối số vào rdi, rsi, rdx, rồi kích hoạt ngắt hệ thống.
Viết inline assembly trong compiler để sinh ra đúng lệnh syscall là một công việc nhạy cảm. Chỉ cần đặt sai thanh ghi hoặc quên lưu lại trạng thái của các thanh ghi khác trước khi thực hiện lệnh gọi, CPU sẽ lập tức phát sinh lỗi Page Fault hoặc crash chương trình do hỏng stack frame.
Lời gọi syscall_self_test đầu tiên chạy thành công và in ra chữ hi trên terminal của QEMU thông qua serial port là một cột mốc quan trọng. Nó chứng minh rằng DUY không chỉ là một ngôn ngữ chạy trên môi trường giả lập của Node.js; nó đã biết cách tương tác trực tiếp với nhân hệ điều hành thông qua giao thức phần cứng thực tế. Nó đã có thể nói chuyện với CPU bằng chính tiếng nói của CPU.
Bình luận (0)
Đang tải bình luận...