vietnamized ^_^ and note-taking version of Linux Loadable Kernel Module HOWTO
1. Lời nói đầu
2. Giới thiệu Linux loadable kernel modules
Khi muốn bổ sung code vào một linux kernel, phương thức cơ bản nhất là đưa các file source vào source tree của kernel và biên tập lại (recompile) kernel. Và thực chất, quá trình cấu hình kernel chủ yếu là việc lựa chọn những file source để biên tập.
Có một cách khác để bổ sung code vào linux kernel trong quá trình vận hành. Một bộ code được bổ sung theo cách này được gọi là loadable kernel module. Các module này có thể có nhiều chức năng, thông thường rơi vào 1 trong 3 dạng: (1) driver thiết bị, (2) driver filesystem, (3) lệnh hệ thống (system calls). Một số chức năng nhất định (bao gồm các chức năng trên) được kernel tách biệt nhằm tránh sự đan cài phức tạp của chúng đối với những phần khác trong kernel.
2.1 Thuật ngữ
Loadable kernel module thường được gọi tắt là kernel module, hay module. Tuy nhiên, những cách gọi này rất dễ gây nhầm lẫn vì có rất rất nhiều dạng gói phần mềm cũng được gọi là module.
Một nhầm lẫn phổ biến về LKM là cho rằng đó là một phần riêng biệt nằm bên ngoài kernel và giao tiếp với kernel khi cần thiết. Tuy nhiên, LKM, khi được load lên, thực sự là một phần của kernel. Cách gọi chính xác cho phần kernel gắn kết với image khi boot (tức là toàn bộ kernel, trừ các LKM) là kernel cơ sở (base kernel), và LKM giao tiếp với kernel cơ sở.
Trong một số HĐH khác, khái niệm tương đương với LKM của linux là phần mở rộng kernel.
Vậy thì 'linux' là gì? Linux là tên gọi cho 2 khu vực rất khác nhau:
1. kernel và các yếu tố liên quan được phân phối dưới dạng một gói phần mềm, bởi Linux Torvald.
2. hệ thống các hệ điều hành dựa trên linux kernel
Trong phạm vi đang được nói đến, linux cần được hiểu theo nghĩa thứ 1. Mặc dù LKM luôn là một phần của kernel, LKM không nhất thiết là linux. Chẳng hạn, nếu kernel của bạn được bổ sung bằng một LKM driver đi kèm thiết bị, đó là một kernel linux được điều chỉnh chút đỉnh.
2.2. Lịch sử của LKM
LKM chỉ xuất hiện từ Linux 1.2 (1995). Những LKM ngày nay ban đầu cũng là một phần của kernel cơ sở.
Các driver thiết bị (hay đại loại vậy) luôn là các phần rời rạc. Khi khái niệm LKM được phát minh, người ta chỉ cần điều chỉnh chút ít để biến các thành phần rời rạc này thành những LKM thực sự. Tuy nhiên, công việc này cũng mất khá nhiều thời gian vì cần phải thực hiện trên từng thành phần một. Từ khoảng năm 2000 trở đi, hầu như mọi thứ có thể chuyển thành LKM đều có thêm lựa chọn LKM cho người dùng.
2.3. Khi nào cần LKM?
Người dùng thường có nhiều lựa chọn giữa việc gắn kết một thành phần rời vào kernel cơ sở hoặc dưới dạng LKM. LKM có rất nhiều ưu điểm so với việc gắn chết một thành phần vào kernel cơ sở, và thường luôn được lựa chọn bất cứ khi nào có thể.
Với LKM, bạn không cần xây dựng lại kernel quá thường xuyên, tiết kiệm thời gian và hạn chế khá nhiều sai sót trong giai đoạn tái xây dựng và cài đặt lại kernel cơ sở. Một khi đã có một kernel cơ sở tốt, bạn nên để nó yên càng lâu càng tốt.
Một lợi điểm khác của LKM là chúng giúp bạn chẩn đoán các trục trặc của hệ thống. Khi có lỗi (chẳng hạn do một driver thiết bị) trong kernel cơ sở, toàn bộ hệ thống sẽ ngưng hoạt động, không thể boot được, và bạn cũng không thể biết thành phần nào trong kernel cơ sở gây ra vấn đề. Tuy nhiên, nếu driver đó nằm trong một LKM, kernel cơ sở vẫn có thể chạy và chỉ gặp vấn đề khi load lên LKM bị lỗi.
LKM cũng giúp tiết kiệm tài nguyên nhớ, vì chúng chỉ được gọi khi thực sự cần thiết. Tất cả các thành phần của kernel cơ sở phải sẵn sàng trong mọi lúc, và phải nằm trong vùng nhớ thực, không phải vùng nhớ ảo.
LKM giúp cho việc bảo trì và sửa sai được nhanh chóng. Để có hiệu lực, các thay đổi trên một filesystem driver nằm trong kernel cơ sở yêu cầu toàn bộ hệ thống phải khởi động lại. Với LKM của filesystem driver đó, chỉ cần vài dòng lệnh để thay đổi, và không cần khởi động lại toàn hệ thống để xem hiệu quả những thay đổi đó.
LKM không chậm hơn các module trong kernel cơ sở. Việc gọi lên một LKM chỉ đơn giản là trỏ đến vị trí của LKM đó trên bộ nhớ.
Dĩ nhiên bạn buộc phải đưa một số module vào kernel cơ sở. Đó là những thành phần giúp cho hệ thống hoạt động được cho đến lúc có thể gọi ra LKM, ví dụ như driver của ổ đĩa chứa roort filesystem.
2.4. LKM không thể làm gì?
Có một xu hướng cho rằng LKM cũng giống như các chương trình người dùng. Thật sự chúng có nhiều điểm chung, nhưng LKM hoàn toàn không phải là chương trình người dùng, mà là một phần của kernel, có thể hoạt động khá tự do trong hệ thống, và do đó, cũng rất dễ làm sụp đổ hệ thống.
2.5. LKM được sử dụng trong trường hợp nào?
Có 6 lĩnh vực chính sử dụng LKM:
* Driver thiết bị. MỘt driver thiết bị được thiết kế cho một thành phần phần cứng cụ thể. Kernel sử dụng chúng đề giao tiếp với thành phần phần cứng đó mà không cần biết rõ cách thức phần cứng hoạt động. Ví dụ: driver cho ổ đĩa ATA, driver cho card mạng Ethernet tương thích với NE2000... Để sử dụng một thiết bị bất kì, kernel phải chứa driver của thiết bị đó.
* Filesystem driver. Một filesystem driver phiên dịch nội dung của filesystem (điển hình là nội dung của một ổ đĩa) thành file, thư mục hay các đơn vị quản lý đại loại như vậy. Có rất nhiều cách lưu trữ file và thư mục trên ổ đĩa, trên server, ... Với mỗi cách lưu trữ, cần có một filesystem driver.
* Lệnh hệ thống. Các chương trình trong khu vực người dùng sử dụng các lệnh hệ thống để gọi lên các dịch vụ cần thiết từ kernel. Hầu hết các lệnh hệ thống được tích hợp trong hệ thống và khá chuẩn mực, nên luôn được gắn vào kernel cơ sở. Nhưng nếu bạn tự tạo ra những lệnh hệ thống mới, hoặc muốn thay đổi một số cách thức hoạt động của linux và muốn đè lên các lệnh hệ thống sẵn có, bạn có thể cài đặt chúng vào kernel dưới dạng LKM.
* TTY line disciplines. Về cơ bản, đây là các hình thức nâng cao chất lượng (???) của driver cho các thiết bị đầu cuối (terminal device)
* Các trình phiên dịch có thể thi hành. Một trình phiên dịch có thể thi hành gọi lên và thi hành lệnh. Linux được thiết kế để có thể thi hành các lệnh dưới nhiều dạng khác nhau, và mỗi dạng cần có trình phiên dịch tương ứng.
No comments:
Post a Comment