왜 리눅스 커널이 1,500 만 줄의 코드입니까? [닫은]


109

이 모 놀리 식 코드베이스의 내용은 무엇입니까?

프로세서 아키텍처 지원, 보안 및 가상화를 이해하고 있지만 60 만 라인 이상인 것으로는 상상할 수 없습니다.

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

1,500 만 개 이상의 라인에 모든 하드웨어에 대한 모든 단일 드라이버가 포함되어 있습니까? 그렇다면 드라이버가 커널에 내장되어 있고 자동 감지되어 설치된 하드웨어 패키지를 하드웨어 ID와 분리하지 않는 이유는 무엇입니까?

스토리지 기반 또는 메모리 제한 장치의 경우 코드베이스의 크기가 문제입니까?

공간이 제한된 ARM 장치가 모두 포함 된 경우 커널 크기를 크게 늘리는 것 같습니다. 전처리기에 의해 많은 라인이 제거됩니까? 나를 미치게 부르지 만, 내가 이해하는 것을 실행하기 위해 많은 논리가 필요한 기계가 커널의 역할이라고 상상할 수는 없습니다.

점점 커지고있는 자연으로 인해 50 년 이상 크기가 문제가 될 것이라는 증거가 있습니까?

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

편집 : 이것이 커널의 본질이라고 생각하는 사람들을 위해, 일부 연구 후 나는 그것이 항상 그렇지는 않다는 것을 깨달았습니다. Carnegie Mellon의 마이크로 커널 Mach가 '보통 10,000 줄 미만의 코드'의 예로 나열 되었기 때문에 커널 이이 크기 일 필요는 없습니다.


9
2012 년에는 운전자를 위해 5 백만 라인이 넘었습니다. 다른 프로세서 아키텍처를 지원하기위한 190 만 라인. 더 많은 정보 h-online.com/open/features/…
steve

11
예, 언어에 대한 컴파일러, 어휘 분석기 및 바이트 코드 생성기를 코딩했으며 완전한 완료 및 재귀를 수행했으며 10,000 줄을 사용하지 않았습니다.
Jonathan

5
(지금 살펴 보니 약 2,700 줄)
Jonathan

4
make menuconfig빌드하기 전에 얼마나 많은 코드를 활성화 / 비활성화 할 수 있는지 다운로드 및 구성해야합니다 .
casey

6
@JonathanLeaders : Mandelbrots를 렌더링하는 테스트 프로그램으로 100 줄 미만의 언어와 같은 언어로 LISP를위한 완전한 컴파일러를 튜링했습니다. 항상 다릅니다.
phresnel

답변:


43

드라이버는 커널 내부에 유지되므로 커널 변경이 함수의 모든 사용자에 대해 전역 검색 및 교체 (또는 검색 및 수정)가 필요한 경우 변경하는 사람이 수행합니다. 사람들이 API를 변경하여 드라이버를 업데이트하는 것은 최신 커널에서 컴파일하지 않을 때 직접 수행하는 대신 매우 좋은 이점입니다.

대안은 (트리 외부에서 유지 관리되는 드라이버의 경우) 패치가 변경 사항에 따라 유지 관리 담당자가 다시 동기화해야한다는 것입니다.

빠른 검색으로 인트 리 및 아웃 트리 드라이버 개발에 대한 논쟁이 제기되었습니다 .

리눅스가 유지되는 방식은 대부분 메인 라인 저장소에 모든 것을 유지하는 것입니다. 작은 스트립 다운 커널 빌드는 #ifdefs 를 제어하기위한 구성 옵션에 의해 지원됩니다 . 따라서 전체 리포지토리에서 코드의 작은 부분 만 컴파일하는 작은 스트립 다운 커널을 절대적으로 빌드 할 수 있습니다.

임베디드 시스템에서 리눅스를 광범위하게 사용 함으로써 커널 소스 트리가 더 작 았던 리눅스보다 몇 년 전보다 더 많은 것들을 지원할 수 있게 되었습니다. 최고-최소 4.0 커널은 아마도 최고-최소 2.4.0 커널보다 작을 것입니다.


