Tại sao nhân Linux có hơn 15 triệu dòng mã? [đóng cửa]


109

Nội dung của cơ sở mã nguyên khối này là gì?

Tôi hiểu hỗ trợ kiến ​​trúc bộ xử lý, bảo mật và ảo hóa, nhưng tôi không thể tưởng tượng rằng có hơn 600.000 dòng hoặc hơn thế.

Các trình điều khiển lý do lịch sử và hiện tại được bao gồm trong cơ sở mã hạt nhân là gì?

15+ triệu dòng đó có bao gồm mọi trình điều khiển duy nhất cho mọi phần cứng bao giờ không? Nếu vậy, điều đó đặt ra câu hỏi, tại sao các trình điều khiển được nhúng trong kernel và không tách rời các gói được tự động phát hiện và cài đặt từ ID phần cứng?

Có phải kích thước của cơ sở mã là một vấn đề đối với các thiết bị bị hạn chế lưu trữ hoặc bị hạn chế bộ nhớ?

Có vẻ như nó sẽ làm tăng kích thước hạt nhân cho các thiết bị ARM bị giới hạn không gian nếu tất cả những thứ đó được nhúng. Có rất nhiều dòng bị loại bỏ bởi bộ tiền xử lý? Gọi tôi là điên, nhưng tôi không thể tưởng tượng một cỗ máy cần nhiều logic đó để chạy những gì tôi hiểu là vai trò của hạt nhân.

Có bằng chứng nào cho thấy kích thước sẽ là một vấn đề trong hơn 50 năm do bản chất dường như ngày càng phát triển của nó?

Bao gồm các trình điều khiển có nghĩa là nó sẽ phát triển khi phần cứng được thực hiện.

EDIT : Đối với những người nghĩ rằng đây là bản chất của hạt nhân, sau một số nghiên cứu tôi nhận ra nó không phải lúc nào cũng vậy. Một hạt nhân không bắt buộc phải lớn như vậy, vì microkernel Mach của Carnegie Mellon đã được liệt kê như một ví dụ 'thường dưới 10.000 dòng mã'


9
Trở lại năm 2012, nó đã có hơn 5 triệu dòng chỉ dành cho trình điều khiển. 1,9 triệu dòng để hỗ trợ các kiến ​​trúc bộ xử lý khác nhau. Thêm thông tin h-online.com/open/features/ từ
steve

11
Có, tôi đã mã hóa trình biên dịch, trình phân tích từ vựng và trình tạo mã byte cho một ngôn ngữ và nó đã được hoàn thành cộng với đệ quy và nó không mất 10.000 dòng.
Jonathan

5
(nhìn vào nó bây giờ, nó là khoảng 2.700 dòng)
Jonathan

4
Bạn nên tải xuống và định cấu hình make menuconfigđể xem có thể bật / tắt bao nhiêu mã trước khi xây dựng.
casey

6
@JonathanLeaders: Tôi đã thực hiện các trình biên dịch hoàn chỉnh cho LISP như các ngôn ngữ trong chưa đầy 100 dòng, với các chương trình thử nghiệm hiển thị Mandelbrots. Luôn luôn phụ thuộc.
phresnel

Câu trả lời:


43

Trình điều khiển được duy trì trong kernel, do đó, khi thay đổi kernel yêu cầu tìm kiếm và thay thế toàn cầu (hoặc tìm kiếm và sửa đổi bằng tay) cho tất cả người dùng chức năng, người đó sẽ thực hiện thay đổi. Có trình điều khiển của bạn được cập nhật bởi những người thực hiện thay đổi API là một lợi thế rất tốt, thay vì phải tự làm điều đó khi nó không biên dịch trên kernel gần đây hơn.

Thay thế (đó là những gì xảy ra đối với các trình điều khiển được duy trì ngoài cây), là bản vá phải được đồng bộ hóa lại bởi các nhà bảo trì của nó để theo kịp bất kỳ thay đổi nào.

Một cuộc tìm kiếm nhanh đã tạo ra một cuộc tranh luận về sự phát triển trình điều khiển trong cây và ngoài cây .

Cách Linux được duy trì chủ yếu bằng cách giữ mọi thứ trong repo dòng chính. Việc xây dựng các hạt nhân nhỏ xuống được hỗ trợ bởi các tùy chọn cấu hình để điều khiển #ifdefs. Vì vậy, bạn hoàn toàn có thể xây dựng các hạt nhân tước nhỏ, chỉ biên dịch một phần nhỏ của mã trong toàn bộ repo.

