ภาษาการเขียนโปรแกรมใดที่ใช้ในการเขียนโปรแกรม BIOS


65

ตามที่ฉันเข้าใจรหัส BIOS / บิตสตรีมที่เก็บไว้ใน ROM ควรเป็นแบบทั่วไป (ทำงานร่วมกับหลายประเภท CPU หรือ ISAs) นอกจากนี้ฉันเห็นบนเว็บว่าเป็นไปได้ที่จะทิ้งโค้ดของมัน (และ "แยกส่วน" มัน)

ดังนั้นในภาษาชุดคำสั่งหรือรหัสเครื่องที่เขียน? ไม่ต้องการตัวประมวลผลใด ๆ เพื่อดำเนินการหรือไม่ ถ้าเป็นเช่นนั้นฉันเดาว่ามันจะใช้ซีพียูภายนอกแล้วจะรู้ได้อย่างไรว่าชุดคำสั่งเฉพาะของชุดที่ใช้

อาจมีโปรเซสเซอร์ภายในหรือไม่


9
ความเป็นไปได้ที่ซ้ำกันของคอมพิวเตอร์ทำงานอย่างไร
ริ้น

39
การโพสต์ไขว้นั้นไม่ดีพอ แต่เมื่อมันจบลงที่คำถามเครือข่ายที่น่าสนใจในทั้งสองรุ่นนั่นเป็นเรื่องที่ไม่น่าสนใจเลย ...
Mason Wheeler

8
"รหัสไบออส / บิตสตรีมที่อยู่ใน ROM ควรเป็นแบบทั่วไป (ทำงานควบคู่กับ CPU หลายประเภทหรือ ISAs)" - ฉันไม่เคยได้ยินเกี่ยวกับ BIOS ที่ใช้งานได้กับ ISAs หลายตัว คุณมีตัวอย่างหรือไม่
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). ฉันจะบอกว่า "ไม่ได้ตรงกันข้าม"
edc65

11
นี่ไม่ใช่แม้แต่คำถามที่ซ้ำกันจากระยะไกลโดยทั่วไปว่าเป็น "คอมพิวเตอร์ทำงานอย่างไร" โปรดอย่าปิดเป็นผู้ล่อลวง
Andres F.

คำตอบ:


103

ไบออสเคยเขียนด้วยภาษาแอสเซมบลีเป็นพิเศษ แต่การเปลี่ยนแปลงได้ทำมานานแล้วในการเขียนโค้ดส่วนใหญ่ในภาษาระดับสูงกว่าบางภาษาและปล่อยให้การเขียนในแอสเซมบลีน้อยที่สุด (สองสามร้อยแรกของคำสั่งที่ซีพียูข้ามไปหลังจากเริ่มต้น / รีเซ็ต) และสิ่งที่รูทีนจัดการกับนิสัยแปลก ๆ ของสถาปัตยกรรมพื้นฐาน

ไบออสนั้นส่วนใหญ่จะเขียนเป็นภาษาซีในช่วงต้นยุคต้น ๆ (ฉันเขียน BIOS ใน 90% C, 10% การชุมนุมในยุคต้น ๆ )

สิ่งที่ช่วยได้อย่างมากในทิศทางนี้คือ:

  • ไลบรารี C ที่กำหนดเป้าหมายสถาปัตยกรรมเฉพาะและรวมถึงฟังก์ชั่นสำหรับจัดการกับลักษณะเฉพาะของสถาปัตยกรรมนั้นเช่นฟังก์ชันสำหรับการอ่าน / เขียนไบต์ไปยัง / จากพอร์ต I / O ของสถาปัตยกรรม x86 Microsoft C ได้เสนอฟังก์ชั่นห้องสมุดให้กับสิ่งนั้น ๆ เสมอ

  • คอมไพเลอร์ C ที่ไม่เพียง แต่กำหนดเป้าหมายสถาปัตยกรรมซีพียูที่เฉพาะเจาะจงเท่านั้น แต่ยังเสนอส่วนขยายให้กับภาษา C ที่คุณสามารถใช้เพื่อเขียนโค้ดซึ่งใช้ประโยชน์จากคุณสมบัติพิเศษของ CPU ตัวอย่างเช่นสถาปัตยกรรม x86 สนับสนุนสิ่งต่าง ๆ ที่รู้จักกันในชื่ออินเตอร์รัปต์ซึ่งเรียกใช้รูทีนที่รู้จักในชื่อตัวจัดการขัดจังหวะและมันต้องการให้มีลำดับการเข้า / ออกพิเศษ จากวันแรก ๆ Microsoft C สนับสนุนคำหลักพิเศษที่คุณสามารถใช้เพื่อทำเครื่องหมายฟังก์ชันเป็นตัวจัดการขัดจังหวะดังนั้นจึงสามารถเรียกใช้งานได้โดยตรงโดยการขัดจังหวะของ CPU ดังนั้นคุณจึงไม่ต้องเขียนชุดประกอบใด ๆ

