Tại sao các ứng dụng không gian người dùng cần tiêu đề kernel?


10

Tôi đang xây dựng hộp bận và iptables cho một thiết bị nhúng và một trong những phụ thuộc cho chúng là các tiêu đề kernel.

Tôi đã tìm kiếm toàn bộ hệ thống tệp cho các tệp * .ko và không tìm thấy. Vì vậy, tôi đã kết luận các ứng dụng không tạo ra bất kỳ trình điều khiển có thể tải (mô-đun hạt nhân) nào.

Các trường hợp khác cho một ứng dụng không gian người dùng để yêu cầu các tiêu đề kernel là gì?


Một ví dụ dễ dàng được đưa ra là khi một cái gì đó trong không gian người dùng thực hiện một cuộc gọi hệ thống.
Sami Laine

@SamiLaine Tôi đoán thư viện c sẽ cung cấp giao diện cho các cuộc gọi hệ thống. Nếu những gì bạn đang nói là trường hợp, chẳng hạn, bạn có phải nhập tiêu đề hạt nhân chỉ để mở một ổ cắm không?
TheMeaningfulEngineer

Ổ cắm (2), là một cuộc gọi hệ thống, không phải là chức năng thư viện, nên có.
Sami Laine

@SamiLaine Bạn có thể cho một ví dụ về nơi bạn phải include <linux/*.h>mở ổ cắm không? (Tôi đã nhắm đến sys / socket.h)
TheMeaningfulEngineer

Câu trả lời:


8

Bởi vì các chương trình đó được xây dựng để sử dụng những thứ được xác định trong các tiêu đề kernel:

busybox-1.22.1]$ egrep -RHn '^#include <linux'
modutils/modutils-24.c:194:#include <linux/elf-em.h>
include/fix_u32.h:17:#include <linux/types.h>
libbb/loop.c:11:#include <linux/version.h>
console-tools/openvt.c:23:#include <linux/vt.h>
console-tools/kbd_mode.c:23:#include <linux/kd.h>
console-tools/showkey.c:19:#include <linux/kd.h>
util-linux/blockdev.c:36:#include <linux/fs.h>
util-linux/mkfs_ext2.c:50:#include <linux/fs.h>
util-linux/mkfs_vfat.c:28:#include <linux/hdreg.h> /* HDIO_GETGEO */
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
....

Đối với mỗi công cụ cụ thể, bạn cần đọc nguồn của công cụ và tiêu đề hạt nhân có liên quan để tìm ra chính xác những gì.

Bạn có thể thấy một vài điều được bình luận để làm cho nó dễ dàng.

Ví dụ: mkfs_vfatbao gồm linux/fd.hđể có được FDGETPRM:

$ egrep -RHn FDGETPRM util-linux/mkfs_vfat.c
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
util-linux/mkfs_vfat.c:351:         int not_floppy = ioctl(dev, FDGETPRM, &param);

Bạn có thể có thể loại bỏ các lỗi liên quan #includevà theo dõi các lỗi biên dịch để dễ dàng hơn, bạn sẽ nhận được cảnh báo rằng một số điều không được xác định. Những thứ đó có thể đến từ các tiêu đề kernel.


2
1. Busybox được thiết kế cho các hệ thống nhúng và các hệ thống nhẹ khác, nơi bạn muốn tải càng ít thư viện trong bộ nhớ càng tốt. Tôi chưa đọc nguồn, nhưng có lẽ BB về cơ bản là vượt qua các thư viện và liên kết trực tiếp với kernel. 2. Không. Nó kết hợp nhị phân không gian người dùng của bạn với một phiên bản API kernel , tương thích ngược: một nhị phân được biên dịch ngày nay có thể không hoạt động trên kernel cũ hơn (tùy thuộc vào các ký hiệu được bao gồm ... đọc mã nguồn) nhưng sẽ làm việc với các hạt nhân trong tương lai.
Ignis

1
@suprjami ABI tuân theo SysV ABI tiêu chuẩn, có thể được giả định hợp lý là không thay đổi; trong số những thứ khác, SysV ABI là lý do tại sao bạn có thể liên kết với kernel với trình biên dịch (và phiên bản) mà bạn chọn, không nhất thiết phải là cùng một thứ phát ra nhị phân kernel.
Ignis

1
... nó cũng cho phép chroot / LXC vào một bản phân phối được vận chuyển với một kernel khác. v.v.
ignis

1
(Để rõ ràng: lưu ý rằng kernel có ABI bên ngoài mà chúng ta đang thảo luận ở đây và ABI bên trong giữa các mô-đun kernel, trải qua các thay đổi thường xuyên và có thể không tương thích, nhưng không được người dùng nhìn thấy và không liên quan khi biên dịch không gian người dùng mã.)
ignis

1
(Cũng lưu ý rằng ABI = / = API. API (bên ngoài) của kernel bao gồm các ký hiệu được tham chiếu trong mã nguồn và các nhà phát triển kernel đã cam kết duy trì khả năng tương thích; trừ khi các ký hiệu rất hiếm khi được sử dụng trong phần mềm trong thế giới thực, nó sẽ là một động thái bất hợp lý cho họ để thực hiện thay đổi không tương thích, mặc dù không có bên thứ ba nhiệm vụ tiêu chuẩn toàn bộ các API Linux và do đó không có gì về mặt kỹ thuật cản trở nó).
Ignis
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.