4
이제 이것은 모든 코드를 함께 사용하는 것이 논리적 인 이유에 대해 이해가되며 컴퓨터 리소스 및 과도한 종속성을 희생하여 시간을 절약합니다.
Jonathan

8
@JonathanLeaders : 그렇습니다. 유지 보수가 그리 활발하지 않은 드라이버의 비트 로스를 피합니다. 핵심 변경 사항을 고려할 때 모든 드라이버 코드를 사용하는 것이 유용 할 수도 있습니다. 일부 내부 API의 모든 호출자를 검색하면 생각하지 않은 방식으로 드라이버를 사용하여 드라이버가 변경되어 생각했던 변경에 영향을 줄 수 있습니다.
Peter Cordes

1
@JonathanLeaders는 PC에 설치하는 현대적인 측정에서 여분의 라인이 훨씬 많은 공간을 차지하는 것처럼 xd를 제공합니다.
Junaga

3
@ Junaga : 리눅스가 이식성이 뛰어나고 확장 가능하다는 것을 알고 있습니까? 32MB 임베디드 시스템에서 1MB의 영구적으로 사용되는 커널 메모리를 낭비하는 것은 큰 문제입니다. 소스 코드 크기는 중요하지 않지만 컴파일 된 이진 크기는 여전히 중요합니다. 커널 메모리는 페이징되지 않으므로 스왑 공간이 있어도 되돌릴 수 없습니다.
Peter Cordes

1
@ 롤프 : 그것은 크지 만 스파게티 가 아닙니다 . 현재 핵심 코드와 드라이버 사이에 양방향 종속성이 없어도 상당히 잘 설계되었습니다. 코어 커널을 손상시키지 않고 드라이버를 남겨 둘 수 있습니다. 내부 함수 또는 API가 리팩토링되어 드라이버가 다르게 사용해야하는 경우, 드라이버를 변경해야하지만 리팩토링에는 정상입니다.
Peter Cordes

79

3.13에 대한 cloc run에 따르면 Linux는 약 1200 만 줄의 코드입니다.

  • 드라이버 7 백만 LOC /
  • 아치에서 2 백만 LOC /
  • 커널에서 139 천 LOC 만

lsmod | wc 내 데비안 랩톱에는 런타임에로드 된 158 개의 모듈이 표시되므로 동적으로 모듈을로드하는 것이 하드웨어를 지원하는 잘 사용되는 방법입니다.

강력한 구성 시스템 (예 :) make menuconfig은 컴파일 할 코드를 선택하는 데 사용됩니다 (및 컴파일 하지 않을 코드 ). 임베디드 시스템은 .config관심 하드웨어 지원 (커널에 내장 된 하드웨어 지원 또는로드 가능한 모듈 포함)으로 자체 파일을 정의합니다 .


2
find /lib/modules/$(uname -r)/ -name '*.ko' | wc3,000 개가 조금 넘습니다. 그리고 FWIW는 이것이 "범용 운영 체제"인 데비안 이며, Linux 커널을 기반으로 구축 된 최신 컴퓨터에서 작동해야하는 전체 운영 체제를 제공합니다.
drewbenn

3
모듈을 계산하는 것만으로는 충분하지 않습니다. config에 의해 내장되었을 수도 있습니다
Alex

5
필자는 리눅스 커널이 엄청나게 복잡하지 않기 때문에 모든 종류의 장치 구성을 지원하기 때문에 방대한 규모라고 결론 내릴 수 있다고 생각한다. 여기서는 15m 라인 중 거의 사용되지 않는 것을 볼 수 있습니다. 거의 모든 것들이 그러 하듯이 그것은 너무 복잡 할 수 있지만 적어도 우리는 그것이 합리적인 이유를 알고 밤에 잠을 잘 수 있습니다
Jonathan

2
@JonathanLeaders : 그렇습니다 – 그리고 이상한 장치를위한 모듈뿐만 아니라 파일 시스템, 네트워킹 프로토콜 등을 모호하게하는 모듈이 있습니다.
psmears

