Làm thế nào để nhân Linux có thể tự biên dịch?


88

Tôi không hiểu rõ quá trình biên dịch của nhân Linux khi tôi cài đặt hệ thống Linux trên máy của mình.

Đây là một số điều khiến tôi bối rối:

  1. Kernel được viết bằng C, tuy nhiên làm thế nào để kernel được biên dịch mà không cần cài đặt trình biên dịch?
  2. Nếu trình biên dịch C được cài đặt trên máy của tôi trước khi biên dịch hạt nhân, thì làm cách nào để trình biên dịch tự biên dịch mà không cần cài đặt trình biên dịch?

Tôi đã rất bối rối trong một vài ngày, cảm ơn vì đã phản hồi.


Theo như những gì được biết thì trình biên dịch C được viết bằng một số kiểu lừa bịp bởi một số người điên rồ và thông minh tại phòng thí nghiệm AT&T để biên dịch UNIX cho một máy tính nhất định (xin lưu ý rằng lịch sử bắt nguồn từ UNIX, không phải linux, vì vậy tôi sợ bạn bỏ lỡ một chương ... hoặc một vài trong số chúng!). Điều ngắn gọn là không cần phải viết lại nhân unix cho các máy tính khác nhau miễn là các máy tính đó có một trình biên dịch thích hợp cho ngôn ngữ C. Các trình biên dịch đó được viết bằng trình giả lập cụ thể của các máy tính mục tiêu. Câu nói thô thiển "Trình biên dịch đầu tiên được viết bằng assambler của máy tính nhất định, sau đó UNIX được viết bằng C"
Victor

Câu trả lời:


208

Vòng nhị phân đầu tiên cho hộp Linux của bạn được xây dựng trên một số hộp Linux khác (có thể là vậy).

Các mã nhị phân cho hệ thống Linux đầu tiên được xây dựng trên một số nền tảng khác .

Các mã nhị phân cho máy tính đó có thể theo dõi gốc của chúng trở lại hệ thống ban đầu được xây dựng trên một nền tảng khác .

...

Đẩy đủ xa và bạn sẽ thấy các trình biên dịch được xây dựng bằng các công cụ thô sơ hơn, lần lượt được xây dựng trên các máy khác với máy chủ của chúng.

...

Tiếp tục đẩy và bạn thấy các máy tính được chế tạo để có thể nhập các hướng dẫn của chúng bằng cách đặt các công tắc trên bảng điều khiển phía trước của máy .

Những thứ rất tuyệt.

Quy tắc là "xây dựng các công cụ để xây dựng các công cụ để xây dựng các công cụ ...". Rất giống các công cụ chạy môi trường vật lý của chúng ta. Còn được gọi là "kéo bản thân lên bằng chiến dịch khởi động".


3
Không nhất thiết là ô uế. Chỉ cần không được tối ưu hóa. trình biên dịch đầu tiên sẽ được chọn để hoạt động trên 386, nhưng phiên bản đã được biên dịch lại được chọn cho bất kỳ kiến ​​trúc nào bạn có.
Breton

1
Bạn có thể thêm giai đoạn thứ ba, nếu mọi thứ ổn thì đầu ra của giai đoạn thứ hai phải bằng đầu ra của giai đoạn thứ ba.
Ismael

27
Nó không chỉ là phần mềm, mà là phần cứng. Không thể có bất cứ thứ gì như P4 (hoặc thậm chí 486) có thể được tạo ra mà không có máy tính.
BCS

1
@BCS: Ồ, vâng. Chúng tôi đã đạt đến điểm là phần mềm và các công cụ phần cứng được liên kết sâu sắc và phụ thuộc lẫn nhau.
dmckee --- ex-moderator kitten

4
"Một hệ thống phức tạp hoạt động luôn được phát hiện là đã phát triển từ một hệ thống đơn giản đã hoạt động." vi.wikipedia.org/wiki/Gall's_law
ajuc

33

Tôi nghĩ bạn nên phân biệt giữa:

compile , v: Để sử dụng trình biên dịch để xử lý mã nguồn và tạo ra mã thực thi [1] .

install , v: Để kết nối, thiết lập hoặc chuẩn bị thứ gì đó để sử dụng [2] .

Biên dịch tạo ra các tệp thực thi nhị phân từ mã nguồn. Việc cài đặt chỉ đặt các tệp thực thi nhị phân đó vào đúng vị trí để chạy chúng sau này. Vì vậy, cài đặt và sử dụng không yêu cầu biên dịch nếu có sẵn các tệp nhị phân. Tương ứng, hãy nghĩ về “biên dịch” và “cài đặt” như về “nấu” và “phục vụ”.

Bây giờ, câu hỏi của bạn:

  1. Kernel được viết bằng C, tuy nhiên làm thế nào để kernel được biên dịch mà không cần cài đặt trình biên dịch?

Hạt nhân không thể được biên dịch mà không có trình biên dịch, nhưng nó có thể được cài đặt từ một tệp nhị phân đã biên dịch.

