เหตุใดแอพพื้นที่ผู้ใช้จึงต้องใช้ส่วนหัวเคอร์เนล


10

ฉันกำลังสร้างกล่องไม่ว่างและ iptables สำหรับอุปกรณ์ฝังตัวและหนึ่งในการอ้างอิงสำหรับพวกเขาคือส่วนหัวเคอร์เนล

ฉันค้นหาทั้งระบบไฟล์ * .ko และไม่พบใครเลย ดังนั้นฉันจึงสรุปว่าแอปไม่ได้สร้างไดรเวอร์ที่สามารถโหลดได้ (โมดูลเคอร์เนล)

กรณีอื่น ๆ สำหรับแอปพลิเคชันพื้นที่ผู้ใช้ในการกำหนดให้ส่วนหัวของเคอร์เนลมีอะไรบ้าง


ตัวอย่างง่ายๆที่จะเกิดขึ้นคือเมื่อบางสิ่งในพื้นที่ของผู้ใช้เรียกการเรียกของระบบ
Sami Laine

@SamiLaine ฉันจะเดาห้องสมุด c จะให้อินเทอร์เฟซการโทรของระบบ หากสิ่งที่คุณพูดเป็นกรณีคุณจะต้องนำเข้าส่วนหัวเคอร์เนลเพียงเพื่อเปิดซ็อกเก็ตหรือไม่?
TheMeaningfulEngineer

Socket (2) เป็นการเรียกของระบบไม่ใช่ฟังก์ชันไลบรารีดังนั้นใช่
Sami Laine

@SamiLaine คุณสามารถยกตัวอย่างที่คุณต้องinclude <linux/*.h>เปิดซ็อกเก็ตได้หรือไม่? (ฉันกำลังเล็งหา sys / socket.h)
TheMeaningfulEngineer

คำตอบ:


8

เนื่องจากโปรแกรมเหล่านั้นสร้างเพื่อใช้สิ่งที่กำหนดไว้ในส่วนหัวเคอร์เนล:

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 */
....

สำหรับเครื่องมือเฉพาะแต่ละอย่างคุณจะต้องอ่านแหล่งที่มาของเครื่องมือและส่วนหัวเคอร์เนลที่เกี่ยวข้องเพื่อหาว่าสิ่งใด

คุณสามารถเห็นบางสิ่งที่ถูกคอมเม้นต์เพื่อให้ง่าย

ตัวอย่างเช่นmkfs_vfatรวมถึงlinux/fd.hการได้รับ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);

คุณอาจลบที่เกี่ยวข้อง#includeและดูข้อผิดพลาดของคอมไพเลอร์เพื่อให้ง่ายขึ้นคุณจะได้รับคำเตือนว่าบางสิ่งไม่ได้กำหนดไว้ สิ่งเหล่านั้นน่าจะมาจากส่วนหัวของเคอร์เนล


2
1. Busybox ได้รับการออกแบบสำหรับระบบฝังตัวและอื่น ๆ ที่มีน้ำหนักเบาซึ่งคุณต้องการโหลดไลบรารีในหน่วยความจำให้น้อยที่สุด ฉันยังไม่ได้อ่านซอร์ส แต่อาจเป็น BB โดยทั่วไปคือการเลี่ยงห้องสมุดและเชื่อมโยงโดยตรงกับเคอร์เนล 2. ไม่มันคู่กับฐานผู้ใช้ของคุณกับรุ่นของเคอร์เนล APIซึ่งเข้ากันได้ย้อนหลัง: ไบนารีที่รวบรวมในวันนี้อาจไม่ทำงานบนเคอร์เนลเก่า (ขึ้นอยู่กับสัญลักษณ์ที่รวม ... อ่านซอร์สโค้ด) แต่จะ ทำงานกับเมล็ดในอนาคต
Ignis

1
@suprjami ABI ปฏิบัติตามมาตรฐาน SysV ABI ซึ่งสามารถสันนิษฐานได้ว่าจะไม่เปลี่ยนแปลง เหนือสิ่งอื่นใด SysV ABI คือเหตุผลที่คุณสามารถเชื่อมโยงกับเคอร์เนลด้วยคอมไพเลอร์ของคุณ (และเวอร์ชั่น) ของตัวเลือกไม่จำเป็นต้องเป็นแบบเดียวกันกับที่ปล่อยเคอร์เนลไบนารี
Ignis

1
... มันยังทำให้ chroot / LXC เป็น distro ที่ส่งมาพร้อมกับเคอร์เนลที่แตกต่างกัน ฯลฯ
Ignis

1
(เพื่อความชัดเจน: โปรดทราบว่าเคอร์เนลมีABI ภายนอกซึ่งเรากำลังพูดถึงเกี่ยวกับที่นี่และABI ภายในระหว่างโมดูลเคอร์เนลซึ่งผ่านการเปลี่ยนแปลงบ่อยและเข้ากันไม่ได้ แต่จะไม่เห็นโดย userspace และไม่เกี่ยวข้องเมื่อรวบรวมผู้ใช้สเปซ รหัส.)
Ignis

1
(โปรดทราบว่า ABI = / = API API ของเคอร์เนล (ภายนอก) มีสัญลักษณ์ที่อ้างถึงในซอร์สโค้ดและผู้พัฒนาเคอร์เนลมีความมุ่งมั่นที่จะรักษาความเข้ากันได้ยกเว้นว่าสัญลักษณ์นั้นไม่ค่อยถูกใช้ในซอฟต์แวร์โลกแห่งความเป็นจริง ย้ายไม่มีเหตุผลสำหรับพวกเขาที่จะทำให้การเปลี่ยนแปลงเข้ากันไม่ได้แม้ว่าจะไม่มีเอกสารของบุคคลที่สามมาตรฐานทั้งของลินุกซ์ API และดังนั้นจึงไม่มีอะไรขัดขวางในทางเทคนิคมัน).
IGNIS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.