6
@JonathanLeader Linux가 시작될 때를 기억합니다-심지어 설치 프로그램을 작동시키는 것조차도 (설치 프로그램이있는 경우에도!) 엄청난 고통이있었습니다 . 마우스 드라이버를 수동으로 선택 해야하는 배포판이 여전히 있습니다. 네트워킹 또는 신 금지, X- 창, 작업과 같은 것을 만드는 것은 통과의 예입니다. Red Hat을 처음 설치할 때 사용할 수있는 드라이버는 3 개뿐이므로 그래픽 드라이버를 직접 작성해야했습니다. 기본적으로 기본 작업을 수행한다는 것은 성숙의 징후입니다. 분명히 몇 가지 HW 조합 만있는 임베디드 시스템에서 더 많은 조정을 할 수 있습니다.
Luaan

67

궁금한 점이 있다면 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많은 라인 수 에 기여합니다 .


19
그 흥미 롭군요. 더 흥미로운 점은 프로그래머가 성가신 코드에서 잠재적으로 취약한 점입니다.grep -Pir "\x66\x75\x63\x6b" /usr/src/linux/ | wc -l
jimmij

4
@jimmij '\ x73 \ x68 \ x69 \ x74'는 이 획기적인 (약간 오래된 경우) 연구에 따라 더 일반적 일 수 있습니다 .
Nick T

3
임의의 사실 : OP에서 추정 한 600,000 LOC에 더 가까운 폴더가 문서입니다.
Davidmh

1
./documentation500,000 줄 이상의 코드가 있습니까? ....뭐?
C_B

2
@C_B @Davidmh 저는 이것이 간단한 wc계산 이라고 생각합니다. "코드 라인"보다 정의하기가 더 쉽다 는 장점이 있습니다. :)
drewbenn

43

지금까지의 대답은 "그렇습니다. 많은 코드가 있습니다"라고 보이며 아무도 가장 논리적 인 대답으로 15M +? 그래서 무엇? 소스 코드 의 15M 라인 은 생선 가격과 어떤 관련이 있습니까? 상상할 수없는 이유는 무엇입니까?

리눅스는 분명히 많은 일을합니다. 다른 것보다 훨씬 더 ... 그러나 당신의 요점 중 일부는 그것이 만들어지고 사용될 때 일어나는 일을 존중하지 않는다는 것을 보여줍니다.

  • 모든 것이 컴파일되는 것은 아닙니다. 커널 빌드 시스템을 사용하면 소스 코드 세트를 선택하는 구성을 신속하게 정의 할 수 있습니다. 일부는 실험적이고 일부는 오래되었으며 일부는 모든 시스템에 필요하지 않습니다. 봐 /boot/config-$(uname -r)에서 (우분투) make menuconfig당신은 제외됩니다 얼마나 볼 수 있습니다.

    그리고 그것은 가변 대상 데스크탑 배포판입니다. 임베디드 시스템의 설정은 필요한 것만 가져옵니다.

  • 모든 것이 내장되어있는 것은 아닙니다. 내 구성에서 대부분의 커널 기능은 모듈로 빌드됩니다.

    grep -c '=m' /boot/config-`uname -r`  # 4078
    grep -c '=y' /boot/config-`uname -r`  # 1944
    

    분명히, 이것들 모두 내장되어있을 수 있습니다 ... 그것들이 인쇄되어 거대한 종이 샌드위치로 만들어 질 수있는 것처럼. 개별 하드웨어 작업을위한 사용자 지정 빌드를 수행하지 않는 한 이치에 맞지 않습니다 (이 경우 이러한 항목 수를 이미 제한했습니다).

  • 모듈이 동적으로로드됩니다. 시스템에 수천 개의 모듈을 사용할 수있는 경우에도 필요한 것만로드 할 수 있습니다. 다음의 출력을 비교하십시오.

    find /lib/modules/$(uname -r)/ -iname '*.ko' | wc -l  # 4291
    lsmod | wc -l                                         # 99
    

    거의 아무것도로드되지 않습니다.

  • 마이크로 커널은 같은 것이 아닙니다. 받는 최고의 이미지를보고 그냥 십초 위키 백과 페이지 링크는 그들이 완전히 다른 방식으로 설계되어 강조한다.

    Linux 드라이버는 사용자 공간이 아닌 내부적으로 (대부분 동적으로로드 된 모듈로) 파일 시스템은 내부적으로 비슷합니다. 왜 외부 드라이버를 사용하는 것보다 나쁩니 까? 범용 컴퓨팅에 마이크로가 더 나은 이유는 무엇입니까?


