🧠 Kernel Space vs User Space – Driver hoạt động ở đâu trong Linux?
Khi mới bắt đầu tìm hiểu hệ điều hành, mình từng nghĩ “ứng dụng chạy thì kernel xử lý” là đủ hiểu rồi. Nhưng khi đụng đến thiết bị, driver, và đặc biệt là Linux, thì hóa ra mọi thứ được chia rất rõ ràng thành hai “vùng thế giới”: User Space và Kernel Space.
Vậy driver nằm ở đâu trong bức tranh này? Và ứng dụng thực sự giao tiếp với thiết bị như thế nào?
⸻
🧭 Hai thế giới: User Space và Kernel Space
Thành phần Mô tả User Space Nơi các ứng dụng như bash, Firefox, hoặc bất kỳ app nào bạn viết chạy Kernel Space Nơi “trái tim” của hệ điều hành hoạt động: quản lý CPU, RAM, thiết bị, file system, v.v.
Tưởng tượng đơn giản: 🔹 User Space giống như người dùng ở quầy dịch vụ 🔹 Kernel Space là người xử lý yêu cầu ở phía trong
Giữa hai bên là một cửa sổ giao tiếp gọi là system call
⸻
⚙️ Driver – dân nội bộ của Kernel
Driver không chạy trong user space. Nó là một phần của kernel, chạy trong kernel space.
Driver đảm nhiệm: • Đăng ký và nhận diện thiết bị phần cứng • Quản lý cách đọc/ghi dữ liệu đến thiết bị đó • Nhận tín hiệu từ phần cứng (interrupt) • Cung cấp interface để ứng dụng giao tiếp thông qua file, ioctl, sysfs…
✳️ Vậy ứng dụng nói chuyện với thiết bị kiểu gì?
Thông thường, driver sẽ tạo ra một file đặc biệt trong /dev/. Ví dụ:
/dev/ttyUSB0 # cổng serial /dev/video0 # webcam /dev/input/event2 # thiết bị nhập liệu
Ứng dụng chỉ cần:
open("/dev/video0", …); read(…); write(…);
Tất cả các lệnh đó sẽ được kernel chuyển tới driver tương ứng để xử lý.
⸻
📥 Tại sao phải tách biệt?
Việc phân chia rõ ràng có nhiều lý do:
Lý do Giải thích Bảo mật Nếu ứng dụng crash, không ảnh hưởng hệ thống; nhưng nếu kernel crash thì máy “đi bụi” luôn Ổn định Driver nằm trong kernel nên được kiểm soát kỹ càng hơn Hiệu suất Giao tiếp giữa kernel và thiết bị thường cần tốc độ cao, DMA, interrupt… điều này chỉ có kernel space làm được hiệu quả
🔚 Kết
Hầu hết mọi thiết bị bạn cắm vào Linux đều có một driver chạy ở kernel space. Khi bạn mở một thiết bị như một file, đọc dữ liệu từ đó – thực chất bạn đang đi qua rất nhiều tầng: từ user space → kernel → driver → phần cứng. Và tất cả được gói gọn lại trong vài dòng open() và read().