사용자 공간 앱에 커널 헤더가 필요한 이유는 무엇입니까?


10

임베디드 장치를 위해 통화 중 상자와 iptables를 빌드하고 있으며 그 중 하나는 커널 헤더입니다.

전체 파일 시스템에서 * .ko 파일을 검색했지만 아무것도 찾지 못했습니다. 그래서 앱이로드 가능한 드라이버 (커널 모듈)를 생성하지 않는다고 결론지었습니다.

사용자 공간 응용 프로그램이 커널 헤더를 요구하는 다른 경우는 무엇입니까?


사용자 공간에 무언가가 시스템 호출을 발행하는 경우를 생각해 볼 수 있습니다.
Sami Laine

@SamiLaine 나는 c 라이브러리가 시스템 호출에 인터페이스를 제공 할 것이라고 생각합니다. 당신이 말하는 것이 사실이라면, 예를 들어 소켓을 열기 위해 커널 헤더를 가져와야하지 않습니까?
TheMeaningfulEngineer

Socket (2)는 라이브러리 함수가 아닌 시스템 호출이므로 예입니다.
Sami Laine

@SamiLaine include <linux/*.h>소켓을 열어야 하는 예를들 수 있습니까? (I는 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 버전과 결합합니다.이 API 는 이전 버전과 호환됩니다. 오늘 컴파일 된 바이너리는 이전 커널에서 작동하지 않을 수 있지만 (포함 된 기호에 따라 ... 소스 코드 읽기) 미래의 커널과 협력하십시오.
점화

1
@suprjami ABI는 표준 SysV ABI를 준수하며, 변경되지 않는 것으로 합리적으로 가정 할 수 있습니다. 무엇보다도 SysV ABI는 커널 바이너리를 생성 한 것과 반드시 ​​동일하지는 않지만 선택한 컴파일러 (및 버전)로 커널에 연결할 수있는 이유입니다.
ignis

1
... 또한 다른 커널과 함께 제공되는 배포판에 chroot / LXC를 사용할 수 있습니다. 등
점화는

1
(명확하게하기 위해 : 커널은 여기서 논의 하고있는 외부 ABI 와 커널 모듈 사이의 내부 ABI 를 가지고 있으며,이 모듈은 빈번하고 호환되지 않는 변경을 겪지 만 사용자 공간에서는 보이지 않으며 사용자 공간을 컴파일 할 때는 관련이 없습니다. 코드).
이그니스

1
(또한 ABI = / = API입니다. 커널의 (외부) API에는 소스 코드에서 참조되는 기호가 포함되어 있으며 커널 개발자는 호환성을 유지하기 위해 노력하고 있습니다. 실제 소프트웨어에서 기호가 거의 사용되지 않는 한, 다음과 같습니다. 타사 표준이 Linux API 전체를 요구하지 않으므로 기술적으로이를 방해하지는 않지만, 비 호환적인 변경을 수행하기위한 비합리적인 조치.)
ignis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.