커널 소스 트리에는 무엇이 포함되어 있습니까? 이것은 Linux 커널 헤더와 관련이 있습니까?


25

책에서, 나는 일반적으로 리눅스 소스 트리에 대한 참조를 읽을 /usr/src/linux서브 디렉토리의 일반적인 세트 ( arch, block, crypto, ...).

이 트리에 커널을 구성하는 이진 파일이 포함될 것으로 기대했습니다. 내 시스템 (Ubuntu 10.04)에서 ...

  1. 내가 가지고있는 다른 커널 (수동으로 설치되지 않은 자동 소프트웨어 다운로드 사용)의 경우이 위치에서 다음과 같이 각 커널에 대해 두 개의 하위 디렉토리를 찾습니다.

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. 하위 디렉토리에서 나는 바이너리 파일을 기대했습니다. 그러나 나는 상당히 많은 양의 트리를 검사했으며 여기에서 마지막 하위 디렉토리는 항상 Makefile(보통 구성 파일보다 설치 파일과 비슷하게 들립니다) 플러스 때때로 몇 가지 다른 파일을 가지고있는 것처럼 보입니다 (주로 Kconfig).

내 질문은 순진하지만 조금 혼란 스럽습니다. (2) 커널 소스 트리에서 예상되는 것입니까? 왜 '헤더'에 대한 명시적인 언급이 있습니까? linux-generic-headers다른 소프트웨어의 경우 잠시 설치해야 하는데 이것이 관련이 있는지 확실하지 않습니다. makefile이 (예를 들어, / driver 서브 디렉토리에 모듈을 설치해야하는) 정당한 이유가 있다는 것을 알고 있지만 (거의) makefile 만 있습니까?

답변:


30

배포 kernel-header패키지는 이름에서 알 수 있듯이 커널 모듈과 같은 소프트웨어를 빌드하는 데 필요한 커널 헤더 파일 (필요한 배관) 만 포함합니다.

빌드 출력을 제외하고 는 커널 소스 디렉토리 에서 이진 파일을 찾지 않아야 합니다. (커널을 직접 구성하고 빌드하는 경우 커널 소스 디렉토리에는 컴파일 된 객체, 모듈, 빌드 된 커널 자체 및 작동하도록하는 몇 가지 다른 이진 비트 및 조각이 포함됩니다.)
KConfig파일은 커널 구성 옵션에 대한 설명입니다. 지정된 디렉토리 / 모듈에 사용 가능한 (및 해당 종속성)
그 외에도 모든 (대부분) C 소스 코드, 헤더 파일 및 Makefiles입니다. 여기저기서 몇 가지 도우미 스크립트와 어셈블리 소스도 있습니다.

헤더 패키지 (설치 한 것) 는 위 의 헤더 부분 (모두 "내 보낸"헤더 만 해당) 및 일부 빌드 인프라 만 포함합니다. 그래서 당신이보고있는 것은 예상됩니다. 헤더 패키지 에는 C 소스 코드가 포함되어 있지 않습니다 (일부 스텁 및 빌드 인프라 코드 제외). 이 유형의 패키지를 사용하는 요점은 공간과 대역폭을 절약하는 것입니다. 전체 Linux 커널 소스 트리는 다소 커서 커널을 직접 컴파일하지 않으려는 경우에는 완전히 필요하지 않습니다. 헤더 패키지는 배포판으로 빌드 및 배송되어 모듈을 빌드하는 데 필요한 올바른 것을 제공하지만 더 이상은 아닙니다. (확실히 컴파일 된 커널을 포함하지 않습니다.)

주석 처리 : 헤더 패키지는 다른 곳으로 재배치되지 않습니다. 그것들은 특정 버전의 커널을 위해 만들어졌으며 특정 디렉토리에 패키지되어 있습니다. 파일 세트 일뿐입니다. (헤더 패키지는 현재 안정적인 커널 바이너리 패키지와 반드시 동일한 버전을 가질 필요는 없습니다. 헤더 패키지는 일반적이며 실행중인 실제 커널보다 뒤처 질 수 있습니다. 그러나 커널에서 나온 것이 아닙니다 현재 설치된 (또는 대상) 커널보다 최신 버전)

설치된 커널 바이너리 는 일반적 /boot으로 부트 로더 바이너리 및 구성 파일과 함께 디렉토리에 설치됩니다 . (이것은 때때로 독립적 인 파일 시스템이며, 기본적으로 마운트되지 않습니다.) 파일의 정확한 이름은 커널과 배포판에 따라 다릅니다. (부트 로더도 마찬가지입니다.)

설치된 커널 모듈 은 다음의 하위 디렉토리에 있습니다.

/lib/modules/`uname -r`/

예를 들어 내 시스템에서는 현재

/lib/modules/3.1.4-gentoo/

전체 커널 소스 코드 : Ubuntu에서 전체 커널 소스가 직접 커널을 빌드하도록하려면 여기 지침을 따라 설치해야 합니다 .

당신은 또한에서 소스 TAR 파일을 다운로드 할 수 kernel.org와 (할 곳 압축을 해제 하지 이 타르볼을 사용하는 경우, 귀하의 개인 물건과 RPM 별도 관리하는 물건을 계속 덮어 쓰기 우분투 설치 파일).

/usr/src/linux커널 소스를 넣는 전통적인 장소이지만 커널 소스를 다른 곳에 두는 것을 막을 수있는 것은 없습니다. 이 경로는 종종 디렉토리에 대한 심볼릭 링크 일뿐입니다. 예를 들어 내 컴퓨터 에이 기능이 있습니다.

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

심볼릭 링크는 커널 소스에 의존하는 응용 프로그램 작성을 단순화합니다. 트리 외부에서 모듈을 빌드 할 때 정확한 버전 또는 경로 정보를 지정할 필요가 없도록 해당 경로를 실행중인 (또는 대상) 커널에 연결합니다. 최소한 소스 기반 배포판을 위해 도움이됩니다.


이 상세하고 완전한 답변에 대단히 감사합니다. 이것은 잠시 동안 나를 괴롭 혔습니다. 내 환영을 과도하게 늘리지 않고 시간을 찾으면 친절하게 추가 할 수 있습니까? 디렉토리는 커널 C와 어셈블러 소스 코드를 포함해야합니다. 하위 디렉토리의 20-30 개를 탐색 할 때와 같이 전체 목록이 아닌 위치는 어디에 있습니까? kernel.org에서 커널 소스 파일을 다운로드했습니다. 나는 단지 내 시스템을 더 잘 이해하고 싶다. (b) ...
gnometorule

... 내 경우처럼 커널을 직접 설치하지 않을 때 커널 바이너리는 어디에 있습니까? (c) 당신은 내가 'linux-generic-headers'로 가져간 "헤더 패키지"를 참조합니다 이 패키지에서 트리가 보입니까? 그렇다면, 소스 트리를 설치하기 전에 어디에서나 재배치합니까? 다시 한번 감사드립니다.
gnometorule

(당신이 대답한다면, '답변'을 쓰지 말고 적어도 당신의 도움을 위해 당신을 다시
찬성

조금 확장했습니다. 헤더 패키지는 헤더 용입니다. 전체 소스 패키지는 전체 소스 코드를 제공합니다. 이진 패키지는 이진 만 제공합니다.
Mat

5
linux-source업스트림 소스를 포함하고, apt-get source linux-image-$(uname -r)우분투 패치로 커널의 소스를 얻습니다.
Lekensteyn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.