Việc sử dụng rộng rãi Linux trong các hệ thống nhúng đã dẫn đến sự hỗ trợ tốt hơn cho việc loại bỏ mọi thứ so với Linux trước đó khi cây nguồn nhỏ hơn. Một hạt nhân 4.0 siêu tối thiểu có lẽ nhỏ hơn một hạt nhân 2.4.0 siêu tối thiểu.


4
Bây giờ NÀY có ý nghĩa với tôi về lý do tại sao nó hợp lý khi có tất cả các mã với nhau, nó tiết kiệm thời gian của con người với chi phí tài nguyên máy tính và phụ thuộc quá mức.
Jonathan

8
@JonathanLeaders: yeah, nó tránh bit-rot cho trình điều khiển với bảo trì không hoạt động nhiều. Có lẽ cũng hữu ích khi có tất cả mã trình điều khiển xung quanh khi xem xét các thay đổi cốt lõi. Tìm kiếm trên tất cả người gọi một số API nội bộ có thể bật trình điều khiển bằng cách sử dụng nó theo cách bạn không nghĩ tới, có khả năng ảnh hưởng đến thay đổi mà bạn đang nghĩ đến.
Peter Cordes

1
@JonathanLeaders xuất hiện trên xd, như thể các dòng bổ sung đó chiếm nhiều không gian hơn, trong các phép đo hiện đại về việc cài đặt nó trên máy tính.
Junaga

3
@Junaga: bạn nhận ra linux rất di động và có thể mở rộng, phải không? Việc lãng phí 1 MB bộ nhớ kernel được sử dụng vĩnh viễn trên hệ thống nhúng 32 MB là một vấn đề lớn. Kích thước mã nguồn không quan trọng, nhưng kích thước nhị phân được biên dịch vẫn quan trọng. Bộ nhớ kernel không được phân trang, vì vậy ngay cả với không gian trao đổi, bạn không thể lấy lại được.
Peter Cordes

1
@Rolf: Nó lớn, nhưng nó không phải là mì spaghetti. Hiện tại nó được kiến ​​trúc khá tốt mà không phụ thuộc 2 chiều qua lại giữa mã lõi và trình điều khiển. Trình điều khiển có thể bị bỏ lại mà không phá vỡ nhân lõi. Khi một chức năng nội bộ hoặc API được tái cấu trúc để trình điều khiển cần sử dụng nó khác nhau, trình điều khiển có thể cần thay đổi, nhưng đó là bình thường để tái cấu trúc.
Peter Cordes

79

Theo cloc chạy với 3.13, Linux có khoảng 12 triệu dòng mã.

  • 7 triệu LỘC trong trình điều khiển /
  • 2 triệu LỘC trong vòm /
  • chỉ 139 nghìn LỘC trong kernel /

lsmod | wc trên máy tính xách tay Debian của tôi hiển thị 158 mô-đun được tải khi chạy, do đó, tải mô-đun động là cách hỗ trợ phần cứng được sử dụng tốt.

Hệ thống cấu hình mạnh mẽ (ví dụ make menuconfig) được sử dụng để chọn mã nào sẽ biên dịch (và hơn thế nữa theo điểm của bạn, mã nào không biên dịch). Các hệ thống nhúng xác định .configtệp riêng của chúng chỉ với sự hỗ trợ phần cứng mà chúng quan tâm (bao gồm hỗ trợ phần cứng tích hợp vào kernel hoặc dưới dạng các mô-đun có thể tải).


3
đếm các mô-đun là không đủ, rất nhiều có thể được xây dựng bởi cấu hình
Alex

5
Tôi nghĩ từ điều này, chúng ta có thể kết luận nhân Linux rất lớn bởi vì nó hỗ trợ tất cả các loại cấu hình thiết bị, không phải vì nó quá phức tạp. Chúng tôi thấy ở đây rất ít trong số 15m dòng thực sự được sử dụng. Mặc dù, gần như tất cả mọi thứ, nó có thể quá phức tạp, ít nhất chúng ta có thể ngủ vào ban đêm khi biết điều đó nằm trong lý do
Jonathan

2
@JonathanLeaders: Có - và cũng như các mô-đun cho các thiết bị lạ, có các mô-đun cho các hệ thống tệp tối nghĩa, giao thức mạng, v.v ...
psmears 17/8/2015

