Skip to content

Tìm hiểu kiến trúc hệ thống Linux#

Cấu trúc hệ điều hành Linux#

Kiến trúc hệ điều hành Linux được chia thành 3 phần: Kernel, Shell và Application.

Kernel (Nhân)#

Kernel là thành phần quan trọng và được coi là trái tim của hệ điều hành, nằm giữa phần cứng máy tính và các chương trình, quản lý và cung cấp tài nguyên cho các chương trình khác chạy trên máy tính.

Các loại Kernel#

Microkernel: Có đầy đủ tính năng quản lý vi xử lý, bộ nhớ và IPC, với nhiều thành phần khác hoạt động trong chế độ người dùng. Microkernel linh hoạt và bảo mật cao, không bị ảnh hưởng khi thay đổi thiết bị như card màn hình, ổ cứng. Các tiến trình hoạt động trong user mode mà không có quyền như trong chế độ giám sát.

Monolithic Kernel: Khác với Microkernel, Monolithic can thiệp vào driver, điều phối file hệ thống và các giao tiếp server. Được dùng trong Linux, kernel này truy cập phần cứng nhanh và hiệu quả nhưng có thể gây bất ổn nếu xảy ra lỗi.

Hybrid Kernel: Kết hợp ưu điểm của Microkernel và Monolithic Kernel, Hybrid Kernel có thể chọn ứng dụng nào chạy trong user mode hay supervisor mode, với driver và I/O trong user mode và các tín hiệu server trong supervisor. Windows và macOS sử dụng kernel này.

Kiểm tra phiên bản kernel hiện tại:#

# uname -r
4.15.0-50-generic

Shell#

Shell là gì? Shell là lớp nằm trên Kernel, chịu trách nhiệm nhận và thực thi các lệnh (command) từ người dùng hoặc từ phần mềm, sau đó chuyển đến Kernel để xử lý. Shell đóng vai trò trung gian giữa Kernel và Application, "phiên dịch" các lệnh từ Application gửi đến Kernel.

Các loại shell phổ biến:#

sh (the Bourne Shell): Đây là shell nguyên thủy của UNIX, được viết bởi Stephen Bourne vào năm 1974 và vẫn được sử dụng rộng rãi.

bash (Bourne-again shell): Đây là shell mặc định trên Linux, được viết bởi Brian Fox và Chet Ramey cho dự án GNU (mục tiêu của GNU là phát triển hệ điều hành miễn phí, toàn diện, hiệu năng cao và tương thích với Unix). Bash là phiên bản cải tiến từ sh và hỗ trợ nhiều câu lệnh hơn.

csh (C shell): Shell này được viết bằng ngôn ngữ lập trình C, bởi Bill Joy vào năm 1978.

Các shell khác gồm: ash (Almquist shell), tsh (TENEX C shell), zsh (Z shell).

Dấu nhắc Shell thay đổi tùy thuộc vào tài khoản user đang làm việc:

Khi làm việc với tài khoản root:

[root@localhost root]#

Khi làm việc với tài khoản user thường:

[linux@localhost ]$

Applications#

Lớp Applications chứa các ứng dụng, tiện ích và công cụ trên hệ điều hành, như trình duyệt, trò chơi,... Các ứng dụng này chạy trên Shell và dùng Shell để giao tiếp với Kernel cũng như phần cứng.

Command là gì và cách chúng tương tác với hệ thống?#

Command là gì?#

Một command là một yêu cầu từ người dùng, bảo máy tính thực hiện một nhiệm vụ, có thể là một chương trình hay một nhóm các chương trình.

Command được thực thi qua terminal (hoặc command line), một phần mềm hiển thị văn bản kết nối với shell, và được gửi đến shell khi nhấn Enter.

Cách các lệnh được thực thi#

Các bước xử lý một câu lệnh:

  • Lấy input từ người dùng
  • Kiểm tra regex và alias
  • Kiểm tra Builtin
  • Kiểm tra PATH
  • Nếu file câu lệnh tồn tại: tạo tiến trình con (child process) và chạy chương trình.
  • Khi tiến trình con chấm dứt: tiến trình cha thông báo sẵn sàng cho câu lệnh tiếp theo.

Chi tiết các bước:#

  • Lấy Input từ người dùng: Shell sử dụng getline() để đọc đầu vào từ STDIN (luồng dữ liệu đầu vào) và lưu vào bộ nhớ đệm. Bộ đệm này sau đó được tách thành các token và lưu trong mảng. Ví dụ, lệnh ls -l sẽ được lưu dưới dạng {"ls", "-l", "NULL"}.

  • Kiểm tra regex và alias: Shell kiểm tra các ký tự đặc biệt (regex) và alias. Alias tương tự phím tắt, giúp người dùng sử dụng lệnh nhanh hơn. Ví dụ: nếu có alias alias apple="cat", khi gõ apple, shell sẽ hiểu là lệnh cat.

  • Kiểm tra Builtin: Nếu lệnh không phải alias, shell kiểm tra xem đó có phải là lệnh builtin (tích hợp trong shell) như cd, echo, alias, help, read, type.

  • Kiểm tra PATH: Nếu không phải builtin, shell kiểm tra biến môi trường PATH để tìm file lệnh. Shell chia PATH thành các phần (các thư mục phân cách bởi dấu :) và nối tên file với mỗi thư mục để tìm file. Nếu không tìm thấy, shell sẽ báo lỗi.

  • Sao chép và chạy chương trình trong tiến trình con: Khi tìm thấy lệnh trong PATH, shell gọi fork() để tạo một tiến trình con thực thi lệnh. fork() tạo bản sao của tiến trình hiện tại, và tiến trình con sẽ gọi exec() để thay thế tiến trình con bằng chương trình yêu cầu. Tiến trình cha sẽ đợi tiến trình con qua hàm wait().

Quá trình thực thi lệnh trong Linux

Sau khi hoàn thành, tiến trình con chấm dứt và trả quyền điều khiển về tiến trình cha. Người dùng sẽ thấy dấu nhắc mới, cho biết hệ thống đã sẵn sàng cho lệnh tiếp theo.

Ví dụ về lời nhắc (prompt):#

Ví dụ về lời nhắc prompt