ฉันเพิ่งรู้ว่าInterrupt
เป็นhardware signal assertion
ที่เกิดในขาประมวลผล แต่ฉันอยากรู้ว่า Linux OS จัดการกับมันอย่างไร
อะไรคือสิ่งที่เกิดขึ้นเมื่อมีการขัดจังหวะ?
ฉันเพิ่งรู้ว่าInterrupt
เป็นhardware signal assertion
ที่เกิดในขาประมวลผล แต่ฉันอยากรู้ว่า Linux OS จัดการกับมันอย่างไร
อะไรคือสิ่งที่เกิดขึ้นเมื่อมีการขัดจังหวะ?
คำตอบ:
นี่คือมุมมองระดับสูงของการประมวลผลระดับต่ำ ฉันกำลังอธิบายถึงสถาปัตยกรรมทั่วไปที่เรียบง่ายสถาปัตยกรรมที่แท้จริงอาจมีความซับซ้อนมากขึ้นหรือแตกต่างกันไปตามวิธีที่ไม่สำคัญในรายละเอียดในระดับนี้
เมื่อมีการขัดจังหวะหน่วยประมวลผลจะตรวจสอบว่ามีการอินเตอร์รัปต์หรือไม่ หากพวกเขาไม่มีอะไรเกิดขึ้นจนกว่าพวกเขาจะไม่เปิดเผย เมื่ออินเทอร์รัปต์ไม่ถูกเปิดใช้งานหากมีอินเตอร์รัปต์ค้างอยู่ตัวประมวลผลจะเลือกหนึ่งตัว
จากนั้นตัวประมวลผลจะดำเนินการขัดจังหวะโดยแยกไปยังที่อยู่เฉพาะในหน่วยความจำ รหัสตามที่อยู่ที่เรียกว่าจัดการขัดจังหวะ เมื่อตัวแยกหน่วยประมวลผลอยู่ที่นั้นจะทำการปิดบังอินเตอร์รัปต์ (ดังนั้นตัวจัดการอินเทอร์รัปต์จะมีการควบคุมแบบเอกสิทธิ์) และบันทึกเนื้อหาของรีจิสเตอร์บางตัวในบางแห่ง (โดยทั่วไปคือรีจิสเตอร์อื่น)
ตัวจัดการขัดจังหวะทำสิ่งที่ต้องทำโดยทั่วไปแล้วโดยการสื่อสารกับอุปกรณ์ต่อพ่วงที่ทริกเกอร์การขัดจังหวะการส่งหรือรับข้อมูล หากอินเทอร์รัปต์ถูกยกขึ้นโดยตัวจับเวลาผู้จัดการอาจทริกเกอร์ตัวกำหนดตารางเวลาระบบปฏิบัติการเพื่อสลับไปยังเธรดอื่น เมื่อตัวจัดการดำเนินการเสร็จสิ้นคำสั่งจะเรียกใช้คำสั่ง return-from-interrupt พิเศษที่คืนค่าการลงทะเบียนและ unmasks อินเตอร์รัปต์
ตัวจัดการขัดจังหวะต้องทำงานอย่างรวดเร็วเพราะมันขัดขวางไม่ให้มีการขัดจังหวะอื่น ๆ ในเคอร์เนล Linux การประมวลผลขัดจังหวะจะถูกแบ่งออกเป็นสองส่วน:
ตามปกติในหัวข้อนี้สำหรับข้อมูลเพิ่มเติมอ่านไดรเวอร์อุปกรณ์ Linux ; บทที่ 10เป็นเรื่องเกี่ยวกับการขัดจังหวะ
Gilles ได้อธิบายกรณีทั่วไปของการขัดจังหวะแล้วสิ่งต่อไปนี้ใช้เฉพาะกับ Linux 2.6 บนสถาปัตยกรรม Intel (บางส่วนเป็นไปตามข้อกำหนดของ Intel)
การขัดจังหวะเป็นเหตุการณ์ที่เปลี่ยนลำดับของคำสั่งที่ดำเนินการโดยโปรเซสเซอร์
การขัดจังหวะมีสองประเภท:
ข้อยกเว้นเกิดจากข้อผิดพลาดในการเขียนโปรแกรม (ข้อผิดพลาด fe Divide , Page Fault , Overflow ) ที่เคอร์เนลต้องจัดการ เขาส่งสัญญาณไปยังโปรแกรมและพยายามกู้คืนจากข้อผิดพลาด
ข้อยกเว้นสองข้อต่อไปนี้ถูกจัดประเภท:
อินเทอร์รัปต์สามารถออกได้โดยอุปกรณ์ I / O (แป้นพิมพ์อะแดปเตอร์เครือข่าย, .. ), ตัวจับเวลาช่วงเวลาและ (ในระบบมัลติโปรเซสเซอร์) CPU อื่น ๆ เมื่อมีการขัดจังหวะเกิดขึ้น CPU จะต้องหยุดคำสั่งปัจจุบันของเขาและดำเนินการขัดจังหวะที่เพิ่งมาถึง เขาต้องการบันทึกสถานะกระบวนการขัดจังหวะเก่าเป็น (อาจ) กลับมาทำงานต่อหลังจากจัดการขัดจังหวะ
การจัดการอินเตอร์รัปต์เป็นงานที่ละเอียดอ่อน:
มีการกำหนดระดับอินเตอร์รัปต์ที่แตกต่างกันสองระดับ:
อุปกรณ์ฮาร์ดแวร์ทุกชิ้นมีบรรทัด Interrupt Request (IRQ) ของตัวเอง IRQ นั้นมีหมายเลขเริ่มต้นจาก 0 สาย IRQ ทั้งหมดเชื่อมต่อกับ Programmable Interrupt Controller (PIC) PIC รับฟัง IRQ และกำหนดให้กับ CPU นอกจากนี้ยังเป็นไปได้ที่จะปิดการใช้งานสาย IRQ ที่เฉพาะเจาะจง
ระบบลอจิกมัลติโพรเซสซิ่งที่ทันสมัยโดยทั่วไปจะรวม Advanced PIC (APIC) ที่ใหม่กว่าซึ่งกระจายการร้องขอ IRQ อย่างเท่าเทียมกันระหว่าง CPU
ขั้นตอนกลางระหว่างการขัดจังหวะหรือข้อยกเว้นและการจัดการมันคือ Interrupt Descriptor Table (IDT) ตารางนี้จะเชื่อมโยงเวกเตอร์ขัดจังหวะหรือข้อยกเว้น (ตัวเลข) แต่ละตัวกับตัวจัดการที่ระบุ ( ข้อผิดพลาด fe Divideได้รับการจัดการโดยฟังก์ชันdivide_error()
)
ผ่าน IDT เคอร์เนลรู้วิธีจัดการขัดจังหวะหรือข้อยกเว้นที่เกิดขึ้นอย่างแน่นอน
ดังนั้นเคอร์เนลจะเกิดอะไรขึ้นเมื่ออินเตอร์รัปต์เกิดขึ้น
VIP
- แฟล็กในแฟล็กการลงทะเบียนหรืออะไร? ขอบคุณล่วงหน้า
แรกของผู้เข้าร่วมทั้งหมดที่เกี่ยวข้องในการจัดการขัดจังหวะเป็นอุปกรณ์ฮาร์ดแวร์ต่อพ่วง, ตัวควบคุมขัดจังหวะ, CPU, เคอร์เนลระบบปฏิบัติการและไดรเวอร์ อุปกรณ์ฮาร์ดแวร์อุปกรณ์ต่อพ่วงมีความรับผิดชอบในการสร้างการขัดจังหวะ พวกเขายืนยันบรรทัดคำขอขัดจังหวะเมื่อพวกเขาต้องการความสนใจจากเคอร์เนลระบบปฏิบัติการ สัญญาณเหล่านี้จะทำหน้าที่มัลติเพล็กซ์โดยตัวควบคุมอินเทอร์รัปต์ซึ่งรับผิดชอบในการรวบรวมสัญญาณอินเทอร์รัปต์ นอกจากนี้ยังรับผิดชอบการกำหนดลำดับการส่งสัญญาณขัดจังหวะที่จะถูกส่งไปยัง CPU ตัวควบคุมอินเทอร์รัปต์สามารถปิดใช้งานอินเทอร์รัปต์คำขอ (IRQL) ชั่วคราวและเปิดใช้งานอีกครั้ง (การปิดบัง IRQL) ตัวควบคุมอินเตอร์รัปต์ส่งคำร้องขออินเตอร์รัปต์ที่รวบรวมไปยัง CPU ตามลำดับ CPU หลังจากดำเนินการตามคำสั่งของ CPU แต่ละคำสั่งเสร็จแล้วจะตรวจสอบว่ามีคำขอขัดจังหวะใด ๆ ที่รออยู่จากตัวควบคุมขัดจังหวะหรือไม่ หาก CPU พบว่ามีคำขอรอและตั้งค่าสถานะ Interrupt Enable ไว้ในการลงทะเบียนการควบคุม CPU ภายใน CPU จะเริ่มต้นการจัดการขัดจังหวะ อย่างที่คุณเห็นโดยการจัดการกับการอินเตอร์รัปต์แฟล็กใน CPU และการสื่อสารกับคอนโทรลเลอร์อินเตอร์รัปต์เคอร์เนล Linux สามารถควบคุมการยอมรับอินเตอร์รัปต์ได้ ตัวอย่างเช่น Linux สามารถปิดใช้งานการยอมรับการขัดจังหวะจากอุปกรณ์เฉพาะหรือปิดใช้งานการยอมรับการขัดจังหวะเลย เคอร์เนล Linux สามารถควบคุมการยอมรับการขัดจังหวะ ตัวอย่างเช่น Linux สามารถปิดใช้งานการยอมรับการขัดจังหวะจากอุปกรณ์เฉพาะหรือปิดใช้งานการยอมรับการขัดจังหวะเลย เคอร์เนล Linux สามารถควบคุมการยอมรับการขัดจังหวะ ตัวอย่างเช่น Linux สามารถปิดใช้งานการยอมรับการขัดจังหวะจากอุปกรณ์เฉพาะหรือปิดใช้งานการยอมรับการขัดจังหวะเลย
จะเกิดอะไรขึ้นเมื่อโปรเซสเซอร์ได้รับคำขอขัดจังหวะ ประการแรก CPU ปิดใช้งานการขัดจังหวะโดยอัตโนมัติโดยการรีเซ็ตการตั้งค่าสถานะขัดจังหวะ พวกเขาจะถูกเปิดใช้งานอีกครั้งเมื่อการจัดการขัดจังหวะจะเสร็จสิ้น ในเวลาเดียวกัน CPU ทำให้จำนวนน้อยที่สุดของงานที่จำเป็นสำหรับการสลับ CPU จากโหมดผู้ใช้ไปยังโหมดเคอร์เนลในลักษณะที่จะช่วยให้มันกลับมาทำงานของรหัสการขัดจังหวะ CPU ให้คำปรึกษากับโครงสร้างการควบคุม CPU พิเศษที่เต็มไปด้วยเคอร์เนล Linux เพื่อค้นหาที่อยู่ของรหัสที่จะถูกส่งผ่านการควบคุม ที่อยู่นี้เป็นที่อยู่ของคำสั่งแรกของตัวจัดการขัดจังหวะซึ่งเป็นส่วนหนึ่งของเคอร์เนล Linux
ในฐานะที่เป็นขั้นตอนแรกของการจัดการเคอร์เนลขัดจังหวะระบุเวกเตอร์ของการขัดจังหวะที่ได้รับเพื่อระบุชนิดของเหตุการณ์ที่เกิดขึ้นในระบบ เวกเตอร์ที่ขัดจังหวะจะกำหนดว่าการกระทำใดที่ Linux จะใช้เพื่อจัดการ ในฐานะที่เป็นขั้นตอนที่สองลินุกซ์บันทึกส่วนที่เหลือของการลงทะเบียน CPU (ซึ่งไม่ได้ถูกบันทึกโดย CPU โดยอัตโนมัติ) และโปรแกรมขัดจังหวะที่อาจถูกนำมาใช้ นี่เป็นการกระทำที่สำคัญมากเพราะช่วยให้ Linux สามารถจัดการกับอินเตอร์รัปต์ได้อย่างโปร่งใสเกี่ยวกับโปรแกรมที่ถูกขัดจังหวะ ในขั้นตอนที่สาม Linux สามารถสลับไปยังโหมดเคอร์เนลได้โดยการตั้งค่าสภาพแวดล้อมเคอร์เนลและการตั้งค่าสถานะ CPU ที่ต้องการ และสุดท้ายเรียกว่า handler ขัดจังหวะเวกเตอร์ (คุณสามารถดูมาโคร BUILD_INTERRUPT3 ใน arch \ x86 \ kernel \ entry_32 S เพื่อคว้ารายละเอียดเพิ่มเติมสำหรับตัวอย่างสถาปัตยกรรมที่เกี่ยวข้องกับ x86) ในกรณีของอุปกรณ์ต่อพ่วงนี่เป็นรูทีน do_IRQ () (ดูที่ส่วนโค้ง \ x86 \ kernel \ irq.c)
handler ขัดจังหวะการพึ่งพาเวกเตอร์มักจะถูกห่อด้วยการเรียกไปยัง irq_enter () และ irq_exit () รหัสพื้นที่ล้อมรอบภายในคู่ของฟังก์ชั่นเหล่านี้เป็นอะตอมที่เกี่ยวกับพื้นที่ดังกล่าวอื่น ๆ และยังเป็นอะตอมที่เกี่ยวกับคู่ของ cli / sti Irq_enter () และ irq_exit () ยังรวบรวมสถิติบางอย่างที่เกี่ยวข้องกับการจัดการขัดจังหวะ ในที่สุดเคอร์เนลจะตรวจสอบในตาราง vector_irq เพื่อค้นหาหมายเลข irq ที่กำหนดให้กับเวกเตอร์ของอินเทอร์รัปต์ที่ได้รับและเรียก handle_irq () (จาก arch \ x86 \ kernel \ irq_32.c)
ณ จุดนี้ส่วนทั่วไปของการจัดการขัดจังหวะใน Linux จะสิ้นสุดลงเนื่องจากเคอร์เนลมองหารูทีน interrupt handler ที่ติดตั้งโดยไดร์เวอร์อุปกรณ์เป็นส่วนหนึ่งของ irq descriptor และเรียกใช้ หากตัวจัดการดังกล่าวไม่ได้รับการติดตั้งโดยไดรเวอร์เคอร์เนลก็รับทราบการขัดจังหวะในตัวควบคุมการขัดจังหวะและไปที่ออกจากตัวจัดการการขัดจังหวะทั่วไป
หลังจากสิ้นสุดเคอร์เนลการจัดการขัดจังหวะการเรียกคืนสถานะของโปรแกรมที่ถูกขัดจังหวะก่อนหน้านี้และดำเนินการต่อการดำเนินการโปรแกรมนี้
CPU consults with special CPU control structures filled by Linux kernel to find an address of code to which control will be passed.
ใช่ ฉันสงสัยว่าโครงสร้างการควบคุมพิเศษเหล่านั้นคืออะไร ...
จากมุมมองของทฤษฎีเกือบทุกอย่างได้รับการอธิบาย แต่ถ้าคุณกำลังมองหาคำอธิบายเกี่ยวกับเคอร์เนลการขัดจังหวะการจัดการรหัสกรอบลิงค์ต่อไปนี้ควรคุณ: รหัสเดินในการจัดการเคอร์เนลขัดจังหวะ
และถ้าคุณยังคงมองหาทฤษฎีเกี่ยวกับการขัดจังหวะและตัวจัดการขัดจังหวะฉันขอแนะนำให้อ่านสิ่งนี้: ทำความเข้าใจเกี่ยวกับการขัดจังหวะและตัวจัดการขัดจังหวะ