2011-10-21 18 views
8

Trên hệ thống x86, tôi có một mô-đun hạt nhân Linux ("mô-đun đồng hồ") được hạt nhân thông báo mỗi khi mô-đun hạt nhân cụ thể ("đích") được tải. Hầu như bất kỳ mô-đun hạt nhân có thể là một mục tiêu. Tôi sử dụng điều này trong an instrumentation system Tôi đang làm việc.Có cách nào để mô-đun hạt nhân tìm các địa chỉ phần của mô-đun được nạp khác không?

Khi mô-đun người xem xử lý thông báo như vậy, có thể thuận tiện vì một lý do nào đó, nếu người quan sát biết địa chỉ của các phần ELF của mô-đun đích được nạp. Bất kỳ ý tưởng làm thế nào thông tin này có thể thu được trong không gian hạt nhân?

Tất nhiên tôi có thể lấy nội dung của các tệp thích hợp trong /sys/module/<target_name>/sections/ trong không gian người dùng ngay sau khi mục tiêu được tải và sau đó bằng cách nào đó chuyển dữ liệu này đến mô-đun giám sát nhưng điều này quá vụng về. Tôi muốn tìm cách để lấy thông tin này trực tiếp trong không gian hạt nhân.

Theo như tôi đã thấy trong nguồn của trình tải mô-đun, nó không lưu trữ địa chỉ phần trong struct module, chỉ cần tạo tệp sysfs cho các phần. Có thể là bằng cách nào đó có thể tìm thấy các đối tượng hạt nhân tương ứng với các tập tin đó và đọc dữ liệu cần thiết từ các đối tượng này? Hoặc có thể sử dụng một số cách tiếp cận khác?

+0

Dường như kobject chứa trong 'struct module' (' mkobj.lĩnh vực kobj') được tham gia vào việc mô tả các mô-đun trong sysfs. Tôi sẽ tìm hiểu thêm về điều này khi tôi có thời gian. Có thể có được các thuộc tính có chứa tên và địa chỉ của các phần bằng cách sử dụng kobject đó làm điểm bắt đầu. – Eugene

Trả lời

5

Sau khi tìm hiểu cách thông tin về các phần của mô-đun được chuyển vào sysfs, tôi không tìm cách lấy nó mà không sử dụng định nghĩa cấu trúc bên trong hạt nhân. Sử dụng những thứ như vậy không phải là một lựa chọn trong dự án của tôi, vì vậy tôi cuối cùng đã thực hiện một cách tiếp cận khác, đó là, hy vọng, đáng tin cậy hơn.

Tóm lại, ý tưởng là như sau. Mô-đun hạt nhân của tôi sử dụng API trình trợ giúp chế độ người dùng để bắt đầu quá trình không gian người dùng (thực tế là một trình bao thực thi tập lệnh của tôi). Quá trình đó lấy tên của mô-đun hạt nhân "đích" làm tham số và thu thập thông tin về các phần của nó từ sysfs (/sys/module/<target_name>/sections/). Từ không gian người dùng, thông tin này có thể thu được dễ dàng. Sau đó, nó chuyển dữ liệu đã thu thập tới mô-đun hạt nhân của tôi dưới dạng một chuỗi thông qua một tệp trong các bản sửa lỗi. Module phân tích chuỗi và xác nhận nội dung của nó. Nếu mọi thứ đều ổn, tên và địa chỉ bắt đầu của các phần ELF sẽ có sẵn.

Tôi thừa nhận, thủ thuật với trình trợ giúp chế độ người dùng khá vụng về nhưng nó thực hiện công việc.

Tôi đã chuẩn bị triển khai mẫu phương pháp được mô tả ở trên - xem "Sections" example.

Để biết chi tiết về API trợ giúp chế độ người dùng, hãy xem mã trong <linux/kmod.c><linux/kmod.h> trong nguồn hạt nhân, cụ thể là định nghĩa của call_usermodehelper(). Các ví dụ cũng như giải thích về cách sử dụng điển hình của API có sẵn trong this article.

Lưu ý rằng các ví dụ từ that article có một chút không chính xác: hàm init của mô-đun trả về kết quả là call_usermodehelper() tại đó. Cái thứ hai, tuy nhiên, trả về mã trạng thái 2 byte (ít nhất là khi được gọi với UMH_WAIT_PROC) thay vì 0 hoặc mã lỗi tiêu cực mà hàm init được mong đợi sẽ trả về. Điều này có thể dẫn đến cảnh báo thời gian chạy. Điều gì thực sự trả về call_usermodehelper(), được giải thích here.

1

Tệp linux/kernel/module.c có một số hàm không tĩnh (nhưng không có EXPORT_SYMBOL ở trước) như module_address_lookup(), nhưng các hàm này sử dụng những thứ như preempt_disable() và _enable(). Tôi không muốn sử dụng chức năng này và sẽ đề nghị sử dụng giao diện sysfs thay vào đó, altho trình điều khiển của bạn đã ở chế độ hạt nhân.

+0

Cảm ơn bạn đã trả lời. Có, tôi biết về 'module_address_lookup()' và tương tự. Chúng được sử dụng trong hệ thống kallsyms để tra cứu biểu tượng và như vậy. Nhưng tôi cần một thứ khác, địa chỉ của _sections_ của mô-đun (.text, .devinit.text, .exit.text, v.v.) chứ không phải là ký hiệu. Tôi có thể lấy địa chỉ của các vùng "init" và "core" của module nhưng mỗi cái có thể chứa nhiều hơn một phần ELF. – Eugene

+0

Có vẻ như từ mã nguồn của bộ nạp mà vào thời điểm thông báo tải được phát hành, thông tin về các phần của mô-đun vừa tải chỉ có sẵn trong sysfs. Nếu tôi không nhầm, mỗi tập tin trong sysfs được hỗ trợ bởi một đối tượng hạt nhân. Nếu bạn có một ý tưởng làm thế nào có thể mô-đun của tôi tìm thấy các đối tượng tương ứng với các tập tin trong '/ sys/module/', đó sẽ là tuyệt vời. – Eugene

+0

Tôi không thấy cách nào để lấy thông tin này từ bên trong hạt nhân, trừ khi bạn sửa đổi kernel/module.c để xuất một biểu tượng hoặc hàm. Bạn có thể thử gửi một bản vá với một thông điệp hợp lý, tại sao bạn muốn nó theo cách này. –

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