Ymawky: Xây dựng web server bằng Assembly ARM64 trên macOS - Một thử thách "điên rồ" nhưng đầy thú vị

Phần mềm10 tháng 5, 2026·3 phút đọc

Ymawky là một web server tĩnh được viết hoàn toàn bằng ngôn ngữ Assembly ARM64 cho macOS, sử dụng các syscall trực tiếp mà không cần thư viện libc. Dự án này hỗ trợ đầy đủ các phương thức HTTP, liệt kê thư mục và tích hợp các biện pháp bảo mật chống lại các cuộc tấn công như Slowloris, mang lại cái nhìn sâu sắc về hoạt động của hệ thống ở mức thấp nhất.

Ymawky: Xây dựng web server bằng Assembly ARM64 trên macOS - Một thử thách "điên rồ" nhưng đầy thú vị

Ymawky: Xây dựng web server bằng Assembly ARM64 trên macOS - Một thử thách "điên rồ" nhưng đầy thú vị

Trong thế giới lập trình hiện đại, nơi Python và JavaScript thống trị, việc viết một ứng dụng web bằng ngôn ngữ Assembly nghe có vẻ như một ý tưởng điên rồ. Tuy nhiên, một nhà phát triển đã thực hiện điều đó với ymawky — một web server tĩnh dành cho macOS được viết hoàn toàn bằng Assembly ARM64.

Màn hình làm việc với ymawkyMàn hình làm việc với ymawky

Dự án này không sử dụng bất kỳ thư viện bao bọc (wrapper) nào của libc, mà tương tác trực tiếp với nhân Darwin thông qua các "raw syscalls". Mục tiêu không phải để thay thế Nginx hay Apache, mà để thấu hiểu sâu sắc cách thức một web server thực sự hoạt động ở mức thấp nhất của phần cứng và hệ điều hành.

Các ràng buộc và kiến trúc

Tác giả đã tự đặt ra những giới hạn khắt khe cho dự án: chỉ dùng Assembly ARM64, chỉ chạy trên macOS, không thư viện bên ngoài và không trình phân tích cú pháp (parser) có sẵn.

Ymawky hoạt động theo mô hình fork-on-request. Điều này có nghĩa là với mỗi kết nối mới, server sẽ gọi syscall fork() để tạo ra một tiến trình con xử lý yêu cầu đó.

  • Ưu điểm: Dễ hiểu, dễ viết, bộ nhớ không được chia sẻ giữa các trình xử lý.
  • Nhược điểm: Tốn tài nguyên (bloat), mỗi tiến trình có không gian bộ nhớ riêng, và khả năng xử lý kết nối đồng thời thấp hơn so với mô hình bất đồng bộ (async) của Nginx.

Nỗi đau của phân tích chuỗi (String Parsing)

Phần khó khăn nhất không phải là mở socket hay lắng nghe kết nối, mà là phân tích cú pháp HTTP. Trong Assembly, không có kiểu dữ liệu "string" hay các hàm tiện ích như split(). Tất cả chỉ là các vùng bộ nhớ chứa byte.

Để xử lý một yêu cầu GET đơn giản, server phải quét từng byte một để xác định phương thức, đường dẫn và phiên bản HTTP. Việc xử lý các header phức tạp hơn như Range: bytes=X-Y (hỗ trợ streaming video) đòi hỏi viết các hàm chuyển đổi chuỗi sang số nguyên (atoi) thủ công, kiểm tra tràn số và xác thực từng ký tự hex.

Tính năng và Bảo mật

Mặc dù là một dự án "học thuật", ymawky được trang bị các tính năng khá ấn tượng:

  • Hỗ trợ các phương thức: GET, HEAD, PUT, DELETE, OPTIONS.
  • Giải mã URL (percent-decoding).
  • Liệt kê nội dung thư mục (directory listing).
  • Cung cấp trang lỗi tùy chỉnh.

Liệt kê thư mục trên ymawkyLiệt kê thư mục trên ymawky

Về mặt bảo mật, dự án cũng giải quyết các vấn đề thực tế:

  • Chống Path Traversal: Ngăn chặn việc truy cập các tệp tin nhạy cảm như /etc/shadow bằng cách chuẩn hóa đường dẫn và chặn các đoạn chứa ...
  • Chống Slowloris: Một loại tấn công từ chối dịch vụ (DoS) nơi kẻ tấn công mở kết nối nhưng gửi dữ liệu rất chậm. Ymawky tính toán thời gian chờ dựa trên kích thước nội dung (Content-Length) và tốc độ truyền tối thiểu để cắt đứt các kết nối đáng ngờ.
  • Xử lý PUT an toàn: Sử dụng tệp tin tạm thời khi tải lên để tránh việc ghi đép một phần nếu quá trình bị gián đoạn.

Kết luận

Viết một web server bằng Assembly là một trải nghiệm "đau đớn" nhưng bổ ích. Nó buộc lập trình viên phải kiểm soát từng bước xử lý của CPU, từ việc quản lý thanh ghi đến xử lý bộ nhớ. Dù ymawky có thể không bao giờ thay thế các server hiện đại trong môi trường sản xuất, nó là một minh chứng tuyệt vời cho việc thấu hiểu nguyên lý hoạt động của công nghệ web mà chúng ta sử dụng hàng ngày.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