Ngôn ngữ lập trình nào được sử dụng để viết chương trình BIOS?


65

Theo tôi hiểu, mã BIOS / dòng bit được giữ trong ROM phải chung chung (hoạt động cùng với nhiều loại CPU hoặc ISA). Ngoài ra, tôi thấy được đề cập trên web rằng có thể kết xuất mã của nó (và "tháo rời" nó).

Vì vậy, trong ngôn ngữ, tập lệnh hoặc mã máy được viết? Nó không cần bất kỳ loại bộ xử lý để thực hiện các hoạt động của nó? Nếu vậy, tôi đoán rằng nó sẽ sử dụng CPU bên ngoài, vậy làm thế nào để biết tập lệnh cụ thể của bộ được sử dụng?

Có lẽ nó có một bộ xử lý nội bộ?


9
bản sao có thể của Máy tính làm việc như thế nào?
gnat

39
Hội Chữ thập niêm yết là xấu đủ, nhưng khi nó kết thúc lên trên Hỏi Mạng nóng trong cả hai phiên bản , đó chỉ là vượt quá nhạt ...
Mason Wheeler

8
"Mã BIOS / dòng bit được giữ trong ROM phải chung chung (hoạt động cùng với nhiều loại CPU hoặc ISA)." - Tôi chưa bao giờ nghe nói về một BIOS hoạt động với nhiều ISA. Bạn có một ví dụ?
chx

6
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). Tôi sẽ nói "Không, ngược lại"
edc65

11
Đây thậm chí không phải là một bản sao của một câu hỏi chung chung như "Máy tính hoạt động như thế nào?". Xin đừng đóng như dupe.
Andres F.

Câu trả lời:


103

Các BIOS được sử dụng để viết riêng bằng ngôn ngữ lắp ráp, nhưng quá trình chuyển đổi đã được thực hiện từ lâu để viết phần lớn mã bằng một số ngôn ngữ cấp cao hơn và để lại được viết thành cụm càng ít càng tốt, tốt nhất là chỉ có bootstrapper, (vài trăm hướng dẫn đầu tiên mà CPU nhảy tới sau khi bắt đầu / thiết lập lại) và bất kỳ thói quen nào xử lý các yêu cầu cụ thể của kiến ​​trúc cơ bản.

BIOS đã được viết chủ yếu bằng C ngay từ đầu những năm 1990. (Tôi đã viết một BIOS ở 90% C, lắp ráp 10% vào đầu những năm 1990.)

Điều cũng đã giúp rất nhiều theo hướng này là:

  • Các thư viện C nhắm vào một kiến ​​trúc cụ thể và bao gồm các hàm để xử lý các đặc thù của kiến ​​trúc đó, ví dụ, các hàm để đọc / ghi byte đến / từ các cổng I / O của kiến ​​trúc x86. Microsoft C luôn cung cấp các chức năng thư viện cho loại công cụ đó.

  • Trình biên dịch C không chỉ nhắm mục tiêu vào kiến ​​trúc CPU cụ thể mà thậm chí còn cung cấp các phần mở rộng cho ngôn ngữ C mà bạn có thể sử dụng để viết mã sử dụng các tính năng CPU đặc biệt. Ví dụ, kiến ​​trúc x86 hỗ trợ những thứ được gọi là ngắt, gọi các thường trình được gọi là trình xử lý ngắt và nó yêu cầu chúng phải có các chuỗi lệnh nhập / xuất đặc biệt. Ngay từ những ngày đầu, Microsoft C đã hỗ trợ các từ khóa đặc biệt mà bạn có thể sử dụng để đánh dấu một chức năng là một trình xử lý ngắt, do đó, nó có thể được gọi trực tiếp bởi một ngắt CPU, do đó bạn không phải viết bất kỳ cụm từ nào cho nó.

Ngày nay tôi cho rằng hầu hết các BIOS được viết bằng C ++, nếu không phải bằng bất kỳ ngôn ngữ cấp cao nào.

