ทำไมการจัดการเหตุการณ์ของระบบปฏิบัติการบางระบบจึงเขียนด้วย asm แทนที่จะเป็น c


17

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


5
"ส่วนใหญ่ใน c" - และเดาว่าส่วนที่เหลือคืออะไร? ;)
goldilocks

@ goldilocks ดีมันอยู่ในการชุมนุม แต่ทำไมในขณะที่ส่วนอื่น ๆ อยู่ใน c?
MAKZ

4
ฉันไม่มีความเชี่ยวชาญ แต่มีฮาร์ดแวร์ระดับต่ำที่เกี่ยวข้องกับสิ่งที่ไม่สามารถทำได้ใน C; สิ่งเหล่านี้มักเป็นสถาปัตยกรรมเฉพาะ "Inline ASM" มักจะใช้ในรหัส C สำหรับวัตถุประสงค์นั้นเช่นfoobar()จะมีการกำหนดโดยใช้การประกอบแบบอินไลน์ทางเดียวบนแพลตฟอร์มเดียวและอีกวิธีหนึ่งในอีกวิธีหนึ่ง สิ่งนี้ทำให้การใช้ asm ให้น้อยที่สุด แต่ก็ไม่สามารถหลีกเลี่ยงได้อย่างสมบูรณ์
goldilocks

คุณตั้งค่า Global Descriptor Table Pointer register ใน C ได้อย่างไร?
253751

คำตอบ:


24

ภาษาย่อการเข้าถึง CPU register และระบบปฏิบัติการเมื่อจัดการเหตุการณ์ต้องบันทึกบริบทดังนั้นจึงจำเป็นต้องเข้าถึง register ที่จุดของเหตุการณ์จึงทำลาย C spec


นี่คือเหตุผลหลักที่แท้จริง คอมไพเลอร์ C แบบฝังบางตัวมีส่วนขยายที่อนุญาตให้ทำการลงทะเบียน (โดยปกติจะผ่านค่าคงที่ / ตัวแปรโกลบอลที่ประกาศไว้ล่วงหน้า) พวกเขาสามารถทำได้เพราะพวกเขากำหนดเป้าหมายเพียงหนึ่งสถาปัตยกรรม แต่คอมไพเลอร์ C วัตถุประสงค์ทั่วไปกำหนดเป้าหมายสถาปัตยกรรมที่แตกต่างกันมากเกินไปเพื่อให้ส่วนขยายดังกล่าวสมเหตุสมผล ดังนั้นพวกเขาจึงมักจะใช้กลไกการฝัง asm (นอกจากนั้นจะทำให้พวกเขาไม่ได้มาตรฐาน)
slebetman

18

C เป็นนามธรรมจากรหัสเครื่องที่ทำงานบนเครื่อง (แม้ว่าจะใกล้กว่าภาษาอื่น ๆ )

สำหรับผู้ที่งบรหัสเครื่องสิ่งที่ไม่สามารถแสดงออกใน C, และอาจจะเพื่อเพิ่มประสิทธิภาพพิเศษไม่ได้ให้คอมไพเลอร์ C การชุมนุมจะใช้เวลาส่วนใหญ่อยู่ในรูปแบบของแอสเซมอินไลน์

ในแผนผังซอร์สโค้ดของเคอร์เนลสิ่งนี้จะถูกเก็บไว้ภายใต้arch/<arch>และinclude/asm-<arch>ตำแหน่งที่<arch>มีชื่อสถาปัตยกรรมเฉพาะ จริงๆแล้วมันเป็นเพียงส่วนเล็ก ๆ ของเคอร์เนลที่สมบูรณ์


6

คุณไม่สามารถทำได้ใน C :)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

กำลังพยายามเข้าสู่โหมดป้องกัน x86 เห็นได้ชัดว่าฉันยังสามารถทำได้ใน C โดย "เปล่ง" รหัสเครื่องดิบ แต่ในกรณีที่ฉันต้องการเข้าถึง offets ที่แม่นยำ - ฉันโชคไม่ดี

ตัวอย่างที่สองคือ BootLoader ในระบบ x86 จำเป็นต้องใช้รหัสการบูตแบบดั้งเดิมที่มีความยาว 512 ไบต์และสองไบต์สุดท้ายต้องเป็น 0xAA และ 0x55 (หรือ 55 AA อย่างแน่นอน) ตามลำดับ ... การทำให้มั่นใจว่าคอมไพเลอร์ C เป็นฝันร้ายและแอสเซมเบลอร์ งานในวิธีที่ยอดเยี่ยม

มีอีกหลายกรณีเช่นนี้ที่แอสเซมบลีไม่ได้เป็นที่นิยมเพียงอย่างเดียว - แต่เป็นวิธีการเดียวเท่านั้น


-5

asm มีขนาดเล็กลงและโดยทั่วไปจะเร็วกว่า C มากที่เต็มไปด้วยไลบรารี ฯลฯ และ OS ก็จัดการกับเหตุการณ์จำนวนมากตลอดเวลา คุณต้องการความบางและรวดเร็วสำหรับฟังก์ชั่นนี้


2
การเพิ่มประสิทธิภาพเทคโนโลยีคอมไพเลอร์ C ได้กลายเป็นสิ่งที่ดีงาม มันเป็นตำนานที่ว่า asm น่าจะเร็วกว่า C มากในกรณีใด ๆ ก็ตามนั่นไม่ใช่เหตุผลที่การปฏิบัติการของระบบปฏิบัติการระดับต่ำใช้ asm ส่วนใหญ่จะทำอย่างไรกับการดำเนินงานที่ไม่สามารถแสดงออกใน C เช่นอุปสรรคหน่วยความจำและลงทะเบียนเต้นรำสำหรับการประชุมเรียกร้องที่ไม่ใช่ C, ฯลฯ ...
Celada
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.