Linux 커널에 1,500만 줄 이상의 코드가 있는 이유는 무엇입니까? [폐쇄]

Linux 커널에 1,500만 줄 이상의 코드가 있는 이유는 무엇입니까? [폐쇄]

이 전체 코드 베이스의 내용은 무엇입니까?

프로세서 아키텍처 지원, 보안 및 가상화를 이해하지만 600,000라인 정도를 넘을 것이라고는 상상할 수 없습니다.

드라이버가 커널 코드베이스에 포함되는 과거 및 현재 이유는 무엇입니까?

이 1,500만 개 이상의 라인에 모든 하드웨어에 대한 모든 드라이버가 포함되어 있습니까? 그렇다면 왜 드라이버가 하드웨어 ID에서 자동으로 감지되어 설치되는 별도의 패키지가 아닌 커널에 내장되어 있습니까?

코드 베이스의 크기가 저장 공간이 제한되거나 메모리가 제한된 장치에 문제가 됩니까?

이 모든 것이 내장된다면 공간이 제한된 ARM 장치의 코어 크기가 부풀어오르는 것처럼 보일 것입니다. 전처리기가 많은 줄을 제거했습니까? 미친 짓이라고 부르겠지만, 내가 이해하는 커널의 역할을 실행하기 위해 그렇게 많은 로직이 필요한 머신은 상상할 수 없습니다.

끊임없이 성장하는 것처럼 보이는 특성으로 인해 지금으로부터 50년 이상 후에 그 크기가 문제가 될 것이라는 증거가 있습니까?

드라이버를 포함한다는 것은 하드웨어가 만들어짐에 따라 드라이버도 커진다는 것을 의미합니다.

편집하다: 이것이 커널의 본질이라고 생각하는 사람들을 위해, 약간의 연구 끝에 이것이 항상 그런 것은 아니라는 것을 깨달았습니다. 코어는 Carnegie Mellon University만큼 클 필요는 없습니다.마이크로커널Mach는 "일반적으로 10,000줄 미만의 코드"의 예로 나열됩니다.

답변1

~에 따르면크록3.13에 대해 실행되는 Linux에는 약 1,200만 줄의 코드가 있습니다.

  • 700만 운전자 ​​LOC/
  • 아치/ 200만 LOC/
  • 커널에는 LOC/가 139,000개만 있습니다.

lsmod | wc내 Debian 노트북에는 런타임에 로드된 158개의 모듈이 표시되므로 동적으로 모듈을 로드하는 것이 하드웨어를 지원하는 일반적인 방법입니다.

make menuconfig컴파일할 코드(더 중요하게는 컴파일할 코드)를 선택하기 위한 강력한 구성 시스템(예: )아니요컴파일). 임베디드 시스템은 .config관심 있는 하드웨어 지원(커널에 내장된 하드웨어 또는 로드 가능한 모듈에 대한 지원 포함)으로만 자체 파일을 정의합니다.

답변2

궁금한 분들을 위해 GitHub 미러의 줄 수 분석은 다음과 같습니다.

=============================================
    Item           Lines             %
=============================================
  ./usr                 845        0.0042
  ./init              5,739        0.0283
  ./samples           8,758        0.0432
  ./ipc               8,926        0.0440
  ./virt             10,701        0.0527
  ./block            37,845        0.1865
  ./security         74,844        0.3688
  ./crypto           90,327        0.4451
  ./scripts          91,474        0.4507
  ./lib             109,466        0.5394
  ./mm              110,035        0.5422
  ./firmware        129,084        0.6361
  ./tools           232,123        1.1438
  ./kernel          246,369        1.2140
  ./Documentation   569,944        2.8085
  ./include         715,349        3.5250
  ./sound           886,892        4.3703
  ./net             899,167        4.4307
  ./fs            1,179,220        5.8107
  ./arch          3,398,176       16.7449
  ./drivers      11,488,536       56.6110
=============================================

drivers도움이 되는많은행.

답변3

