Thêm một cuộc gọi hệ thống mới vào Linux 3.2.x với mô-đun hạt nhân có thể tải [đã đóng]


11

Tôi muốn thêm một lệnh gọi hệ thống mới cụ thể trong kernel linux 3.2.x nhưng dưới dạng mô-đun kernel có thể tải (vì tôi không muốn biên dịch lại kernel nhiều lần)

Tôi đã đọc qua nhiều bài đăng trên internet và cả trên SO, và một số nơi cho rằng việc thực hiện các cuộc gọi hệ thống dưới dạng các mô-đun có thể tải là không thể, trong khi những người khác nói rằng điều đó là có thể.

Đó là cái gì Làm thế nào được thực hiện nếu nó có thể?


Câu hỏi này không có chủ đề ở đây: Unix & Linux là về sử dụng và quản trị, không phải về lập trình. Bạn nên hỏi về Stack Overflow . Đừng quá mơ hồ: liên kết đến các bài đăng bạn tìm thấy trên Stack Overflow và giải thích những gì bạn thấy không thuyết phục hoặc mâu thuẫn.
Gilles 'SO- ngừng trở nên xấu xa'

2
Tôi tin rằng câu hỏi này liên quan nhiều đến Linux với tư cách là một hệ điều hành hơn là tự lập trình. Nó cũng khá quan trọng để biết khả năng mở rộng khả năng hệ thống của chúng tôi là gì và giới hạn của nó là gì. Điều này, ví dụ, làm cho bạn hiểu tại sao một số tính năng không thể thực hiện dưới dạng mô-đun có thể tải và cần vá nhân. Biết lý do tại sao nó như thế này cũng có thể cung cấp cho bạn một số ý tưởng về bảo mật so với các nhà phát triển hạt nhân khả dụng phải thực hiện. Câu hỏi đó sẽ có nhiều hơn về chủ đề nếu OP chỉ hỏi nếu có thể và tại sao không và không thực hiện điều này như thế nào?
Krzysztof Adamski

1
Có rất nhiều cuộc thảo luận <Stro> flames </ Stro> trên Danh sách gửi thư hạt nhân Linux, ví dụ như reiserfs đã sử dụng các tòa nhà của chính nó, điều mà một số nhà phát triển cốt lõi thực sự yêu thích, bao gồm Linus. Trong trường hợp của bạn, tôi chỉ đơn giản là sử dụng ioctl()s cho nhiệm vụ, chúng có thể dễ dàng mô đun hóa. Afaik lý do chính đằng sau việc làm cho điều này trở nên khó khăn đến mức có thể là số lượng các tòa nhà là một thứ rất khó mã hóa và không ai muốn sự hỗn loạn những gì nó sẽ được đưa vào bức tranh. Nhưng có rất nhiều giao diện kernel để đạt được cùng chức năng, ví dụ như sysfs, ioctls hoặc như vậy.
peterh - Phục hồi Monica

Câu trả lời:


14

Không thể vì bảng gọi hệ thống (được gọi sys_call_table) là một mảng kích thước tĩnh. Và kích thước của nó được xác định tại thời điểm biên dịch bằng số lượng tòa nhà cao tầng đã đăng ký. Điều này có nghĩa là không có không gian cho người khác.

Bạn có thể kiểm tra việc thực hiện ví dụ cho kiến ​​trúc x86 trong arch/x86/kernel/syscall_64.ctệp, nơi sys_call_tableđược xác định. Kích thước của nó là chính xác __NR_syscall_max+1. __NR_syscall_maxđược định nghĩa arch/x86/kernel/asm-offsets_64.csizeof(syscalls) - 1(đó là số tòa nhà cuối cùng), trong đó syscallcó một bảng với tất cả các tòa nhà.

Một giải pháp khả thi là sử dụng lại một số hiện có (hoặc không dùng nữa nếu kiến ​​trúc của bạn có một, sys_setaltrootví dụ) xem số nhà chọc trời với bạn vì điều này sẽ không cần thêm dung lượng trong bộ nhớ. Một số kiến ​​trúc cũng có thể có lỗ hổng trong bảng tòa nhà (như phiên bản 64 bit của x86), do đó bạn cũng có thể sử dụng điều này.

Bạn có thể sử dụng kỹ thuật này nếu bạn đang phát triển tòa nhà mới và chỉ muốn tránh khởi động lại trong khi thử nghiệm. Bạn sẽ phải xác định cuộc gọi hệ thống mới của mình, tìm mục hiện có trong bảng tòa nhà và sau đó thay thế nó từ mô-đun của bạn.

Làm điều này từ mô-đun hạt nhân không phải là nhỏ vì kernel không xuất sys_call_tablesang các mô-đun như phiên bản 2.6 (phiên bản kernel cuối cùng có biểu tượng này được xuất 2.5.41).

Một cách để giải quyết vấn đề này là thay đổi kernel của bạn để xuất sys_call_tablebiểu tượng sang các mô-đun. Để làm điều này, bạn phải thêm hai dòng sau vào kernel/kallsyms.c( không làm điều này trên các máy sản xuất ):

extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);

Một kỹ thuật khác là tìm bảng năng động. Bạn lặp lại bộ nhớ kernel, so sánh từng từ với một con trỏ với chức năng gọi hệ thống đã biết. Vì bạn biết phần bù của tòa nhà biết này trong bảng, bạn có thể tính địa chỉ bắt đầu của bảng.


1

Thật không may, bạn không thể thêm các cuộc gọi hệ thống vào kernel dưới dạng các mô-đun có thể tải. Bạn phải chịu khó biên dịch kernel mỗi khi bạn thêm một cuộc gọi hệ thống mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.