2017-03-22 16 views
5

Câu hỏi này là về hạt nhân Linux 4.10.Đánh dấu mô-đun hạt nhân có thể nạp được như trong cây

tải một out-of-cây LKM gây kernel để in một cảnh báo:

module: loading out-of-tree module taints kernel.

Điều này đặt ra từ việc kiểm tra này trong module.c: if (!get_modinfo(info, "intree")) {

Reading get_modinfo nó seams rằng "intree "chỉ là một chuỗi ma thuật sống bên trong tệp .ko.

Chạy readelf trên LKM ngẫu nhiên tôi tìm thấy trong hệ thống của tôi cho thấy điều này:

readelf -a imon.ko | grep intree 161: 00000000000006c0 9 OBJECT LOCAL DEFAULT 13 __UNIQUE_ID_intree1

Trong khi tìm kiếm intree một cách đơn giản, tùy chỉnh hello_world LKM trả về không có kết quả.

Đây có phải là trường hợp không?

Một số mô-đun được đánh dấu là trong cây là gì? Nó được thực hiện bằng cách thêm một macro vào mô-đun (như MODULE_LICENCE), hoặc bằng cách xây dựng các mô-đun theo một cách cụ thể hoặc cái gì khác?

+0

Tại sao bạn muốn đánh dấu một mô-đun ngoài cây như trong cây? Tất cả điều này sẽ làm là các nhà phát triển hạt nhân khó chịu. – duskwuff

Trả lời

4

Tóm lại, hệ thống xây dựng sẽ cố gắng thêm dòng MODULE_INFO(intree, "Y"); vào tệp "modulename .mod.c" nếu và chỉ khi mô-đun đang được xây dựng.

Có một cách rõ ràng để đánh lừa hệ thống bằng cách thêm dòng đó vào một trong các tệp ".c" thông thường của mô-đun, nhưng tôi không chắc chắn tại sao bạn muốn.

dài hơn phiên bản ....

module bên ngoài thường được xây dựng với một lệnh tương tự như sau:

$ make M=`pwd` modules 

hoặc cú pháp cũ:

$ make SUBDIRS=`pwd` modules 

Sự hiện diện của một tổ chức phi -empty M hoặc SUBDIRS làm cho cấp cao nhất của hạt nhân "Makefile" để đặt biến số KBUILD_EXTMOD. Nó sẽ không được thiết lập để xây dựng hạt nhân bình thường.

Đối với giai đoạn 2 của xây dựng mô-đun (khi thông báo "Xây dựng mô-đun, giai đoạn 2" là đầu ra), hãy chạy tệp "scripts/Makefile.modpost". Điều đó chạy scripts/mod/modpost với các tùy chọn khác nhau khi KBUILD_EXTMOD được đặt. Cụ thể, tùy chọn -I được sử dụng khi KBUILD_EXTMOD được đặt.

Nhìn vào nguồn cho modpost trong "kịch bản/mod/modpost.c", biến external_module có giá trị ban đầu từ 0, nhưng tùy chọn -I đặt nó vào 1. Chức năng add_intree_flag() được gọi với tham số thứ hai is_intree đặt thành !external_module. Hàm add_intree_flag() ghi MODULE_INFO(intree, "Y"); vào tệp "modulename .mod.c" nếu và chỉ khi tham số is_intree của nó là đúng.

Vì vậy, sự khác biệt giữa mô đun intree và mô-đun bên ngoài là sự hiện diện của cuộc gọi macro MODULE_INFO(intree, "Y"); trong tệp "modulename .mod.c". Điều này được biên dịch thành "modulename .mod.o" và được liên kết với các tệp đối tượng khác của mô-đun để tạo thành tệp "modulename .ko".

Các vấn đề liên quan