댓글이 다시 표시되지 않음을 강조 표시합니다. 개별 하드웨어 (예 : 항공 우주, TiVo, 태블릿 등)에 Linux를 배포 하려면 필요한 드라이버 만 빌드하도록 구성하십시오 . 로 데스크톱에서도 동일한 작업을 수행 할 수 있습니다 make localmodconfig. 유연성이 전혀없는 작은 목적의 커널 빌드로 끝납니다.

Ubuntu와 같은 배포판의 경우 단일 40MB 커널 패키지가 허용됩니다. 아니요, 4000 개 이상의 부동 모듈을 패키지로 유지하는 대규모 보관 및 다운로드 시나리오 보다 실제로 선호 됩니다. 디스크 공간을 적게 사용하고 컴파일 타임에 패키지하기가 쉽고 저장하기 쉬우 며 사용자 (작동하는 시스템을 가진 사용자)에게 더 좋습니다.

미래도 문제가되지 않는 것 같습니다. CPU 속도, 디스크 밀도 / 가격 및 대역폭 개선 속도는 커널의 성장보다 훨씬 빠릅니다. 세계에서 10 년 안에 200MB 커널 패키지는 끝나지 않을 것입니다.

또한 일방 통행 거리가 아닙니다. 코드가 유지되지 않으면 코드가 쫓겨납니다.


2
문제는 주로 임베디드 시스템에 관한 것입니다. 당신이 보여 주듯이, 당신은 당신의 시스템에서 사용하지 않는 4,000 개의 모듈을 가지고 있습니다. 일부 소규모 로봇 공학 또는 항공 우주 응용 분야에서는 (읽기 : 범용 컴퓨팅이 아님) 이는 용납 할 수없는 낭비입니다.
Jonathan

2
@JonathanLeaders 안전하게 삭제할 수 있다고 생각합니다. 데스크탑 설치시 갑자기 USB 포트에 무언가를 연결하거나 하드웨어 구성 등을 변경하는 경우가 있습니다.
Didier A.

1
예, 정확히 "언제든지 USB 장치를 꽂을 수 있으므로 15m 라인의 코드가 필요하다"는 커널 수준 에서 작성되고 배포판 수준이 아니라 Linux가 전화 및 임베디드 장치. 글쎄, 나는 그 배포판 그 자체로 목록을 컬링한다고 생각합니다 . 난 그냥, 플러그 인에 대한 지원이 감산 첨가제되지해야한다고 생각 것, IE 것 종류가 현재 크기의 1 %로 커널을 말하는 임베디드 ARM 구성에 반대, 패키지 소스를 추가하여 그것을 '옵트 인'의 배포판
Jonathan

5
@JonathanLeaders 당신은 임베디드 시스템에서 데스크탑을 위해 구성된 커널을 실행하지 않을 것 입니다. 내장 시스템에는 13 개의 모듈이 있으며 필요없는 하드웨어 지원이 많이 제거되었습니다 (다른 많은 사용자 정의와 함께). 데스크톱과 임베디드 시스템 비교를 중단하십시오. Linux는 모든 것을 지원하고 관심있는 것만 포함 하도록 사용자 정의 할 수 있기 때문에 잘 작동합니다 . 이 4k 모듈은 데스크탑 시스템에서 정말 훌륭합니다. 마지막 랩톱이 죽었을 때 하드 드라이브를 훨씬 더 새로운 랩톱에 넣고 모든 것이 제대로 작동했습니다 .
drewbenn