Thông thường, khi bạn cài đặt một hệ điều hành, bạn cài đặt một nhân được biên dịch trước (tệp thực thi nhị phân). Nó được biên dịch bởi một người khác. Và chỉ khi bạn muốn tự biên dịch hạt nhân, bạn cần nguồn và trình biên dịch, và tất cả các công cụ khác.

Ngay cả trong các bản phân phối "dựa trên nguồn" như gentoo, bạn bắt đầu chạy một tệp nhị phân đã biên dịch.

Vì vậy, bạn có thể sống cả đời mà không cần biên dịch hạt nhân, bởi vì bạn đã có người khác biên dịch chúng.

  1. Nếu trình biên dịch C được cài đặt trên máy của tôi trước khi biên dịch hạt nhân, thì làm cách nào để trình biên dịch tự biên dịch mà không cần cài đặt trình biên dịch?

Không thể chạy trình biên dịch nếu không có nhân (HĐH). Vì vậy, người ta phải cài đặt một nhân đã biên dịch để chạy trình biên dịch, nhưng không cần phải tự biên dịch nhân.

Một lần nữa, cách thực hành phổ biến nhất là cài đặt các tệp nhị phân đã biên dịch của trình biên dịch và sử dụng chúng để biên dịch bất kỳ thứ gì khác (bao gồm chính trình biên dịch và hạt nhân).

Bây giờ, vấn đề gà và trứng. Bản nhị phân đầu tiên được biên dịch bởi người khác ... Xem câu trả lời xuất sắc của dmckee.


14

Thuật ngữ mô tả hiện tượng này là bootstrapping , đó là một khái niệm thú vị để đọc tiếp. Nếu bạn nghĩ về phát triển nhúng, rõ ràng là rất nhiều thiết bị, chẳng hạn như đồng hồ báo thức, lò vi sóng, điều khiển từ xa, yêu cầu phần mềm không đủ mạnh để biên dịch phần mềm của riêng chúng. Trên thực tế, các loại thiết bị này thường không có đủ tài nguyên để chạy bất cứ thứ gì từ xa phức tạp như một trình biên dịch.

Phần mềm của họ được phát triển trên máy tính để bàn và sau đó được sao chép khi nó được biên dịch.

Nếu điều này làm bạn hứng thú, thì một bài báo tôi nghĩ ra ngay trong đầu tôi là: Những phản ánh về Sự tin cậy ( pdf ), đây là một cuốn sách kinh điển và thú vị.


1
Bạn đang nhầm lẫn giữa biên dịch chéo với bootstrapping. Đầu tiên liên quan đến một trình biên dịch chỉ tồn tại trên PC và tạo ra các mã quang cho kiến ​​trúc đích. Rõ ràng, bạn không thể làm điều đó nếu không có máy tính khác, vì vậy sẽ có một tình huống khó xử giữa con gà và quả trứng. Câu trả lời cho tình huống khó xử là bootstrapping, nơi một trình biên dịch đơn giản viết tay hoặc có sẵn được sử dụng để tạo ra một trình biên dịch phức tạp hơn.
Kevin Vermeer

12

Kernel không tự biên dịch - nó được biên dịch bởi trình biên dịch C trong không gian người dùng. Trong hầu hết các kiến ​​trúc CPU, CPU có một số bit trong các thanh ghi đặc biệt đại diện cho những đặc quyền mà mã hiện đang chạy có. Trong x86, đây là các bit mức đặc quyền hiện tại (CPL) trong thanh ghi đoạn mã (CS). Nếu các bit CPL là 00, mã được cho là đang chạy trong vòng bảo mật 0 , còn được gọi là chế độ hạt nhân . Nếu các bit CPL là 11, mã được cho là đang chạy trong vòng bảo mật 3 , còn được gọi là chế độ người dùng . Hai tổ hợp còn lại, 01 và 10 (vòng bảo mật 1 và 2 tương ứng) hiếm khi được sử dụng.

Các quy tắc về những gì mã có thể và không thể làm trong chế độ người dùng so với chế độ hạt nhân là khá phức tạp, nhưng đủ để nói rằng chế độ người dùng đã giảm đặc quyền nghiêm trọng.

Bây giờ, khi mọi người nói về hạt nhân của một hệ điều hành, họ đang đề cập đến các phần mã của hệ điều hành có thể chạy ở chế độ hạt nhân với các đặc quyền nâng cao. Nói chung, các tác giả hạt nhân cố gắng giữ hạt nhân càng nhỏ càng tốt vì lý do bảo mật, để mã không cần thêm đặc quyền sẽ không có chúng.

Trình biên dịch C là một ví dụ về chương trình như vậy - nó không cần thêm các đặc quyền do chế độ hạt nhân cung cấp, vì vậy nó chạy ở chế độ người dùng, giống như hầu hết các chương trình khác.

