X86에서 ARM용 커널 헤더 파일을 만드는 방법은 무엇입니까?

X86에서 ARM용 커널 헤더 파일을 만드는 방법은 무엇입니까?

공장 커널(5.10.110)과 함께 사용하는 ARM 기반 보드가 있습니다.

커널 모듈을 수동으로 빌드하려면 커널 헤더 패키지가 필요합니다. 이 패키지를 설치하려면 다음을 참조하세요.문서:

sudo dpkg -i /opt/linux-headers-*.deb

그러면 다음과 같은 구조가 생성됩니다.

/lib/modules/5.10.110$ ls -la
total 1584
drwxr-xr-x 1 root root   4096 Apr 29 15:13 .
drwxr-xr-x 1 root root   4096 Jul 10 21:36 ..
lrwxrwxrwx 1 root root     31 Feb 20 07:05 build -> /usr/src/linux-headers-5.10.110
drwxr-xr-x 2 root root   4096 Feb 20 13:29 extra
drwxr-xr-x 1 root root   4096 Feb 20 13:29 kernel
-rw-r--r-- 1 root root 327270 Apr 29 15:13 modules.alias
-rw-r--r-- 1 root root 346627 Apr 29 15:13 modules.alias.bin
-rw-r--r-- 1 root root  28645 Feb 20 13:29 modules.builtin
-rw-r--r-- 1 root root      0 Apr 29 15:13 modules.builtin.alias.bin
-rw-r--r-- 1 root root  30656 Apr 29 15:13 modules.builtin.bin
-rw-r--r-- 1 root root 164216 Feb 20 13:29 modules.builtin.modinfo
-rw-r--r-- 1 root root  95077 Apr 29 15:13 modules.dep
-rw-r--r-- 1 root root 153551 Apr 29 15:13 modules.dep.bin
-rw-r--r-- 1 root root    140 Apr 29 15:13 modules.devname
-rw-r--r-- 1 root root  51432 Feb 20 13:29 modules.order
-rw-r--r-- 1 root root    468 Apr 29 15:13 modules.softdep
-rw-r--r-- 1 root root 163120 Apr 29 15:13 modules.symbols
-rw-r--r-- 1 root root 206275 Apr 29 15:13 modules.symbols.bin

이제 전체 커널을 다시 컴파일하여 버전을 5.10.110에서 5.10.110으로 늘려야 합니다.5.10.160.

이제 커널 모듈을 컴파일하려고 하면 필요한 헤더를 찾을 수 없습니다.

5.10.110의 Build 폴더에는 다음 파일이 포함되어 있습니다.

/lib/modules/5.10.110/build$ ls -la
total 1364
drwxr-xr-x  5 root root    4096 Apr 29 15:03 .
drwxr-xr-x  1 root root    4096 Jul 10 22:35 ..
-rw-r--r--  1 root root  220133 Feb 20 07:05 .config
-rw-r--r--  1 root root   68886 Dec  1  2022 Makefile
-rw-r--r--  1 root root 1075160 Feb 20 07:02 Module.symvers
drwxr-xr-x  3 root root    4096 Apr 29 15:03 arch
drwxr-xr-x 31 root root    4096 Apr 29 15:03 include
drwxr-xr-x 17 root root   12288 Apr 29 15:03 scripts

버전 5.10.160의 새 커널에 대한 사용자 정의 커널 모듈을 빌드하기 위해 이러한 헤더를 어떻게 다시 생성할 수 있습니까?

다양한 시도를 시도했습니다. 커널이 크로스 컴파일된 시스템에서 이러한 폴더를 복사하는 것은 작동하지 않습니다. "scripts" 폴더에 aarch64(x86_64)에서 실행되지 않는 시스템 코드가 포함되어 있기 때문입니다.

그런 다음 5.10.110의 "scripts" 폴더를 복사했지만 이것이 작동하는지 또는 해를 끼치거나 원치 않는 결과를 초래할지 확실하지 않습니다.

그렇다면 사용자 정의 커널 모듈을 구축하기 위해 환경을 크로스 컴파일하는 방법은 무엇입니까?

답변1

공장 커널(5.10.110)과 함께 사용하는 ARM 기반 보드가 있습니다.

커널 모듈을 수동으로 빌드하려면 커널 헤더 패키지가 필요합니다.

ARM 기반 보드가 있지만 아마도 Intel 기반 PC 호스트를 사용하여 크로스 컴파일러/툴체인을 통해 이 모듈 빌드를 수행하고 있을 것입니다. 명령 dpkg은 PC 호스트에 설치된 Linux 배포용 헤더를 가져와 설치합니다. 하지만 ARM 기반 마더보드에서 사용하는 커널 버전에 대한 헤더가 필요합니다.


먼저 특정 커널 버전인 5.10.110의 tarball을 다운로드해야 합니다. 이것이 Linux 커널의 메인라인 버전인지, 아니면 칩이나 보드 제조업체에서 수정한 버전인지를 무시하고 있는 것입니다.

Linux 커널의 메인라인 버전에 대한 소스 코드는 다음에서 구할 수 있습니다.리눅스 커널 아카이브. 메인라인 버전 5.10.110의 타르볼은 다음과 같습니다.여기 (gzip 압축).

어쨌든 적절한 소스 코드를 얻거나 다운로드하십시오.
PC 배포 설치와 완전히 별도로 이 소스 트리의 압축을 풀고 설치하십시오. 다음 개발 디렉토리를 사용하는 것이 좋습니다/집크로스 컴파일 작업을 위해.


하위 디렉터리에 필요한 버전의 커널 소스 코드가 있으면 make headers_install셸의 명령을 사용하여 커널의 헤더 파일을 내보낼 수 있습니다.
인용하다이 가이드:

Exporting kernel headers for use by userspace
=============================================

The "make headers_install" command exports the kernel's header files in a
form suitable for use by userspace programs.
...

The "make headers_install" command can be run in the top level directory of the
kernel source code (or using a standard out-of-tree build).  It takes two
optional arguments:

  make headers_install ARCH=i386 INSTALL_HDR_PATH=/usr 

다시 한 번 말씀드리지만, 크로스 컴파일을 위해 호스트 시스템과 별도로 이러한 헤더를 아래 개발 디렉터리와 같이 좀 더 로컬인 위치에 설치하는 것이 좋습니다./집(즉, 위의 예를 맹목적으로 사용하지 마십시오).

관련 정보