Kiến trúc tổng quan nhân linux

Bài viết này trình bày kiến trúc tổng quát của một nhân Linux, giải thích chức năng và nhiệm vụ từng hệ thống con (system call, network stack …) bên trong nhân Linux.

Kiến trúc nền tảng của hệ điều hành Linux

Hình vẽ dưới đây mô tả kiến trúc tổng quan nhất về hệ điều hành Linux.

Kiến trúc tổng quan nhân linux

Ở trên cùng hình vẽ là phần không gian người dùng, hay còn gọi là user space. Vùng không gian người dùng chính là nơi các ứng dụng, các chương trình người dùng được thực thi. Nơi này cũng là nơi chứa thư viện GNU C (glibc).

Bên dưới vùng không gian người dùng là vùng không gian kernel (kernel space). Linux Kernel tồn tại chính ở vùng không gian này.

Hai vùng không gian người dùng và không gian kernel tồn tại và hoạt động ở vùng nhớ riêng biệt, chính vì thế để trao đổi dữ liệu giữa hai vùng không gian này, Linux sử dụng cơ chế system call. Các chương trình chạy trên không gian người dùng trao đổi dữ liệu với kernel thông qua system call trực tiếp, hoặc có thể thông qua các hàm trong thư viện GNU C.

Vùng kernel space được chia làm 3 tầng:

Trên cùng là giao diện system call, nơi cung cấp cơ chế trao đổi, làm việc giữa không gian người dùng và không gian kernel.

Tầng tiếp theo chính là kernel, nơi chưa các mã nguồn không phụ thuộc vào kiến trúc phần cứng. Mã nguồn ở đây được dùng chung cho mọi loại kiến trúc vi xử lý được Linux hỗ trợ.

Tầng tiếp theo là phần mã nguồn kernel phụ thuộc vào từng phần cứng. Mã nguồn ở mức này được thiết kế để phục vụ từng loại kiến trúc, từng loại phần cứng khác nhau.

Một ví dụ để làm rõ kiến trúc phân tầng của kernel: Khi có một yêu cầu truy cập phần cứng (ví dụ gửi một gói tin ra ngoài mạng) từ một chương trình trên user space, chương trình đó sẽ gửi yêu cầu tới kernel thông qua tầng giao diện system call. Tầng giao diện system call sẽ chuyển yêu cầu đó tới tầng kernel. Tại tầng kernel sẽ thực hiện các hành xử chung đối với mọi loại kiến trúc, mọi loại phần cứng (ví dụ đóng gói gói tin, tìm kiếm đường đi cho gói tin - routing…) trước khi chuyển sang tầng hành xử riêng cho từng phần cứng (ví dụ gửi gói tin ra từng loại card mạng khác nhau sẽ có hành xử khác nhau).

Những hệ thống con trong nhân Linux

Linux Kernel được cấu thành bởi một số thành phần chính như hình vẽ dưới đây

Kiến trúc tổng quan nhân linux

Giao diện System Call

Như đã đề cập ở phần trước, giao diện System Call (SCI) là lớp thực hiện những yêu cầu, những lời gọi hàm từ không gian người dùng user space.

Về thực tế, lớp giao diện system call này là loại giao diện có thể phụ thuộc vào kiến trúc. Phương thức xử lý những yêu cầu từ user space có thể khác nhau giữa các loại CPU khác nhau.

Ví dụ: Những vi xử lý x86 đời mới hơn sử dụng các hàm ảo hóa để thực hiện system call hiệu quả hơn là các dùng vi xử lý x86 cũ dùng phương pháp truyền thống 80h.

(Nội dung về system call sẽ được trình bày chi tiết hơn trong các chương sau)

Quản lý tiến trình

Tiến trình – process là gì?

Định nghĩa đơn giản nhất của tiến trình: Tiến trình – process là một chương trình được thực thi trong hệ thống. Cụ thể hơn về tiến trình, chúng ta sẽ nghiên cứu ở những chương sau.