Trong trường hợp của Linux, hạt nhân bao gồm hai phần: mã nguồn của hạt nhân và phần thực thi được biên dịch của hạt nhân. Bất kỳ máy nào có trình biên dịch C đều có thể biên dịch hạt nhân từ mã nguồn thành ảnh nhị phân. Sau đó, câu hỏi là phải làm gì với hình ảnh nhị phân đó.

Khi bạn cài đặt Linux trên một hệ thống mới, bạn đang cài đặt một hình ảnh nhị phân được biên dịch trước, thường từ phương tiện vật lý (chẳng hạn như đĩa CD DVD) hoặc từ mạng. BIOS sẽ tải (hình ảnh nhị phân của bộ nạp khởi động của hạt nhân) từ phương tiện hoặc mạng, và sau đó bộ nạp khởi động sẽ cài đặt (ảnh nhị phân của hạt nhân) vào đĩa cứng của bạn. Sau đó, khi bạn khởi động lại, BIOS sẽ tải bộ nạp khởi động của hạt nhân từ đĩa cứng của bạn và bộ nạp khởi động sẽ tải hạt nhân vào bộ nhớ và bạn tắt máy và chạy.

Nếu bạn muốn biên dịch lại hạt nhân của riêng mình, điều đó hơi phức tạp hơn một chút, nhưng có thể thực hiện được.


5

Cái nào đã có trước? Con gà hay quả trứng?

Trứng đã có từ thời khủng long ..

..một số nhầm lẫn mọi thứ khi nói rằng gà thực sự là hậu duệ của những con thú lớn .. truyện dài: Công nghệ (Trứng) đã tồn tại trước khi có Sản phẩm hiện tại (Gà)

Bạn cần một hạt nhân để xây dựng một hạt nhân, tức là bạn xây dựng cái này với cái kia.

Kernel đầu tiên có thể là bất cứ thứ gì bạn muốn (tốt nhất là thứ hợp lý có thể tạo ra sản phẩm cuối cùng mong muốn của bạn ^ __ ^)

Hướng dẫn này từ Bran's Kernel Development dạy bạn phát triển và xây dựng một kernel nhỏ, sau đó bạn có thể kiểm tra bằng Máy ảo mà bạn chọn.

Có nghĩa là: bạn viết và biên dịch hạt nhân ở một nơi nào đó và đọc nó trên một máy ảo trống (không có hệ điều hành).

Điều gì xảy ra với những bản cài đặt Linux đó cũng theo cùng một ý tưởng với sự phức tạp hơn.


5

Nó không phải là con rùa tất cả các cách xuống. Giống như bạn nói, bạn không thể biên dịch một hệ điều hành chưa từng được biên dịch trước đó trên hệ thống đang chạy hệ điều hành đó. Tương tự, ít nhất bản dựng đầu tiên của một trình biên dịch phải được thực hiện trên một trình biên dịch khác (và thường là một số bản dựng tiếp theo cũng vậy, nếu bản dựng đầu tiên đó hóa ra vẫn chưa thể biên dịch mã nguồn của chính nó).

Tôi nghĩ rằng các hạt nhân Linux đầu tiên đã được biên dịch trên một hộp Minix, mặc dù tôi không chắc chắn về điều đó. GCC đã có sẵn vào thời điểm đó. Một trong những mục tiêu ban đầu của nhiều hệ điều hành là chạy một trình biên dịch đủ tốt để biên dịch mã nguồn của riêng chúng. Đi xa hơn, trình biên dịch đầu tiên gần như chắc chắn được viết bằng hợp ngữ. Những người lắp ráp đầu tiên được viết bởi những người nghèo, những người phải viết bằng mã máy thô.

Bạn có thể muốn xem dự án Linux From Scratch . Bạn thực sự xây dựng hai hệ thống trong cuốn sách: "hệ thống tạm thời" được xây dựng trên hệ thống mà bạn không tự xây dựng và sau đó là "hệ thống LFS" được xây dựng trên hệ thống tạm thời của bạn. Cách cuốn sách hiện đang được viết, bạn thực sự xây dựng hệ thống tạm thời trên một hộp Linux khác, nhưng về lý thuyết, bạn có thể điều chỉnh nó để xây dựng hệ thống tạm thời trên một hệ điều hành hoàn toàn khác.


1

Nếu tôi hiểu câu hỏi của bạn một cách chính xác. Ngày nay, nhân không "tự biên dịch". Hầu hết các bản phân phối Linux ngày nay đều cung cấp cài đặt hệ thống thông qua một cd trực tiếp linux. Kernel được tải từ CD vào bộ nhớ và hoạt động bình thường như thể nó được cài đặt vào đĩa. Với một môi trường linux được thiết lập và chạy trên hệ thống của bạn, thật dễ dàng chỉ cần commit các tệp cần thiết vào đĩa của bạn.

Nếu bạn đang nói về vấn đề bootstrapping; dmckee tóm lại nó khá hay.

Chỉ đưa ra một khả năng khác ...

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.