Linux hay GNU/Linux và cấu trúc nhân Linux
I.Tóm tắt lịch sử Linux
Linux hay GNU/Linux?
Khi thì người ta gọi “hệ điều hành Linux”, lúc lại gọi là “hệ điều hành GNU/Linux”. Lí
do là vì Linux thực ra là phần nhân của hệ điều hành. Nhiều các ứng dụng khác bổ xung
kết hợp với nhân Linux làm thành một hệ điều hành sử dụng được, các ứng dụng đó phần
lớn là phần mềm GNU. Vì vậy nhiều người coi gọi “hệ điều hành GNU/Linux” là đúng,
còn tên Linux dùng để chỉ phần nhân của hệ điều hành đó.
GNU là các phần mềm của GNU Project, được gọi là GNU packages or GNU programs.
Các thành phần chính gồm: bộ dịch GNU Compiler Collection (GCC), các công cụ mã
nhị phân GNU Binary Utilities (binutils), lớp vỏ bash shell, thư viện C GNU C library
(glibc), và các công cụ lõi GNU Core Utilities (coreutils).
(GNU Project cũng có dự án làm phần nhân hệ điều hành nhưng chưa xong. Vì vậy hiện
nay các hệ điều hành mà ta vẫn gọi là Linux dùng nhân Linux của Linus Tovarlds kết hợp
với các gói phần mềm nói trên của GNU Project. Do đó gọi hệ điều hành GNU/Linux thì
hợp lý hơn – lời ND)
GNU là tên tắt đệ quy của GNU’s Not Unix: thiết kế phần mềm giống Unix nhưng là
phần mềm tự do (free software) và không chứa mã Unix.
Tóm tắt lịch sử
Trong khi hiện nay Linux khá phổ biến thì lịch sử của nó lại khá mới. Thời kỳ bình minh
của máy tính, các nhà lập trình viết chương trình cho phần cứng bằng ngôn ngữ của phần
cứng đó. Do chưa có hệ điều hành nên chỉ một ứng dụng (và một user) có thể dùng một
phần cứng lớn và đắt tiền tại một thời điểm. Đến 1950 mới bắt đầu có những hệ điều
hành sơ khai.
Trong những năm 60, học viện Công nghệ Massachusetts (MIT) và một số công ty kết
hợp xây dựng một hệ điều hành thí nghiệm gọi là Multics (Multiplexed Information and
Computing Service) cho máy tính GE-645. Một trong những công ty đó, AT&T, bỏ
Multics và xây dựng hệ điều hành riêng của mình vào năm 1970 gọi là hệ Unics. Cùng
với Unics, ngôn ngữ lập trình C cũng được phát triển và được dùng để viết hệ điều hành
sao cho nó không phụ thuộc vào kiến trúc phần cứng.
Hai mươi năm sau, Andrew Tanenbaum tạo nên một phiên bản vi nhân (microkernel) của
Unix dùng để chạy trên các máy tính cá nhân nhỏ gọi là hệ MINIX (minimal UNIX). Đó
là hệ điều hành nguồn mở đầu tiên tạo cảm hứng cho Linus Torvalds xây dựng nên Linux
vào đầu những năm 90.
Hình 1: Lịch sử các phiên bản nhân Linux
Trục đứng là số dòng lệnh, trục ngang là thời điểm công bố. Phiên bản đầu 0.11
(tháng12/1991) có 10.239 dòng lệnh. Phiên bản 2.6.0 (tháng12/2003) có gần 6 triệu
dòng lệnh.
Linux phát triển nhanh từ dự án của một người thành một dự án lập trình toàn cầu gồm
hàng nghìn nhà lập trình. Một trong những quyết định quan trọng nhất của Linux là nó
chấp nhận tuân theo giấy phép phần mềm nguồn mở GPL (GNU General Public License).
Giấy phép đó tránh cho nhân Linux không bị khai thác thương mại và cũng cho phép nó
kết hợp được với các ứng dụng của GNU Project.
II.Giới thiệu nhân Linux
Một hệ điều hành GNU/Linux có thể phân thành hai vùng: vùng người dùng (User Space)
gồm các thư viện C và các phần mềm ứng dụng (soạn văn bản, …); vùng nhân (Kernel
Space) gồm ba thành phần chính như hình 2.
Trên cùng là lớp các ứng dụng của người dùng (User Applications). Bên dưới là lớp các
thư viện C (GNU C Library). Lớp thư viện phục vụ cho giao diện các lời gọi hệ thống tạo
liên kết giữa các ứng dụng và nhân Linux. Giao diện này quan trọng vì nhân Linux và các
ứng dụng chiếm các vùng địa chỉ bộ nhớ được bảo vệ khác nhau. Mỗi ứng dụng có vùng
địa chỉ ảo riêng còn nhân có một vùng địa chỉ duy nhất.
Nhân Linux có thể chia thành ba lớp. Trên cùng là giao diện các lời gọi hệ thống thực
hiện các chức năng cơ bản như đọc, ghi. Bên dưới là phần mã nhân hệ điều hành (kernel
code) hoặc chính xác hơn là mã nhân độc lập với kiến trúc vi xử lý (processor). Các mã
lệnh trong lớp này dùng chung cho mọi loại processor mà Linux hỗ trợ. Lớp dưới cùng là
các mã lệnh phụ thuộc vào kiến trúc từng loại processor (x86, x86-64, …).
III. Các hệ thống con chính của nhân Linux
Hình 3 dưới đây mô tả các hệ thống con chính của nhân Linux.
Hình 3: Các hệ thống con chính của nhân Linux
III.1Nhân là gì?
Như hình 3, nhân Linux thực ra là bộ quản lý các tài nguyên. Các tài nguyên gồm: các
tiến trình (process), bộ nhớ (memory) và thiết bị phần cứng. Nhân Linux quản lý các tài
nguyên đó và là người điều hành việc truy cập tài nguyên đồng thời của nhiều user. (User
trong bài này được hiểu theo nghĩa rộng bao gồm tất cả những gì có nhu cầu sử dụng tài
nguyên hệ thống: các tiến trình, các phần mềm, v.v….)
III.2Giao diện lời gọi hệ thống (System call interface -
SCI)
SCI thực hiện các lời gọi hệ thống từ vùng ứng dụng vào nhân Linux. Giao diện này độc
lập với kiến trúc bộ vi xử lý ngay cả trong cùng một họ vi xử lý. SCI có thể thực hiện các
dịch vụ gọi hàm dồn kênh và tách kênh.
III.3 Quản lý các tiến trình (Process management hay
Process Scheduler)
Quản lý tiến trình đảm bảo việc thực hiện các tiến trình. Trong vùng nhân Linux, mỗi tiến
trình được gọi là một mạch lệnh (thread) và được thể hiện thành một vi xử lý ảo (gồm mã
lệnh, dữ liệu, các ngăn xếp và các thanh ghi của CPU). Trong vùng ứng dụng thì chỉ dùng
từ tiến trình mặc dù Linux không phân biệt hai khái niệm này (threads và processes).
Nhân cung cấp một giao diện lập trình ứng dụng (API) để: tạo tiến trình mới (fork, exec
hoặc các hàm POSIX), ngừ
ng tiến trình (kill, exit) và thông tin, đồng bộ giữa các tiến
trình (signal hoặc các cơ cấu POSIX).
Quản lý tiến trình còn dùng để chia sẻ CPU giữa các mạch lệnh đang hoạt động. Nhân
thực hiện một thuật toán lập lịch cố định bất kể đến các mạch lệnh đang tranh chấp quyền
sử dụng CPU. Lịch này cũng hỗ trợ cả chế độ đa xử lý đối xứng (Symmetric
MultiProcessing – SMP).
SCHED được chia thành 4 module
1. Module luật định thời (scheduling policy): chịu trách nhiệm phân xử xem process nào
được quyền truy xuất CPU. Hệ thống hoạt động có thông suốt hay không nhờ vào bộ luật
này, tránh trường hợp 1 process lợi dụng sơ hở của điều luật mà chiếm thời gian hệ thống
qua nhiều làm các process khác bị đóng băng (freeze)
2. Module phụ thuộc kiến trúc (architeture-specific): module này gồm các code assembly
phụ thuộc vào mỗi loại CPU dùng để suspend hay assume process.
3. Module độc lập kiến trúc (architeture-independent): module gọi các hàm từ module
phụ thuộc kiến trúc và module luật để switch giửa các process đồng thời nó còn gọi các
hàm ở MM để thiết lập virtual memory cho các process được resume. Nên nhớ module
phụ thuộc kiến trúc sẽ khác nhau ở mỗi loại CPU (ỉ386, apha, v.v) nhưng module độc lập
kiến trúc thì không đổi kĩ thuật này ai lập trình hướng đối tượng sẽ biết nó là
abstract(trong cùng phiên bản hệ điều hành, architecture-independent dù cài ở các
máy khác nhau cũng vẫn giống nhau. Điều này cho phép mang ổ cứng cài HĐH
Linux máy này, cắm qua máy khác nó vẫn tương thích mà không cần phải cài đặt
lại, ưu điểm so với kennel XP)
4. Module hàm gọi hệ thống (system call). Gồm các hàm mà user có thể dùng để tương
tác với SCHED. Ai lập trình Linux và Unix sẽ quen với các system call này.
III.4 Quản lý bộ nhớ (Memory management).
Một tài nguyên quan trọng khác mà nhân Linux quản lý là bộ nhớ. Để sử dụng bộ nhớ
hiệu quả theo cách mà phần cứng quản lý bộ nhớ ảo, bộ nhớ được chia thành các trang
(mỗi trang là 4KB đối với phần lớn loại vi xử lý). Linux có các cơ cấu quản lý lượng bộ
nhớ khả dụng và các cơ cấu phần cứng để mapping giữa bộ nhớ vật lý và bộ nhớ ảo.
Việc quản lý bộ nhớ còn làm nhiều hơn là chỉ quản lý các trang 4KB. Linux dùng một sơ
đồ định vị lát (slab allocator) lên trên mỗi trang. Sơ đồ này dùng trang 4KB làm cơ sở
nhưng tạo một cấu trúc bên trong, theo dõi trang nào đầy, trang nào mới dùng một phần,
trang nào còn trống.
Khi nhiều user sử dụng bộ nhớ, dung lượng có thể không đủ. Khi đó các trang nhớ được
chuyển sang ổ cứng. Quá trình này được gọi là trao đổi (swapping) giữa bộ nhớ và ổ
cứng. (chức năng này ở HĐH XP gọi là thiết lập RAM ảo để tăng tốc độ xử lí của
máy tính, nhưng đồi với XP khi shutdown thì cần có 1 khoảng thời gian dài để giải
phóng bộ nhớ lưu trữ trên HDD, nhưng ở Linux tiến trình này không cần phải tiến
hành cài đặt mà đã tích hợp sẵn trong cơ chế hoạt động của bộ quản lý bộ nhớ. Khi
đóng 1 ứng dụng có phần bô nhớ lưu trên HDD thì ngay lập tức phần HDD chứa dữ
liệu tạm thời sẽ được giải phóng mà không phải chờ tới lúc shutdown)
III.5 Hệ thống file ảo (Virtual file system)
Hệ thống file ảo (VFS) là một khía cạnh hay của nhân Linux, cung cấp một giao diện
trừu tượng hoá chung cho hệ thống file. VFS tạo nên một lớp chuyển đổi giữa SCI và các
hệ thống file của Linux.
Hình 4: VFS tạo nên một lớp chuyển đổi giữa user và các hệ thống file.
Nằm trên cùng của VFS là lớp các API các chức năng như mở, đóng, đọc, viết file. Dưới
cùng của VFS là lớp trừu tượng hệ thống file xác định các chức năng lớp trên thực hiện
như thế nào. Đó là các plug-in đối với một hệ thống file cho trước (có trên 50 plug-in như
vậy). (nhiệm vu cụ thể của VFS có thể định nghĩa như sau: khi một app yêu cầu tới
hệ thống một tác vụ nào đó, nó không chỉ gởi requess mà còn gởi theo đó là các dữ
liệu đẻ thực hiện tác vụ đó, VFS có nhiệm vụ trườu tượng hóa file d
ữ liệu đó sao cho
hệ thống hardware hiểu được app cần gì. VFS giúp giảm bớt bước xử lý để hiểu
được yêu cầu của từng ứng dụng mà bước ngay vào đáp ứng cho tác vụ)
Bên dưới lớp file hệ thống là bộ đệm cache (buffer cache) gồm các chức năng chung cho
mọi hệ thống file (không phụ thuộc vào một kiểu hệ thống file riêng biệt nào). Lớp cache
này tối ưu hoá việc truy cập vào các thiết bị vật lý bằng cách giữ dữ liệu trong một thời
gian ngắn (hoặc đọc trước sao cho dữ liệu luôn có khi cần). Dưới bộ đệm cache là các
driver thiết bị là giao diện của các thiết bị vật lý cụ thể.