ทุกวันนี้ฉันคิดว่า BIOS ส่วนใหญ่เขียนด้วยภาษา C ++ ถ้าไม่ได้ใช้ภาษาระดับสูงกว่านี้

โค้ดส่วนใหญ่ที่ประกอบขึ้นเป็นไบออสนั้นมีความเฉพาะเจาะจงกับฮาร์ดแวร์ที่อยู่ข้างล่างดังนั้นจึงไม่จำเป็นต้องพกพาจริงๆ: รับประกันได้ว่ามันจะทำงานบนซีพียูชนิดเดียวกันเสมอ CPU อาจมีวิวัฒนาการ แต่ตราบใดที่ยังคงรักษาความเข้ากันได้ย้อนหลังกับรุ่นก่อนหน้านั้นก็ยังสามารถเรียกใช้ BIOS ที่ไม่ได้แก้ไข นอกจากนี้คุณยังสามารถคอมไพล์ส่วนต่าง ๆ ของ BIOS ที่เขียนใน C เพื่อรันบน CPU ใหม่ใด ๆ ที่เกิดขึ้นหากต้องการ

เหตุผลที่เราเขียน BIOSes ในภาษาระดับสูงกว่าชุดประกอบก็เพราะง่ายต่อการเขียนด้วยวิธีนี้ไม่ใช่เพราะต้องพกพาจริงๆ


7
ใช่. บางครั้งคุณอาจมีเมนบอร์ดที่ผูกไว้ไม่เพียง แต่กับสถาปัตยกรรม CPU ที่เฉพาะเจาะจง แต่ยังกับผู้ขาย CPU ที่เฉพาะเจาะจง ทุกวันนี้คุณสามารถซื้อมาเธอร์บอร์ด x86 ซึ่งรองรับเฉพาะซีพียู Intel x86 หรือมาเธอร์บอร์ด x86 ซึ่งรองรับเฉพาะกับ AMD x86 ซีพียูเท่านั้น BIOS ในมาเธอร์บอร์ดเหล่านี้จะมีขนาดเท่ากันเนื่องจากทั้งสองกรณี CPU เข้าใจชุดคำสั่ง x86 และอุปกรณ์ต่อพ่วงส่วนใหญ่เหมือนกัน แต่อุปกรณ์ต่อพ่วงบางตัวมีความแตกต่างกันซึ่ง BIOS นั้นต้องคำนึงถึง
Mike Nakis

4
@Reflection ลองดูว่าเมนบอร์ดมีลักษณะอย่างไร ซ็อกเก็ตซีพียูจะมีการจัดเรียงพินซึ่งเป็นลักษณะเฉพาะสำหรับตระกูลของซีพียูที่รับได้ คุณร่างกายไม่สามารถเชื่อมต่อพูด Intel P4 เพื่อเมนบอร์ด AMD Opteron
Caleth

14
คำว่า "BIOS" หมายถึง "ระบบอินพุต / เอาท์พุตพื้นฐาน" ของพีซีดังนั้นการมี BIOS หมายถึงซีพียู x86 ระบบ IA64 มี EFI แทน BIOS, PowerPC ระบบอาจมีระบบ Open Firmware หรือระบบกรรมสิทธิ์ Sparc ยังมี OFW (หรือมากกว่า OpenBoot) OLPC X0 เป็นระบบที่ใช้ x86 ซึ่งใช้ OFW แม้พีซีจะไม่ใช้ไบออสอีกต่อไป แต่ก็เปลี่ยนเป็น (U) EFI OB / OFW เป็นสิ่งที่น่าสนใจเพราะมันถูกออกแบบมาเพื่อไม่เพียง แต่จะพกพา แต่ข้ามแพลตฟอร์ม ไดรเวอร์ OFW จะทำงานบนระบบ OFW ใด ๆพวกเขาคือ "เขียนเมื่อเรียกใช้ทุกที่" โดยไม่คำนึงถึง CPU ISA
Jörg W Mittag