6
@JonathanLeader Tôi nhớ khi Linux khởi động - ngay cả khi trình cài đặt hoạt động (nếu nó thậm chí có trình cài đặt!) Là một nỗi đau lớn - vẫn còn một số phân phối mà bạn phải chọn trình điều khiển chuột bằng tay. Làm cho mọi thứ như kết nối mạng hoặc, thần cấm, cửa sổ X, công việc, là một nghi thức của đoạn văn. Trong lần cài đặt Red Hat đầu tiên của tôi, tôi đã phải viết trình điều khiển đồ họa của riêng mình, vì chỉ có ba trình điều khiển (!) Có sẵn. Có các cơ sở hoạt động theo mặc định là một dấu hiệu của sự trưởng thành - và rõ ràng, bạn có thể đủ khả năng điều chỉnh nhiều hơn trên một hệ thống nhúng, trong đó chỉ có một vài kết hợp CTNH.
Luaan

2
@JonathanLeaders Theo tôi nghĩ bạn đã nhận ra, LỘC trong nguồn ít nhiều không liên quan. Nếu bạn muốn biết kernel sử dụng bao nhiêu bộ nhớ thì có nhiều cách trực tiếp hơn .
goldilocks

67

Đối với bất kỳ ai tò mò, đây là bảng phân tích linecount cho gương 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đóng góp cho rất nhiều linecount.


19
Nó thật thú vị. Thậm chí thú vị hơn là các điểm yếu tiềm tàng trong mã, nơi các lập trình viên đã cảm thấy khó chịu:grep -Pir "\x66\x75\x63\x6b" /usr/src/linux/ | wc -l
jimmij

4
@jimmij '\ x73 \ x68 \ x69 \ x74' có thể phổ biến hơn theo nghiên cứu đột phá này (nếu hơi đề ngày) .
Nick T

3
Thực tế ngẫu nhiên: thư mục gần hơn với 600 000 LỘC được OP ước tính là tài liệu.
Davidmh

1
./documentationCó hơn 500.000 dòng mã? ....gì?
C_B

1
@drewbenn Tôi hiểu nó nhiều hơn vì "tài liệu không trống?"
Izkata

43

Các câu trả lời cho đến nay dường như là "có rất nhiều mã" và không ai giải quyết câu hỏi bằng câu trả lời hợp lý nhất: 15M +? VẬY THÌ SAO? 15M dòng mã nguồn có liên quan gì đến giá cá? Điều gì làm cho điều này rất không thể tưởng tượng?

Linux rõ ràng làm rất nhiều. Nhiều hơn bất cứ điều gì khác ... Nhưng một số điểm của bạn cho thấy bạn không tôn trọng những gì đang xảy ra khi nó được xây dựng và sử dụng.

  • Không phải tất cả mọi thứ được biên soạn. Hệ thống xây dựng Kernel cho phép bạn nhanh chóng xác định các cấu hình chọn bộ mã nguồn. Một số là thử nghiệm, một số là cũ, một số không cần thiết cho mọi hệ thống. Nhìn vào /boot/config-$(uname -r)(trên Ubuntu) make menuconfigvà bạn sẽ thấy số lượng được loại trừ.

    Và đó là một phân phối máy tính để bàn biến mục tiêu. Cấu hình cho một hệ thống nhúng sẽ chỉ kéo theo những thứ nó cần.

  • Không phải mọi thứ đều được tích hợp sẵn. Trong cấu hình của tôi, hầu hết các tính năng Kernel được xây dựng dưới dạng các mô-đun:

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

    Để rõ ràng, tất cả những thứ này có thể được tích hợp ... Giống như chúng có thể được in ra và làm thành một chiếc bánh sandwich giấy khổng lồ. Nó sẽ không có ý nghĩa trừ khi bạn đang thực hiện một bản dựng tùy chỉnh cho một công việc phần cứng riêng biệt (trong trường hợp đó, bạn đã giới hạn số lượng các mục này rồi).

  • Các mô-đun được tải động. Ngay cả khi một hệ thống có sẵn hàng ngàn mô-đun, hệ thống sẽ cho phép bạn tải chỉ những thứ bạn cần. So sánh kết quả đầu ra của:

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

    Hầu như không có gì được tải.

  • Microkernels không giống nhau. Chỉ cần 10 giây nhìn vào hình ảnh hàng đầu đến trang Wikipedia mà bạn liên kết sẽ làm nổi bật chúng được thiết kế theo một cách hoàn toàn khác.

    Trình điều khiển Linux được nội bộ hóa (chủ yếu là các mô-đun được tải động), không phải không gian người dùng và các hệ thống tệp tương tự như bên trong. Tại sao điều đó tồi tệ hơn việc sử dụng trình điều khiển bên ngoài? Tại sao vi mô tốt hơn cho tính toán mục đích chung?


