Hệ điều hành & Tiến trình/Tổng quan module — Kernel & System Call
1/28
Bài 1 / 28~5 phútKernel & System CallMiễn phí lượt xem

Tổng quan module — Kernel & System Call

Chương trình của bạn không được đụng phần cứng: mọi thứ phải xin qua kernel. Lộ trình module: dual mode, system call, interrupt/trap, và strace.

TL;DR: Chương trình bạn viết không tự đọc file, không tự gửi gói mạng, không tự cấp phát RAM — nó xin kernel làm hộ. Ranh giới giữa "code của bạn" (user mode) và "code có quyền đụng phần cứng" (kernel mode) là một cơ chế phần cứng của CPU, và system call là cây cầu bắc qua ranh giới đó. Module này dạy vì sao ranh giới tồn tại, một system call đi từ write() vào kernel rồi quay về thế nào, ba con đường đưa CPU vào kernel (interrupt, trap, exception), và cách dùng strace để nhìn tận mắt chương trình nói chuyện với OS.

Vì sao module này tồn tại

Bạn từng thấy một service "treo" mà CPU gần như 0%, nhưng nó không phản hồi. Bạn từng thấy một chương trình copy file chậm bất thường dù đĩa còn trống. Bạn từng đọc log thấy EACCES, Segmentation fault (core dumped), hay Bad system call mà không rõ ai sinh ra chúng. Ba tình huống này có chung một gốc: bạn chưa nhìn thấy lằn ranh nơi chương trình của bạn dừng lại và hệ điều hành bắt đầu.

Ở các course trước, bạn đã học CPU chạy lệnh máy thế nào (Course 1 — Dữ liệu & CPU) và chương trình sắp xếp bộ nhớ ra sao (Course 2 — Bộ nhớ). Nhưng đến giờ, code của bạn vẫn giả vờ như nó độc chiếm cả máy. Sự thật là kernel — nhân của hệ điều hành — mới là thứ độc chiếm phần cứng, còn chương trình của bạn chỉ là khách. Module này bóc cái ranh giới đó ra.

Sau module này bạn sẽ

  • Explain vì sao CPU có kernel mode và user mode, và ranh giới đó bảo vệ hệ thống khỏi chương trình lỗi hay độc hại thế nào.
  • Trace đường đi một system call từ hàm thư viện (read, write) qua lệnh syscall, vào kernel, rồi quay về chương trình, kèm chi phí của mode switch và vì sao nó khác context switch.
  • Compare interrupt, trap và exception theo nguồn phát sinh, tính đồng bộ, và cách kernel xử lý từng loại.
  • Diagnose hành vi một chương trình bằng strace: đọc từng dòng syscall, phân loại theo nhóm (file, process, memory, network), và tìm ra chỗ chương trình chậm hay treo.

Lộ trình module

Bài 01 đặt nền: CPU có hai chế độ đặc quyền, vì sao user code không được phép chạy lệnh đụng phần cứng, và điều gì xảy ra khi nó cố tình vi phạm. Bài 02 dùng ranh giới đó để giải thích system call — cây cầu duy nhất qua ranh giới: trace write() từ hàm thư viện glibc xuống tận lệnh syscall, vào bảng syscall, chạy handler, rồi trở về; kèm chi phí thật của một lần vượt biên. Bài 03 tổng quát hoá: ngoài syscall (một dạng trap — cố ý), còn interrupt (phần cứng, bất đồng bộ) và exception (lỗi — chia cho 0, page fault) cũng đưa CPU vào kernel; ba con đường, ba cách xử lý.

Bài 04 chuyển từ lý thuyết sang công cụ: dùng strace quan sát syscall thật của một chương trình đang chạy, đọc output, phân nhóm, và chẩn đoán. Bài 05 là mini-challenge: bạn tự cầm strace -c mổ xẻ một lệnh thực tế. Bài 06 là cheat sheet để bookmark.

flowchart LR
  A["01 Kernel vs user mode"] --> B["02 System call la gi"]
  B --> C["03 Interrupt, trap, exception"]
  C --> D["04 Doc syscall bang strace"]
  D --> E["05 Mini-challenge: mo xe hai lenh (cat vs curl)"]
  E --> F["06 Tong ket module"]

Trình tự có chủ đích: không hiểu ranh giới hai mode thì không hiểu vì sao cần system call; không hiểu system call thì không đọc nổi output strace.

Yêu cầu trước khi bắt đầu

  • Giải thích được chu kỳ fetch-decode-execute và vai trò thanh ghi (từ Course 1 — Dữ liệu & CPU, hoặc tương đương).
  • Mô tả được cách một tiến trình sắp xếp bộ nhớ (stack, heap, địa chỉ ảo) từ Course 2 — Bộ nhớ — bài 03 sẽ liên hệ page fault.
  • Có một máy Linux (hoặc WSL, hoặc container) để chạy strace ở bài 04–05. Không bắt buộc biết C: code C trong module ngắn và được giải thích từng dòng.

Time budget

  • Module: ~60 phút bài học + ~15 phút mini-challenge strace.
BàiChủ đềPhút
00Tổng quan module5
01Kernel mode vs user mode12
02System call là gì13
03Interrupt, trap & exception12
04Đọc syscall bằng strace12
05Mini-challenge — mổ xẻ hai lệnh (cat vs curl)15
06Tổng kết module6

Cách học module này hiệu quả

  • Chạy strace song song khi đọc. Từ bài 02 trở đi, mở terminal và gõ strace -f ls hay strace echo hi. Nhìn thấy syscall thật cuộn qua màn hình biến khái niệm trừu tượng thành thứ sờ được.
  • Vẽ ranh giới. Mỗi ví dụ, tự vẽ một đường ngang: trên là user mode (code của bạn), dưới là kernel mode. Mỗi system call là một mũi tên vượt qua đường đó rồi quay lại.
  • Đừng học thuộc số hiệu syscall. Không ai nhớ write là syscall số 1 trên x86-64. Điều đáng nhớ là cơ chế: số hiệu nằm ở thanh ghi nào, ai tra bảng, ai chạy handler.

Bài tiếp theo: Kernel mode vs user mode — ranh giới bảo vệ phần cứng

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên