2009-05-03 34 views
7

Có thể biên dịch mô-đun hạt nhân Linux (2.6) bao gồm chức năng được định nghĩa bởi không phải hạt nhân không?Mô-đun hạt nhân Linux (2.6) biên dịch bao gồm các tiêu đề không phải hạt nhân

Ví dụ:


kernelmodule.h

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> // printk() 
// ... 
#include <openssl/sha.h> 
// ... 

Makefile

obj-m := kernelmodule.o 
all: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules 

clean: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean 
    $(RM) Module.markers modules.order 

Các module kernel Tôi đã viết và đang cố gắng để biên dịch có chức năng tìm thấy trong một số o penssl bao gồm các tệp.

Tệp makefile tiêu chuẩn được trình bày ở trên không cho phép bao gồm bên ngoài tiêu đề linux. Có thể bao gồm chức năng này không, và nếu có, bạn có thể vui lòng chỉ cho tôi đúng hướng không.

Cảm ơn, Mike

Trả lời

11

Các hạt nhân không thể sử dụng mã userspace và phải đứng một mình (ví dụ: được hoàn toàn khép kín, không có thư viện), do đó nó không nhấc tiêu đề chuẩn.

Không rõ những lợi ích đang cố gắng để nhận tiêu đề vùng người dùng là gì. Nếu có những thứ trong đó, nó sẽ hợp lệ để sử dụng (hằng số, một số macro có thể cung cấp chúng không gọi bất kỳ hàm vùng người dùng nào), thì tốt hơn là sao chép chúng và chỉ bao gồm các phần tương thích với hạt nhân mà bạn cần. Không thể liên kết hạt nhân với các thư viện được thiết kế để sử dụng không gian người dùng - ngay cả khi chúng không thực hiện bất kỳ cuộc gọi hệ điều hành nào - vì môi trường liên kết trong hạt nhân không thể chọn chúng. Thay vào đó, hãy biên dịch lại bất kỳ chức năng nào được sử dụng trong hạt nhân (giả sử chúng không thực hiện bất kỳ cuộc gọi hệ điều hành hoặc thư viện nào - ví dụ: malloc - trong trường hợp đó, chúng sẽ cần được sửa đổi). Kết hợp chúng vào thư viện của riêng bạn để được sử dụng trong các mô-đun hạt nhân của bạn.


Các phiên bản Linux gần đây có chứa hàm mật mã, bao gồm nhiều băm SHA khác nhau - có lẽ bạn có thể sử dụng một trong số đó.


Một ý tưởng khác sẽ là ngừng cố gắng thực hiện mật mã trong không gian hạt nhân và di chuyển mã sang không gian người dùng. Mã vùng không gian người dùng dễ viết/gỡ lỗi/bảo trì hơn.

6

Tôi đã lấy bit của mã vùng người dùng mà tôi đã viết và chuyển đổi nó thành không gian hạt nhân (tức là sử dụng kmalloc(), v.v.) . Tuy nhiên, bạn bị giới hạn bởi sự hiểu biết của hạt nhân về C, không phải là không gian người dùng, điều này hơi khác một chút, đặc biệt là với các loại int tiêu chuẩn khác nhau.

Chỉ cần liên kết với không gian người dùng DSO là không thể - hạt nhân Linux là nguyên khối, hoàn toàn khép kín. Nó không sử dụng không gian người dùng libc, thư viện hoặc các bit khác như những người khác đã lưu ý.

9/10 lần, bạn sẽ tìm thấy những gì bạn cần ở đâu đó trong hạt nhân.Rất có thể ai đó đã chạy vào cùng một nhu cầu mà bạn có và đã viết một số hàm tĩnh trong một số mô-đun để làm những gì bạn muốn .. chỉ cần lấy chúng và tái sử dụng chúng.

Trong trường hợp mật mã, như những người khác đã nói, chỉ cần sử dụng những gì trong hạt nhân. Một điều cần lưu ý, bạn sẽ cần chúng được kích hoạt trong kconfig mà có thể hoặc có thể không xảy ra tùy thuộc vào những gì người dùng chọn khi xây dựng nó. Vì vậy, xem ra cho các phụ thuộc và rõ ràng, bạn có thể phải hack một vài mục trong kconfig cũng chọn API mật mã bạn muốn khi module của bạn được chọn. Làm như vậy có thể hơi đau khi xây dựng trên cây.

Vì vậy, một mặt chúng tôi đã "chỉ sao chép và đổi tên nội dung trong khi thêm tổng thể sưng lên", mặt khác bạn có "nói với mọi người rằng họ phải có nguồn hạt nhân đầy đủ". Đó là một trong những điều kỳ quặc đi kèm với một hạt nhân nguyên khối.

Với Microkernel, hầu như mọi thứ đều chạy trong không gian người dùng, không phải lo lắng liên kết với DSO đối với một số trình điều khiển ... đó là vấn đề không phải. Xin vui lòng không lấy tuyên bố đó như là một cue để khởi động lại triết lý thiết kế hạt nhân trong ý kiến, đó không phải là trong phạm vi của câu hỏi này.

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