3
그렇지 않으면 좋은 / 가치있는 대답은 분명히 화를 내고 격렬한 어조로 고통받습니다. -1.
TypeIA

19

리눅스 tinyconfig 컴파일 소스 라인 수 tinyconfig 버블 그래프 svg (바이올린)

커널 빌드에서 json을 작성하는 쉘 스크립트http://bl.ocks.org/mbostock/4063269 와 함께 사용하십시오.


편집 : 이 시점에서 unifdef약간의 변경이 없었습니다 ( -I무시되고 -include지원되지 않으며, 후자는 생성 된 구성 헤더를 포함하는 데 사용됩니다) cat.

274692 total # (was 274686)

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


드라이버, 아치 등 이외에도 선택한 구성에 따라 컴파일되거나 조건이없는 많은 조건부 코드가 있습니다. 코드는 동적으로로드 된 모듈이 아니라 코어에 내장되어 있습니다.

따라서 linux-4.1.6 소스를 다운로드 하고 tinyconfig를 선택 하면 모듈을 사용할 수 없으며 런타임에 사용자가 무엇을 할 수 있는지 또는 런타임에 사용자가 할 수있는 일을 솔직히 알지 못합니다. 어쨌든 커널을 구성하십시오.

# 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 와 함께 사용 하기 위해 사용되는 명령 줄을 사용하여 숨겨진 파일을 남겨 둡니다 .

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

@JonathanLeaders는 작업에 재밌었습니다. 누군가 좋아해서 기뻐합니다
Alex

9

모 놀리 식 커널의 트레이드 오프는 처음부터 공개적으로 Tananbaum과 Torvalds 사이에서 논의되었습니다. 모든 것을 위해 사용자 공간으로 넘어갈 필요가 없다면 커널 인터페이스가 더 간단해질 수 있습니다. 커널이 모 놀리식이라면 내부적으로 더 최적화되고 더 복잡 할 수 있습니다.

우리는 모듈을 꽤 오랫동안 타협했습니다. 그리고 DPDK (커널에서 더 많은 네트워킹 기능을 이동)와 같은 것들을 계속하고 있습니다. 코어가 많을수록 잠금을 피하는 것이 중요합니다. 더 많은 것들이 사용자 공간으로 이동하고 커널이 줄어들 것입니다.

모 놀리 식 커널 만이 유일한 해결책은 아닙니다. 일부 아키텍처에서는 커널 / 사용자 공간 경계가 다른 함수 호출보다 비싸지 않으므로 마이크로 커널이 매력적입니다.


1
"일부 아키텍처에서는 커널 / 사용자 공간 경계가 다른 함수 호출보다 비싸지 않습니다"-흥미 롭습니다! 어떤 아키텍처가 될까요? 최소한 어떤 종류의 메모리 보호를 포기하지 않으면 엄청나게 어려워 보입니다.
Voo

1
나는 Ivan Goddard의 millcomputing.com 비디오 (밀 / 벨트 CPU, 매우 VLIW와 같은)를 모두 살펴 보았습니다. 이 특별한 주장은 중심 주제이며 보안 비디오를 얻을 때까지 그 의미는 명확하지 않습니다. 시뮬레이션의 POC 아키텍처이지만이 속성을 가진 유일한 아키텍처는 아닙니다.
Rob

1
아 그 설명입니다. 내 경험상 (그리고 나는 업계를 밀접하게 따르지 않는다는 것을 처음으로 인정할 것입니다) 많은 시뮬레이션 된 아키텍처가 있으며 고무가 도로에 닿 자마자 주장에 부응하는 사람은 거의 없습니다. 실제 하드웨어에서. 배후의 아이디어는 어떤 경우에도 흥미로울 수 있지만 특정 CPU가 처음 언급 된 것은 아닙니다. 이 속성이있는 기존 아키텍처를 찾으면 정말 흥미로울 것입니다.
Voo

1
BTW 여기에 당신이 언급 한 토론에 대한 더 많은 자료가 있습니다 : en.wikipedia.org/wiki/Tanenbaum%E2%80%93Torvalds_debate
Jonathan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.