Phần lớn mã tạo ra BIOS là dành riêng cho phần cứng cơ bản, do đó, nó không thực sự cần phải di động: nó được đảm bảo rằng nó sẽ luôn chạy trên cùng loại CPU. CPU có thể phát triển, nhưng miễn là nó duy trì khả năng tương thích ngược với các phiên bản trước, nó vẫn có thể chạy BIOS không được sửa đổi. Ngoài ra, bạn luôn có thể biên dịch lại các phần của BIOS được viết bằng C để chạy tự nhiên trên bất kỳ CPU mới nào xuất hiện, nếu có nhu cầu.

Lý do tại sao chúng tôi viết BIOS bằng các ngôn ngữ ở cấp độ cao hơn lắp ráp là vì việc viết chúng theo cách này dễ dàng hơn, không phải vì chúng thực sự cần phải di động.


7
Đúng. Đôi khi, bạn thậm chí có thể có một bo mạch chủ bị ràng buộc không chỉ với một kiến ​​trúc CPU cụ thể, mà ngay cả với một nhà cung cấp CPU cụ thể. Ngày nay, bạn có thể mua bo mạch chủ x86 chỉ tương thích với CPU Intel x86 hoặc bo mạch chủ x86 chỉ tương thích với CPU AMD x86. BIOS trong các bo mạch chủ này sẽ giống hệt nhau ở mức độ lớn, vì trong cả hai trường hợp, CPU đều hiểu tập lệnh x86 và hầu hết các thiết bị ngoại vi đều giống hệt nhau, nhưng một số thiết bị ngoại vi có sự khác biệt mà BIOS phải tính đến.
Mike Nakis

4
@Reflection hãy xem xét kỹ xem bo mạch chủ trông như thế nào. Ổ cắm CPU sẽ có một sự sắp xếp pin nhất định, dành riêng cho họ CPU mà nó chấp nhận. Về mặt vật lý, bạn không thể kết nối Intel P4 với bo mạch chủ AMD Opteron
Caleth

14
Thuật ngữ "BIOS" dùng để chỉ "Hệ thống đầu vào / đầu ra cơ bản" của PC, do đó, có BIOS bao hàm CPU x86. Các hệ thống IA64 có EFI thay vì BIOS, các hệ thống PowerPC có thể có hệ thống Firmware mở hoặc hệ thống độc quyền, các hệ thống Sparc cũng có OFW (hay đúng hơn là OpenBoot), OLPC X0 là hệ thống dựa trên x86 sử dụng OFW. Ngay cả các PC không sử dụng BIOS nữa, chúng đã chuyển sang (U) EFI. OB / OFW rất thú vị, bởi vì nó được thiết kế để không chỉ di động mà còn đa nền tảng. Trình điều khiển OFW sẽ hoạt động trên bất kỳ hệ thống OFW nào , chúng là "Viết một lần chạy mọi nơi", bất kể CPU CPU.
Jörg W Mittag

14
"Ngày nay tôi sẽ cho rằng hầu hết BIOS được viết bằng C ++" Tôi không nhất thiết phải cho rằng, Điều đó có thể đúng nhưng tôi làm việc trong ngành đó và chắc chắn nhiều bộ tải khởi động được viết đơn giản C. Những người viết loại đó những thứ thường là "Old Guard" và có xu hướng không hoàn toàn tin tưởng C ++.
Sam

6
@TomDworzanski: Mặc dù về mặt kỹ thuật không phải là BIOS (chỉ dành riêng cho PC cũ 1981), nhiều triển khai của Firmware mở IEEE-1275 (được sử dụng cho vai trò tương tự như BIOS trên Sparc, Nền tảng tham khảo phần cứng chung của PowerPC (ví dụ PowerMac, PowerBook), máy tính xách tay 100 đô la OLPC X0-1) được viết một phần bằng các ngôn ngữ khác ngoài lắp ráp / C. OpenBoot , Open Firmware , OpenBIOS đều có chứa
Jörg W Mittag

11

Mặc dù về lý thuyết, người ta có thể viết BIOS bằng bất kỳ ngôn ngữ nào, nhưng thực tế hiện đại là hầu hết BIOS được viết bằng cách sử dụng hội, C hoặc kết hợp cả hai .

