Module nhân là gì?

Một phần của tài liệu Nghiên cứu khả năng an toàn của hệ điều hành mạng (Trang 88 - 89)

Modules là các phần mã được lập trình, có thể được tải vào hoặc gỡ bỏ khỏi hạt nhân theo yêu cầu. Module mở rộng chức năng của hạt nhân mà không cần phải khởi động lại hệ thống. Ví dụ một loại module là device driver, cho phép hạt nhân truy cập vào phần cứng được kết nối với hệ thống.

Nếu không có module, tất cả các chức năng của hệ điều hành sẽ được biên dịch trực tiếp vào hạt nhân. Phần lớn các chức năng nằm trong bộ nhớ mà không được sử dụng, gây lãng phí bộ nhớ trong khi lại yêu cầu người dùng phải xây dựng và khởi động lại hệ thống mỗi khi muốn thêm một chức năng mới.

Module khác với chương trình (program). Một chương trình bắt đầu với một hàm main(), thực thi một loạt các lệnh và kết thúc sau khi hoàn thành các lệnh đó. Trong khi một module luôn bắt đầu với init_module hoặc một hàm được chỉ định là gọi module_init. Đây được coi là hàm khởi tạo của module. Có nhiệm vụ chỉ cho hạt nhân biết các chức năng mà module cung cấp và thiết lập hạt nhân để chạy các hàm của module khi cần. Một khi thực hiện, hàm khởi tạo sẽ gọi giá trị trả về và module sẽ không làm gì cho đến khi hạt nhân muốn làm gì đó với mã mà module cung cấp. Tất cả các module kết thúc bằng cách gọi hàm cleanup_module hoặc hàm được chỉ định là gọi module_exit. Đây coi như là chức năng thoát của module. Có tác dụng khiến mọi thứ trở về trạng thái trước khi thực hiện hàm init_module. Hàm thoát của module không đăng ký các chức năng mà init_module đã đăng ký. Yêu cầu tối thiểu cho mỗi module là phải có một hàm khởi tạo và một hàm thoát.

Các lập trình viên thường sử dụng các hàm không định nghĩa về thời gian. Ví dụ như printf(). Và sử dụng các hàm được cung cấp bởi thư viện chuẩn C. Định nghĩa cho các hàm này thực tế không khớp với chương trình khi viết cho module cho đến khi trạng thái kết nối được thiết lập, nó sẽ đảm bảo rằng mã chương trình

đã sẵn sàng và cần sửa các lệnh gọi để trỏ đến mã đó. Module không thể in ra màn hình giống như printf(), nhưng có thể ghi lại thông tin và cảnh báo.

Đây chính là điểm khác biệt của module nhân. Trong ví dụ về module ―HelloWorld‖ trong mục 4.2.2, có sử dụng hàm printk(), nhưng không cần phải cung cấp thư viện I/O. Đó là bởi vì các module là các tập tin đối tượng mà ký hiệu của chúng đã được chuyển sang khi chèn module vào hạt nhân. Các định nghĩa cho các ký hiệu đến từ chính hạt nhân đó. Do đó, khi lập trình trong module chỉ được sử dụng các thư viện được cung cấp bởi hạt nhân. Tất cả các ký hiệu được xuất ra bởi hạt nhân nằm trong /proc/kallsyms.

Một điểm cần lưu ý là sự khác biệt giữa các hàm thư viện và các hàm gọi hệ thống (system calls[10]). Các hàm thư viện ở mức độ cao hơn, chạy hoàn toàn trong không gian người dùng và cung cấp một giao diện thuận lợi cho người lập trình. Các system call chạy trong chế độ hạt nhân với tư cách người dùng và được cung cấp bởi chính hạt nhân đó. Hàm thư viện printf() có thể trông giống như một hàm in rất chung, nhưng thực tế nó định dạng dữ liệu thành các chuỗi và viết các chuỗi dữ liệu bằng cách sử dụng system call cấp thấp write(), system call này sau đó sẽ gửi dữ liệu tới đầu ra chuẩn.

Chúng ta hoàn toàn có thể viết các module thay thế các system call của nhân. Các hacker thường sử dụng cách này để tấn công hệ thống bằng backdoor hoặc Trojan. Nhưng chúng ta hoàn toàn có thể viết các module của riêng mình để thực hiện những điều mình muốn.

Một phần của tài liệu Nghiên cứu khả năng an toàn của hệ điều hành mạng (Trang 88 - 89)