Syscall là gì?
Thuộc phần Kiến thức nền tảng trong hành trình Assembly của Coddy. Bài học 31 trên 45.
Bạn đã viết các chỉ thị assembly như mov và lea. Những chỉ thị này chạy trực tiếp trên CPU. Nhưng nếu bạn cần làm điều mà CPU không thể tự làm, chẳng hạn như in ra màn hình, đọc từ bàn phím hoặc thoát khỏi chương trình thì sao?
Với những nhiệm vụ này, bạn cần có hệ điều hành (Linux trong khóa học này).
Syscall là gì?
Syscall (lời gọi hệ thống) là yêu cầu mà chương trình của bạn gửi đến hệ điều hành. Đây là cách bạn yêu cầu hệ điều hành làm việc gì đó cho bạn.
Tại sao bạn cần syscall:
| Tác vụ | CPU có thể tự thực hiện không? | Có cần syscall không? |
|---|---|---|
| Cộng hai số | Có | Không |
| Di chuyển dữ liệu giữa các thanh ghi | Có | Không |
| In văn bản ra màn hình | Không | Có |
| Đọc dữ liệu đầu vào từ bàn phím | Không | Có |
| Thoát khỏi chương trình | Không | Có |
| Mở tệp | Không | Có |
Cách syscall hoạt động:
- Bạn đặt số syscall vào
rax(cho hệ điều hành biết bạn muốn làm gì) - Bạn đặt đối số vào các thanh ghi khác (
rdi,rsi,rdx, v.v.) - Bạn thực thi lệnh
syscall
- CPU chuyển đến nhân hệ điều hành
- Hệ điều hành thực hiện yêu cầu
- Hệ điều hành trả quyền điều khiển về chương trình của bạn
Phép so sánh:
Hãy hình dung syscall giống như việc gọi đến một cơ quan chính phủ:
| Bước | Phép so sánh | Trong assembly |
|---|---|---|
| 1 | Quyết định dịch vụ bạn cần | Chọn số syscall (đưa vào rax) |
| 2 | Điền vào biểu mẫu | Đưa các đối số vào thanh ghi |
| 3 | Gửi yêu cầu | Thực thi syscall |
| 4 | Chính phủ xử lý yêu cầu | Nhân OS thực hiện công việc |
| 5 | Nhận lại kết quả | Chương trình tiếp tục chạy |
Các syscall bạn sẽ học trong khóa học này:
| Syscall | Số | Chức năng | Chương |
|---|---|---|---|
exit | 60 | Kết thúc chương trình | Chương 4 |
write | 1 | In văn bản ra màn hình | Chương 5 |
Lệnh gọi hệ thống quan trọng nhất lúc này: exit
Nếu không có exit, chương trình của bạn sẽ chạy mãi hoặc gặp sự cố. Mọi chương trình bạn viết đều phải kết thúc bằng một lệnh gọi hệ thống exit.
mov rax, 60 ; Số hiệu syscall để thoát
mov rdi, 0 ; Mã thoát (0 = thành công)
syscall ; Yêu cầu hệ điều hành thoátTự làm thử
Bài học này không có thử thách code.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức nền tảng
Tự luyện tập: Playground Assembly