Các ý kiến ​​một lần nữa nhấn mạnh bạn không nhận được nó. Nếu bạn muốn triển khai Linux trên phần cứng riêng biệt (ví dụ: hàng không vũ trụ, TiVo, máy tính bảng, v.v.), bạn định cấu hình nó để chỉ xây dựng các trình điều khiển bạn cần . Bạn có thể làm tương tự trên máy tính để bàn của bạn với make localmodconfig. Bạn kết thúc với một bản dựng Kernel cho mục đích nhỏ bé với độ linh hoạt bằng không.

Đối với các bản phân phối như Ubuntu, một gói Kernel 40 MB duy nhất được chấp nhận. Không, chà rằng, nó thực sự thích hợp hơn với kịch bản lưu trữ và tải xuống khổng lồ giữ hơn 4000 mô-đun nổi như các gói. Nó sử dụng ít không gian đĩa hơn cho họ, dễ dàng đóng gói hơn trong thời gian biên dịch, dễ lưu trữ hơn và tốt hơn cho người dùng của họ (những người có một hệ thống chỉ hoạt động).

Tương lai dường như cũng không phải là một vấn đề. Tốc độ của CPU, mật độ ổ đĩa / giá cả và cải thiện băng thông dường như nhanh hơn nhiều so với sự tăng trưởng của Kernel. Gói hạt nhân 200 MB trong 10 năm sẽ không phải là kết thúc nếu thế giới.

Đó cũng không phải là con đường một chiều. Mã sẽ bị loại nếu nó không được duy trì.


2
Mối quan tâm chủ yếu là cho các hệ thống nhúng. Như bạn thấy, bạn có 4.000 mô-đun không được sử dụng trên hệ thống của riêng bạn. Trong một số ứng dụng robot hoặc hàng không vũ trụ nhỏ, (ĐỌC: không phải điện toán cho mục đích chung), đây sẽ là sự lãng phí không thể chấp nhận được.
Jonathan

2
@JonathanLeaders Tôi nghĩ bạn có thể xóa chúng một cách an toàn. Khi cài đặt máy tính để bàn, chúng ở đó trong trường hợp bạn đột nhiên cắm thứ gì đó vào cổng usb hoặc thay đổi một số cấu hình phần cứng, v.v.
Didier A.

1
Đúng chính xác. Tôi vẫn còn ngạc nhiên với các giả định như "bạn có thể cắm thiết bị USB bất cứ lúc nào do đó chúng tôi cần 15m dòng mã" được viết ở cấp hạt nhân chứ không phải ở cấp độ phân phối, xem như Linux được sử dụng trong điện thoại và nhiều loại khác nhau thiết bị nhúng. Vâng, tôi đoán distro làm tiêu hủy danh sách trên riêng của nó. Tôi chỉ nghĩ rằng hỗ trợ cho khả năng cắm phải là phụ gia và không trừ, IE một bản phân phối sẽ loại 'chọn tham gia' bằng cách thêm các nguồn gói, trái ngược với cấu hình ARM nhúng cho hạt nhân là một phần trăm kích thước hiện tại của nó
Jonathan

5
@JonathanLeaders bạn sẽ không bao giờ chạy kernel được cấu hình cho máy tính để bàn trên hệ thống nhúng. Hệ thống nhúng của chúng tôi có 13 mô-đun và đã xóa tất cả các hỗ trợ phần cứng mà chúng tôi không cần (cùng với nhiều tùy chỉnh khác). Dừng so sánh Máy tính để bàn với các hệ thống nhúng. Linux hoạt động tốt vì nó hỗ trợ mọi thứ và có thể được tùy chỉnh để chỉ bao gồm những gì bạn quan tâm. Và những mô-đun 4k đó thực sự tuyệt vời trên các hệ thống máy tính để bàn: khi máy tính xách tay cuối cùng của tôi chết, tôi chỉ cần đặt ổ cứng vào một máy tính xách tay mới hơn nhiều và mọi thứ chỉ hoạt động .
drewbenn

3
Câu trả lời tốt / có giá trị này phải chịu một giọng điệu giận dữ và chiến đấu rõ rệt. -1.
TypeIA

19

Linux tinyconfig tổng hợp các nguồn nguồn biểu đồ bong bóng tinyconfig svg (fiddle)

shell script để tạo json từ bản dựng kernel, sử dụng với http://bl.ocks.org/mbostock/4063269