Trong Linux Kernel, hệ thống quản lý tiến trình sẽ quản lý toàn bộ việc thực thi các tiến trình. Trong kernel space, thay vì gọi là tiến trình – process, chúng được gọi là các luồng – thread (chúng ta sẽ bắt gặp khái niệm kernel thread). Trên user space người ta lại thường dùng khái niệm tiến trình – process. Tuy cách gọi khác nhau, nhưng trong Linux không có sự phân biệt giữa 2 khái niệm này - chúng là như nhau.

Kernel cung cấp các APIs thông qua hệ thống giao diện system call để tạo một tiến trình (fork, exec …), dừng một tiến trình (kill, exit), cũng như giao tiếp và đồng bộ giữa các tiến trình (signal).

Kernel tạo ra bộ lập lịch, với các thuật toán lập lịch để quản lý các tiến trình, các luồng đang chạy, phân chia thời gian, quyết định thời điểm này tiến trình này cần chạy, thời điểm kia luồng kia cần dùng CPU.

Quản lý bộ nhớ

Một thành phần khác rất quan trọng được quản lý bởi Kernel là bộ nhớ.

Linux Kernel quản lý bộ nhớ mà đang có thể dùng được (available memory), cũng như cung cấp cơ chế ánh xạ giữa bộ nhớ vật lý và bộ nhớ ảo.

Hệ thống quản lý bộ nhớ cung cấp phương thức quản lý bộ nhớ một cách hiệu quả, tối ưu tốc độ quá trình thao tác với bộ nhớ vật lý.

Hệ thống file ảo

Hệ thống file ảo cung cấp một giao diện chung cho hệ thống file trong thiết bị. Nó cũng cung cấp lớp chuyển đổi giữa hệ thống system call và hệ thống file được hỗ trợ bởi kernel. 

Kiến trúc tổng quan nhân linux

Trên cùng của hệ thống file ảo là các API chung như open, close, read và write.

Ở dưới là hệ thống file trừu tượng hóa, định nghĩa lại các hàm chung lớp trên cho từng loại hệ thống file riêng biệt. Từ lớp trên, khi gọi hàm open, với hệ thống file ext3 hàm open sẽ được thực hiện một cách, với /proc file hàm open lại được thực hiện bằng cách khác.

Dưới lớp hệ thống file là tầng bộ nhớ đệm. Tầng này độc lập với các loại phần cứng.

Bên dưới bộ nhớ đệm sẽ tới tầng device driver, là tầng cung cấp giao diện thực hiện việc giao tiếp với các thiết bị vậy lý khác nhau.

Hệ thống network stack

Linux kernel được thiết kế và hỗ trợ các tính năng mạng một cách đầy đủ.

Kiến trúc tổng quan nhân linux

Device Drivers

Các mã nguồn device drivers là những mã nguồn để giao tiếp, trao đổi với từng loại phần cứng, từng loại thiết bị riêng biệt. Ví dụ các device drivers Bluetooth, device drivers cho I2C, hay cho cổng Serial, cho USB …

Mã nguồn phụ thuộc kiến trúc

Hầu hết các mã nguồn của các hệ thống con trong Linux Kernel đều được thực hiện với tiêu chí không phụ thuộc vào kiến trúc, tuy nhiên Linux vẫn có những phần cần phải phụ thuộc vào loại kiến trúc mà nó chạy trên đó.

Thư mục /linux/arch là nơi chứ mã nguồn riêng biệt cho từng loại kiến trúc. Ví dụ cho một máy tính cá nhân, thư mục i386 sẽ được sử dụng.

Kết luận

Kết thúc bài này, các bạn đã có được hình dùng về các thành phần cũng như chức năng của các thành phần trong Linux Kernel. Các bài tiếp theo sẽ trình bày chi tiết hơn về từng chủ đề quan trọng trong Linux Kernel.