드라이버는 커널에서 유지 관리되므로 커널 변경으로 인해 기능의 모든 사용자에 대해 전역 검색 및 교체(또는 검색 및 수동 수정)가 필요한 경우 변경을 수행한 사람이 수행합니다. 드라이버가 최신 커널에서 컴파일되지 않는 경우 직접 업데이트하는 것보다 API를 변경한 사람이 드라이버를 업데이트하도록 하는 것이 큰 이점입니다.

또는(트리 외부에서 유지 관리되는 드라이버에서 발생하는 현상) 변경 사항을 따라잡기 위해 유지 관리 담당자가 패치를 다시 동기화해야 합니다.

빠른 검색 발견트리 내부와 외부의 논쟁드라이버 개발.

Linux는 주로 메인라인 저장소에 모든 것을 보관하여 유지 관리됩니다. 구성 옵션을 통해 작고 간결한 커널의 빌드를 제어합니다 #ifdef. 따라서 전체 저장소에서 코드의 작은 부분만 컴파일하는 작은 단순 커널을 확실히 구축할 수 있습니다.

임베디드 시스템에 Linux를 광범위하게 적용하면더 나은 것Linux 커널 소스 트리가 더 작았던 몇 년 전과 비교하여 특정 사항을 생략하도록 지원합니다. 초소형 4.0 커널은 초소형 2.4.0 커널보다 작을 수 있습니다.

답변4

Linuxtinyconfig 컴파일된 소스 줄 번호 Tinyconfig 버블 차트svg (바이올린)

쉘 스크립트커널 빌드에서 json을 생성하려면 다음과 함께 사용하세요.http://bl.ocks.org/mbostock/4063269


편집하다: 몇 가지 제한 사항이 있는 것으로 밝혀졌으며 unifdef( -I무시되고 -include지원되지 않으며 후자는 생성된 구성 헤더를 포함하는 데 사용됨) cat이 시점에서는 사용법이 크게 변경되지 않습니다.

274692 total # (was 274686)

스크립트와 절차가 업데이트되었습니다.


드라이버, 아키텍처 등 외에도 선택한 구성에 따라 컴파일되거나 컴파일되지 않는 조건부 코드가 많이 있으며, 코드가 반드시 동적으로 로드된 모듈에 있을 필요는 없지만 코어에 내장되어 있습니다.

그래서 다운로드 받은linux-4.1.6 소스 코드, 선택됨작은 구성, 모듈을 활성화하지 않습니다. 어쨌든 커널을 구성하기 위해 모듈을 활성화하거나 사용자가 런타임에 이를 사용하여 무엇을 할 수 있는지 솔직히 모르겠습니다.

# tinyconfig      - Configure the tiniest possible kernel
make tinyconfig

커널 빌드

time make V=1 # (should be fast)
#1049168 ./vmlinux (I'm using x86-32 on other arch the size may be different)

*.cmd커널 빌드 프로세스 에서는 명령줄로 호출되는 숨겨진 파일이 남습니다 . .o이 파일은 파일을 빌드하고, 해당 파일을 처리하고, script.sh아래 대상 및 종속성의 복사본을 추출하고 다음과 병합하는 데도 사용됩니다.찾다:

find -name "*.cmd" -exec sh script.sh "{}" \;

.o이렇게 하면 이름이 지정된 대상의 각 종속성에 대한 복사본이 생성됩니다..o.c

.c 코드

find -name "*.o.c" | grep -v "/scripts/" | xargs wc -l | sort -n
...
   8285 ./kernel/sched/fair.o.c
   8381 ./kernel/sched/core.o.c
   9083 ./kernel/events/core.o.c
 274692 total

.h 헤더(소독)

make headers_install INSTALL_HDR_PATH=/tmp/test-hdr
find /tmp/test-hdr/ -name "*.h" | xargs wc -l
...
  1401 /tmp/test-hdr/include/linux/ethtool.h
  2195 /tmp/test-hdr/include/linux/videodev2.h
  4588 /tmp/test-hdr/include/linux/nl80211.h
112445 total

관련 정보