2013-08-07 40 views
5

Tôi có một đối tượng hạt nhân đơn giản mà tôi đã xây dựng để thăm dò xung quanh bộ nhớ hạt nhân.Khả năng tương thích của hạt nhân Linux (* .ko) giữa các hạt nhân

Nếu tôi xây dựng nó trên máy 64-bit Ubuntu (3.2) của tôi, nó hoạt động tốt trên máy đó. Nhưng nó sẽ không bị lỗi trên máy tính 64-bit Ubuntu (3.9) của tôi. Và ngược lại. Nó mang lại cho tôi một lỗi "-1 định dạng mô-đun không hợp lệ" nếu tôi cố gắng chạy nó trên một Kernel rev khác với cái tôi đã xây dựng nó trên.

Tôi nghĩ insmod đã liên kết nó động với bảng biểu tượng đã xuất và bảng biểu tượng đã xuất không thay đổi giữa các phiên bản hạt nhân. (Nó được nối thêm.)

Ai đó có thể cho tôi biết làm thế nào tôi có thể xây dựng một mô-đun hạt nhân (.ko) tương thích với hạt nhân Linux trong tương lai (hoặc cũ) mà không cần phải xây dựng lại hạt nhân đó?

Dưới đây là làm cho tôi file:

ccflags-y = -g

obj-m + = access_mem.o

tất cả: làm C/lib/modules/$ (uname vỏ -r)/xây dựng M = $ (PWD) module

sạch: làm C/lib/modules/$ (vỏ uname -r)/xây dựng M = $ (PWD) sạch

+0

Ubuntu 3.2 của bạn là phiên bản 32 bit hoặc 64 bit? Cùng một câu hỏi với Ubuntu 3.9 – nouney

+0

Cả hai 64-bit. Thx để nhắc tôi về điểm dữ liệu quan trọng này. –

Trả lời

5

Joe, Ubuntu (3.2) có thể sử dụng phiên bản hạt nhân x.y.z nhưng Ubuntu (3.9) có thể sử dụng phiên bản hạt nhân x.y.z1. Nếu các phiên bản hạt nhân khác nhau, bạn phải xây dựng/biên dịch trình điều khiển của bạn dựa vào phiên bản hạt nhân cụ thể đó. Nếu các phiên bản hạt nhân giống nhau thì không cần phải xây dựng trình điều khiển của bạn. Điểm quan trọng là mỗi mô-đun trình điều khiển được biên dịch hoặc xây dựng liên kết với mô-đun version.ko (thực sự nhúng thông tin về phiên bản hạt nhân mô-đun trình điều khiển được xây dựng), trong khi tải mô-đun hạt nhân, nó sẽ kiểm tra thông tin này và phiên bản hạt nhân, nếu khác sau đó ném "-1 Định dạng mô-đun không hợp lệ" hoặc nếu khớp với thì mô-đun hạt nhân được tải thành công. Để phát triển mô-đun hạt nhân tương lai hoặc tương thích ngược, bạn cần phải biết phiên bản hạt nhân nào có chữ ký của hàm hoặc API đã được thay đổi cho ví dụ: chữ ký ioctl thay đổi từ phiên bản kernel 2.3.36 trở đi, vì vậy mã của bạn phải như sau

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) 
static long minor_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 
#else 
static int minor_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, 
                   unsigned long arg) 
#endif 

Nếu được phát triển theo cách như vậy thì mô-đun hạt nhân của bạn tương lai hoặc tương thích ngược. Khả năng tương thích chỉ là sự thích nghi của API hoặc chữ ký chức năng, vv .. thay đổi cho phiên bản hạt nhân bằng cách bảo quản các API cũ hoặc chữ ký hàm vv .. trong mô-đun hạt nhân như trong ví dụ trên, nhưng bạn vẫn cần phải xây dựng/biên dịch mô-đun hạt nhân của bạn so với phiên bản hạt nhân mà bạn đang cố tải.

+0

Khi tôi viết "(3.2)" và "(3.9)", tôi đã có nghĩa là "với phiên bản kernel 3.2" và "với phiên bản kernel 3.9", vì vậy có thx. –

+0

Trong trường hợp đó "insmod" thực sự chỉ dành cho nhà phát triển. Nó không bao giờ được sử dụng để chèn các mô-đun nhị phân dựng sẵn được phân phối từ công ty A trực tiếp đến hình ảnh Linux hiện có của người dùng cuối B. Đã đồng ý? –

+0

Joe, insmod chỉ là một tiện ích để chèn nhị phân dựng sẵn. Tôi đoán insmod là đủ thông minh để kiểm tra sự phụ thuộc phiên bản. Nếu trận đấu tải hoặc ném lỗi. http://tuxthink.blogspot.in/2010/09/insmod-explained.html –

1

tôi không phải là một xpert về chủ đề này nhưng tôi khá chắc chắn rằng bạn phải xây dựng trình điều khiển của bạn chống lại mỗi phiên bản của hạt nhân. Đối với các biểu tượng giống nhau giữa các phiên bản hạt nhân, tôi khá chắc chắn đó là không đúng sau khi đọc https://www.kernel.org/doc/Documentation/stable_api_nonsense.txt.

+0

Trong trường hợp đó "insmod" thực sự chỉ dành cho nhà phát triển. Nó không bao giờ được sử dụng để chèn các mô-đun nhị phân dựng sẵn được phân phối từ công ty A trực tiếp đến hình ảnh Linux hiện có của người dùng cuối B. Đã đồng ý? –

+0

Tôi khá chắc chắn rằng bạn có thể buộc các mô-đun tải vào hạt nhân, tức là: các mô-đun được xây dựng cho 3.9.10 có thể bắt buộc tải vào 3.10.4. – dklt

+0

Tải trọng không an toàn; nó có thể làm hỏng hệ thống của bạn hoặc tệ hơn. – Michael

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