14
"ทุกวันนี้ฉันจะสันนิษฐานว่า BIOS ส่วนใหญ่เขียนด้วย C ++" ฉันไม่จำเป็นต้องคิดว่ามันอาจจะเป็นจริง แต่ฉันทำงานในอุตสาหกรรมนั้นและแน่นอนว่าบูตโหลดเดอร์จำนวนมากนั้นเขียนด้วยธรรมดา C คนที่เขียนแบบนั้น ของสิ่งต่าง ๆ มักจะเป็น "Old Guard" และมักจะไม่ไว้ใจ C ++ อย่างเต็มที่
แซม

6
@TomDworzanski: ในขณะที่ในทางเทคนิคไม่ใช่ BIOS (ซึ่งอ้างถึงเฉพาะเครื่องพีซี 1981), การใช้งานหลายอย่างของ IEEE-1275 Open Firmware (ซึ่งใช้สำหรับบทบาทที่คล้ายกันกับ BIOS บน Sparc, แพลตฟอร์ม PowerPC Common Hardware Reference (เช่น PowerMac, PowerBook), แล็ปท็อป 100 $ OLPC X0-1) ถูกเขียนบางส่วนในภาษาอื่นที่ไม่ใช่ภาษาแอสเซมบลี / C OpenBoot , เปิดเฟิร์มแวร์ , OpenBIOSทั้งหมดมี ...
Jörg W Mittag

11

ในขณะที่ในทางทฤษฎีหนึ่งสามารถเขียน BIOS ในภาษาใด ๆ ที่ความเป็นจริงที่ทันสมัยเป็นBIOS มากที่สุดคือการเขียนโดยใช้สภา, C, หรือการรวมกันของทั้งสอง