BIOS phải được viết bằng ngôn ngữ có thể biên dịch thành mã máy , được hiểu bởi máy phần cứng vật lý. Điều này giúp loại bỏ các ngôn ngữ được dịch trực tiếp hoặc trung gian ly (Perl, Python, PHP, Ruby, Java, C #, JavaScript, v.v.) là phù hợp để viết BIOS. (Mặc dù, về mặt lý thuyết, người ta có thể triển khai một trong những ngôn ngữ này để biên dịch trực tiếp thành mã máy tĩnh hoặc bằng cách nào đó có thể nhúng trình thông dịch vào BIOS. Ví dụ, có dự án GCJ từ bỏ phần mềm cho Java.)

Hầu hết các OEM triển khai BIOS bằng cách mở rộng các triển khai BIOS chung, độc quyền của các công ty như MegatrendsPhoenix Techology của Mỹ . (Bạn có thể đã thấy một trong những công ty được hiển thị trên màn hình khởi động đầu tiên của máy tính trước đó.) Mã nguồn cho các triển khai này không có sẵn công khai, nhưng một số công ty đã bị rò rỉ. Tôi không muốn liên kết trực tiếp đến mã nguồn C và mã nguồn lắp ráp này, nhưng có những nơi trên Internet nơi mã nguồn này được thảo luận cho những ai quan tâm.

Một số nhà sản xuất phần cứng, như những người nhắm vào thị trường trò chơi và hiệu năng cao, đã bão hòa việc triển khai BIOS của họ với các tính năng tùy chỉnh, số liệu thống kê và giao diện người dùng hấp dẫn được thiết kế để triển khai chính xác. Nhiều tính năng trong số này vượt xa những gì được cung cấp trong các sản phẩm chung được sản xuất bởi Megatrends của Mỹ và các sản phẩm khác. Thật không may, các công ty này thường xem việc phát hành mã nguồn của họ là một rủi ro bảo mật , vì vậy rất ít thông tin về các triển khai cao cấp này vì rất ít chia sẻ về chúng. Tất nhiên người ta có thể tìm cách truy cập và biên dịch các triển khai BIOS như vậy nhưng làm như vậy có thể khó khăn và có thể là bất hợp pháp.

Quay trở lại câu hỏi ban đầu, vì nhu cầu sản xuất mã máy gốc, BIOS sẽ phải được thực hiện bằng ngôn ngữ lập trình được hỗ trợ bởi trình biên dịch mã máy gốc . Mặc dù có nhiều ngôn ngữ như vậy và trong khi tôi chắc chắn trong vài thập kỷ qua, một số ngôn ngữ đã được sử dụng trong thử nghiệm, mọi triển khai BIOS mở tôi đều có thể tìm thấy cụ thể dựa trên sự kết hợp giữa C và / hoặc lắp ráp. Các triển khai BIOS có nguồn mở mà tôi đã xem xét để hình thành kết luận này bao gồm OpenBIOS , tinyBIOS , coreboot , Intel BIOSLibreboot. Tôi cũng đã xem xét một số triển khai BIOS rất cũ không liên quan ngày hôm nay nhưng cũng tuân theo quy tắc C và / hoặc lắp ráp.

Tôi nghĩ cũng có liên quan để xem xét các phần mềm khác được xây dựng để tương tác trực tiếp với phần cứng. Ví dụ, chúng ta biết rằng Linux Kernel , kernel OS Xkernel Windows phần lớn là C với một số phần lắp ráp và một số ngôn ngữ cấp cao hơn cho các tác vụ cụ thể. Chúng tôi cũng biết rằng trình điều khiển phần cứng trên Linuxtrình điều khiển phần cứng trên Windows được viết chủ yếu bằng C.

Quay trở lại BIOS, tôi nghĩ điều quan trọng là phải xem xét tính kinh tế của ngôn ngữ lập trình đã chọn. BIOS thường được viết như là một điều cần thiết để bổ sung cho doanh số phần cứng. Các hệ thống BIOS hiện đại được biết đến phần lớn được viết bằng C và / hoặc lắp ráp. Việc chuyển sang một số công cụ khác sẽ thêm chi phí đáng kể vào những gì thường được coi là sản phẩm hàng hóa có thể ảnh hưởng xấu đến doanh số bán hàng. Không cần vào Kinh tế 101, tôi có thể đảm bảo với bạn rằng có lẽ nó không xứng đáng với một OEM để đi chệch khỏi các công cụ đã thử và đã được chứng minh qua nhiều thập kỷ.

Tất nhiên, cũng có và sẽ có các dự án sở thích để viết BIOS. Những điều này cũng vậy, cho đến nay, dường như đang chọn C và / hoặc lắp ráp. Có lẽ một ngày nào đó các công nghệ khác sẽ được sử dụng. Nhưng ngày nay, sự lựa chọn được xác định rõ.


4
Đó là một chút chọn lọc nit nhưng C # và Java không được giải thích. Họ biên dịch thành mã byte. Đó là mã byte sau đó được xử lý bởi một trình thông dịch. Không thay đổi logic của đoạn đầu tiên.
Tonny

1
@Tonny Đúng vậy. Tôi đã thêm "trực tiếp hoặc trung gian-ly diễn giải" để rõ ràng hơn một chút.

@Tonny thường là một jitter chứ không phải là một trình thông dịch, đó là một sự khác biệt quan trọng bởi vì có thể sử dụng trước tất cả để tạo ra bản gốc miễn là các kỹ thuật động nhất định không được sử dụng. Vì vậy, về mặt lý thuyết là có thể viết BIOS bằng ngôn ngữ .NET hoặc Java, nếu ai đó đã làm cả hai điều đó và đảm bảo tất cả các hỗ trợ thời gian cần thiết đều khả dụng. Tôi tưởng tượng những nỗ lực làm điều đó sẽ nhiều hơn bất kỳ sự tiện lợi nào được tìm thấy mặc dù.
Jon Hanna

1
@Tonny Trên thực tế, C # biên dịch thành mã gốc msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx vì vậy thật lạ khi thấy nó trong danh sách các ngôn ngữ yếu / động.
Den

@Den C # thường không được biên dịch thành mã gốc. Sản phẩm .Net Native này mà bạn liên kết chưa được phát hành chính thức. Từ những gì tôi đã đọc, nó sẽ biên dịch mã ứng dụng và mã khung yêu cầu thành một tệp thực thi. Theo FAQ, điều này sẽ được nhắm mục tiêu vào các ứng dụng Windows Store ban đầu, vì vậy có thể mất một thời gian để điều này được hỗ trợ rộng rãi hơn. Tất cả những gì đang được nói, có vẻ như Microsoft có thể rời khỏi mô hình máy ảo một thời gian trong tương lai nếu mọi việc suôn sẻ.

4

BIOS thực tế cho máy tính sẽ được viết bằng một số ngôn ngữ (có thể là C hoặc lắp ráp) được biên dịch theo mã nhị phân phụ thuộc kiến ​​trúc; mã này không thể chạy trên bất kỳ kiến ​​trúc nào khác (và có thể không thực sự cần thiết, vì nó đã rất cụ thể đối với máy được vận chuyển).

Nhưng bạn có thể nghĩ về ROM tùy chọn (đôi khi được gọi là BIOS, như trong "Video BIOS" cho ROM tùy chọn GPU) không?

Đối với các ROM tùy chọn tương thích BIOS thực tế, chúng có thể là mã thực thi phụ thuộc vào ISA (được tạo lại bởi bất kỳ ngôn ngữ nào có thể được biên dịch để nhắm mục tiêu kiến ​​trúc mong muốn); PCI cũng cho phép bao gồm mã cho nhiều ISA và cho phép máy chủ chọn hình ảnh nhị phân phù hợp trong quá trình khởi động.

Đối với ROM tùy chọn tương thích UEFI, cũng có một định dạng mã byte độc ​​lập với kiến ​​trúc có thể chạy trên các kiến ​​trúc khác nhau, nhưng vẫn có thể sử dụng mã phụ thuộc vào ISA.

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.