Chỉnh sửa : hóa ra unifdefcó một số giới hạn ( -Ibị bỏ qua và -includekhông được hỗ trợ, cái sau được sử dụng để bao gồm tiêu đề cấu hình được tạo) tại thời điểm này bằng cách sử dụng catkhông thay đổi nhiều:

274692 total # (was 274686)

kịch bản và thủ tục cập nhật.


Bên cạnh trình điều khiển, vòm, vv có rất nhiều mã có điều kiện được biên dịch hay không tùy thuộc vào cấu hình đã chọn, mã không nhất thiết phải trong các mô-đun được tải động mà được xây dựng trong lõi.

Vì vậy, đã tải xuống các nguồn linux-4.1.6 , chọn tinyconfig , nó không kích hoạt các mô-đun và tôi thực sự không biết nó kích hoạt cái gì hoặc người dùng có thể làm gì với nó khi chạy, dù sao, hãy cấu hình kernel:

# tinyconfig      - Configure the tiniest possible kernel
make tinyconfig

xây dựng hạt nhân

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

quá trình xây dựng kernel để lại các tệp ẩn được gọi *.cmdbằng dòng lệnh cũng được sử dụng để xây dựng .ocác tệp, để xử lý các tệp đó và trích xuất mục tiêu và phụ thuộc sao chép script.shbên dưới và sử dụng nó với find :

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

điều này tạo ra một bản sao cho mỗi phụ thuộc của mục tiêu .ođược đặt tên.o.c

mã .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 tiêu đề (khử trùng)

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 rất vui khi làm việc với nó, vui mừng vì ai đó thích nó
Alex

9

Sự đánh đổi của các hạt nhân nguyên khối đã được tranh luận giữa Tananbaum và Torvalds ngay từ đầu. Nếu bạn không cần phải xâm nhập vào không gian người dùng cho mọi thứ, thì giao diện với kernel có thể đơn giản hơn. Nếu kernel là nguyên khối, thì nó có thể được tối ưu hóa hơn (và lộn xộn hơn!) Trong nội bộ.

Chúng tôi đã có các mô-đun như một sự thỏa hiệp trong một thời gian khá dài. Và nó đang tiếp tục với những thứ như DPDK (chuyển nhiều chức năng mạng ra khỏi kernel). Càng nhiều lõi được thêm vào, điều quan trọng hơn là tránh khóa; vì vậy nhiều thứ sẽ di chuyển vào không gian người dùng và kernel sẽ co lại.

Lưu ý rằng hạt nhân nguyên khối không phải là giải pháp duy nhất. Trên một số kiến ​​trúc, ranh giới kernel / không gian người dùng không đắt hơn bất kỳ lệnh gọi chức năng nào khác, làm cho microkernels hấp dẫn.


1
"Trên một số kiến ​​trúc, ranh giới kernel / không gian người dùng không đắt hơn bất kỳ lệnh gọi chức năng nào khác" - thật thú vị! Kiến trúc đó sẽ là gì? Trông cực kỳ khó tháo gỡ nếu bạn không từ bỏ bất kỳ loại bảo vệ bộ nhớ nào.
Voo

1
Tôi đã xem qua tất cả các video millcomputing.com của Ivan Goddard (cpu mill / vành đai, rất giống VLIW). Yêu cầu đặc biệt này là một chủ đề trung tâm và ý nghĩa của nó không rõ ràng cho đến khi bạn nhận được video bảo mật. Đây là một kiến ​​trúc POC trong mô phỏng, nhưng có lẽ nó không phải là kiến ​​trúc duy nhất có thuộc tính này.
Cướp

1
Ah điều đó giải thích nó. Theo kinh nghiệm của tôi (và tôi sẽ là người đầu tiên thừa nhận rằng tôi không theo sát ngành này), có rất nhiều kiến ​​trúc mô phỏng và một số ít sống theo yêu cầu của họ ngay khi cao su chạm đường, tức là họ đã đặt trên phần cứng thực sự. Mặc dù ý tưởng đằng sau nó có thể thú vị trong mọi trường hợp - không phải lần đầu tiên CPU cụ thể được đề cập. Nếu bạn từng tìm thấy một kiến ​​trúc hiện có có thuộc tính này, tôi sẽ thực sự thích thú.
Voo

1
BTW ở đây có nhiều tài nguyên hơn về cuộc tranh luận mà bạn đã đề cập: en.wikipedia.org/wiki/Tanenbaum%E2%80%93Torvalds_debate
Jonathan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.