ต้องเขียน BIOS ในภาษาที่สามารถคอมไพล์ไปยังรหัสเครื่องซึ่งเป็นที่เข้าใจกันโดยเครื่องฮาร์ดแวร์ทางกายภาพ สิ่งนี้จะกำจัดภาษาที่แปลโดยตรงหรือระดับกลาง (Perl, Python, PHP, Ruby, Java, C #, JavaScript, ฯลฯ ) ตามความเหมาะสมสำหรับการเขียน BIOS (แม้ว่าในทางทฤษฎีแล้วเราสามารถใช้ภาษาใดภาษาหนึ่งเหล่านี้เพื่อรวบรวมโดยตรงกับรหัสเครื่องแบบคงที่หรืออย่างใดอย่างหนึ่งสามารถฝังล่ามใน BIOS อย่างใดอย่างหนึ่งเช่นโครงการทอดทิ้งแวร์จีซีจีสำหรับ Java)

OEMs ส่วนใหญ่ใช้ไบออสโดยการขยายที่เป็นกรรมสิทธิ์ของการใช้งานทั่วไป BIOS โดย บริษัท เช่นอเมริกัน Megatrendsและฟีนิกซ์ Techologies (คุณอาจเคยเห็นหนึ่งใน บริษัท เหล่านั้นปรากฏบนหน้าจอบูตครั้งแรกของคอมพิวเตอร์ก่อนหน้านี้) ซอร์สโค้ดสำหรับการใช้งานเหล่านี้ไม่สามารถใช้งานได้แบบสาธารณะ แต่บาง บริษัท ก็รั่วไหลออกมา ฉันไม่ต้องการที่จะเชื่อมโยงโดยตรงกับ C และรหัสแหล่งประกอบ แต่มีสถานที่บนอินเทอร์เน็ตที่กล่าวถึงซอร์สโค้ดนี้สำหรับผู้ที่สนใจที่จะมอง

ผู้ผลิตฮาร์ดแวร์บางรายเช่นผู้ที่กำหนดเป้าหมายไปยังตลาดที่มีประสิทธิภาพสูงและเล่นเกมทำให้การใช้งานไบออสของพวกเขาอิ่มตัวด้วยคุณสมบัติการปรับแต่งสถิติและอินเทอร์เฟซผู้ใช้ที่น่าดึงดูดซึ่งออกแบบมาสำหรับการใช้งานที่แน่นอน คุณสมบัติเหล่านี้มากมายนอกเหนือจากที่เสนอในผลิตภัณฑ์ทั่วไปที่ผลิตโดย American Megatrends และอื่น ๆ น่าเสียดายที่ บริษัท เหล่านี้มักจะเห็นการเปิดเผยซอร์สโค้ดของตนว่าเป็นความเสี่ยงด้านความปลอดภัยดังนั้นจึงไม่ค่อยมีใครรู้จักเกี่ยวกับการใช้งานระดับสูงเหล่านี้เพราะมีการแบ่งปันกันเล็กน้อย แน่นอนว่าเราสามารถหาวิธีในการเข้าถึงและยกเลิกการรวบรวมการใช้งานไบออส แต่การทำเช่นนั้นอาจเป็นเรื่องยากและผิดกฎหมาย

จะกลับไปที่คำถามเดิมเพราะความจำเป็นในการผลิตเครื่องรหัสพื้นเมืองไบออสจะต้องถูกนำมาใช้ในการเขียนโปรแกรมภาษาที่สนับสนุนโดยคอมไพเลอร์รหัสเครื่องพื้นเมือง ในขณะที่มีภาษาดังกล่าวจำนวนมากและในขณะที่ฉันแน่ใจในช่วงไม่กี่ทศวรรษที่ผ่านมามีการใช้ภาษาหลายภาษาในการทดลองการใช้งาน BIOS แบบเปิดทุกครั้งที่ฉันสามารถค้นหาได้นั้นขึ้นอยู่กับการผสมผสานระหว่าง C และ / หรือชุดประกอบ การใช้งานไบออสแบบเปิดแหล่งที่มาที่ฉันมองไปที่สร้างข้อสรุปนี้ ได้แก่OpenBIOS , tinyBIOS , coreboot , Intel BIOSและLibreboot. ฉันยังดูที่การใช้ BIOS เก่า ๆ ที่ไม่เกี่ยวข้องในวันนี้ แต่ก็ทำตามกฎ C และ / หรือแอสเซมบลี

ฉันคิดว่ามันเกี่ยวข้องกับการดูซอฟต์แวร์อื่น ๆ ที่สร้างขึ้นเพื่อโต้ตอบโดยตรงกับฮาร์ดแวร์ ตัวอย่างเช่นเรารู้ว่าเคอร์เนล Linux , เคอร์เนลOS Xและเคอร์เนล Windowsส่วนใหญ่เป็น C ที่มีแอสเซมบลีบางส่วนและภาษาระดับสูงกว่าสำหรับงานเฉพาะ เรายังรู้ว่าไดรเวอร์ฮาร์ดแวร์บน Linuxและไดรเวอร์ฮาร์ดแวร์บน Windowsส่วนใหญ่เขียนด้วยภาษาซี

กลับไปที่ BIOS ฉันคิดว่ามันเป็นสิ่งสำคัญเช่นกันในการพิจารณาเศรษฐศาสตร์ของภาษาการเขียนโปรแกรมที่เลือก โดยทั่วไปไบออสเขียนเป็นสิ่งจำเป็นเพื่อเสริมการขายฮาร์ดแวร์ ระบบ BIOS สมัยใหม่เป็นที่รู้จักกันดีว่าส่วนใหญ่เขียนใน C และ / หรือชุดประกอบ การย้ายไปที่เครื่องมืออื่นจะเพิ่มต้นทุนที่สำคัญให้กับสิ่งที่โดยทั่วไปถือว่าเป็นสินค้าโภคภัณฑ์ซึ่งอาจส่งผลเสียต่อยอดขาย หากไม่เข้าสู่เศรษฐศาสตร์ 101 ฉันสามารถรับรองกับคุณได้ว่าอาจไม่คุ้มค่ากับ OEM ที่จะเบี่ยงเบนจากเครื่องมือที่พยายามและเป็นความจริงที่ได้รับการพิสูจน์มานานหลายทศวรรษ

แน่นอนมีและจะเป็นโครงการงานอดิเรกในการเขียนไบออสเช่นกัน สิ่งเหล่านี้ก็ดูเหมือนจะเลือก C และ / หรือการประกอบ บางทีวันหนึ่งเทคโนโลยีอื่น ๆ จะถูกนำมาใช้ แต่วันนี้ทางเลือกของมีความชัดเจน


4
มันเป็นนิด ๆ หน่อย ๆ ของการหยิบ nit แต่ C # และ Java จะไม่ตีความ พวกเขารวบรวมไปยังรหัสไบต์ มันเป็นรหัสไบต์ที่จัดการโดยล่ามแล้ว ไม่เปลี่ยนตรรกะของย่อหน้าแรก
Tonny

1
@Tonny นั่นถูกต้องแล้ว ฉันเพิ่ม "ตีความโดยตรงหรือตรงกลาง" เพื่อให้ชัดเจนขึ้นเล็กน้อย

@Tonny ปกติแล้วจะมีความกระวนกระวายใจมากกว่าล่ามซึ่งเป็นความแตกต่างที่สำคัญเพราะมันเป็นไปได้ที่จะ pre-jit ทั้งหมดเป็นภาษาพื้นเมืองตราบใดที่เทคนิคแบบไดนามิกบางอย่างไม่ได้ใช้ ในทางทฤษฎีแล้วมันอาจเป็นไปได้ที่จะเขียน BIOS ในภาษา. NET หรือ Java ถ้ามีทั้งสองอย่างนั้นและทำให้แน่ใจว่าจำเป็นต้องมีการสนับสนุนรันไทม์ทั้งหมด ฉันจินตนาการถึงความพยายามในการทำสิ่งนั้นมากกว่าจะอำนวยความสะดวกให้กับคนแคระที่พบ
Jon Hanna

1
@Tonny จริงๆแล้ว C # รวบรวมรหัสพื้นเมืองmsdn.microsoft.com/en-us/vstudio/dotnetnative.aspxดังนั้นมันแปลกที่เห็นมันในรายการภาษาอ่อนแอ / ไดนามิก
Den

@Den C # โดยทั่วไปจะไม่ได้รับการคอมไพล์เป็นรหัสพื้นเมือง ผลิตภัณฑ์. Net Native ที่คุณลิงก์ยังไม่ได้เผยแพร่อย่างเป็นทางการ จากสิ่งที่ฉันได้อ่านมันจะรวบรวมรหัสแอปพลิเคชันและรหัสเฟรมเวิร์กที่จำเป็นลงในไฟล์ที่เรียกใช้งานได้ ตามคำถามที่พบบ่อยสิ่งนี้จะถูกกำหนดเป้าหมายที่แอพ Windows Store ในตอนแรกดังนั้นอาจใช้เวลาสักครู่เพื่อให้การสนับสนุนอย่างกว้างขวางยิ่งขึ้น ทั้งหมดที่กล่าวมาดูเหมือนว่า Microsoft อาจย้ายออกจากรุ่นเครื่องเสมือนในอนาคตหากทุกอย่างเป็นไปด้วยดี

4

ไบออสจริงสำหรับคอมพิวเตอร์จะเขียนในบางภาษา (อาจเป็นภาษาซีหรือแอสเซมบลี) ที่ถูกคอมไพล์กับรหัสไบนารี่ที่ขึ้นอยู่กับสถาปัตยกรรม รหัสนี้ไม่สามารถทำงานกับสถาปัตยกรรมอื่น ๆ ได้ (และไม่จำเป็นต้องใช้เนื่องจากเป็นอุปกรณ์ที่มีการจัดส่งแล้ว)

แต่คุณอาจคิดถึงOption ROMs (ซึ่งบางครั้งเรียกว่า BIOSes อย่างเช่นใน "Video BIOS" สำหรับ ROM option GPU)?

สำหรับรอมตัวเลือกที่เข้ากันได้กับ BIOS ตัวจริงอาจเป็นรหัสปฏิบัติการที่ขึ้นกับ ISA (สร้างขึ้นใหม่โดยภาษาใด ๆ ที่สามารถคอมไพล์เพื่อกำหนดเป้าหมายสถาปัตยกรรมที่ต้องการ); PCI ยังอนุญาตให้รวมรหัสสำหรับ ISAs หลายรายการและอนุญาตให้โฮสต์เลือกอิมเมจไบนารีที่เหมาะสมในระหว่างกระบวนการบู๊ต

สำหรับ ROM ตัวเลือกที่เข้ากันได้กับ UEFI นอกจากนี้ยังมีรูปแบบรหัสไบต์อิสระสถาปัตยกรรมที่สามารถเรียกใช้บนสถาปัตยกรรมที่แตกต่างกัน แต่ยังขึ้นอยู่กับรหัส ISA

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.