Interrupt ถูกจัดการใน Linux อย่างไร?


35

ฉันเพิ่งรู้ว่าInterruptเป็นhardware signal assertionที่เกิดในขาประมวลผล แต่ฉันอยากรู้ว่า Linux OS จัดการกับมันอย่างไร
อะไรคือสิ่งที่เกิดขึ้นเมื่อมีการขัดจังหวะ?


tldp.org/LDP/tlk/dd/interrupts.htmlอธิบายทุกอย่างเกี่ยวกับคำถามที่คุณถาม
John

คำตอบ:


40

นี่คือมุมมองระดับสูงของการประมวลผลระดับต่ำ ฉันกำลังอธิบายถึงสถาปัตยกรรมทั่วไปที่เรียบง่ายสถาปัตยกรรมที่แท้จริงอาจมีความซับซ้อนมากขึ้นหรือแตกต่างกันไปตามวิธีที่ไม่สำคัญในรายละเอียดในระดับนี้

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

จากนั้นตัวประมวลผลจะดำเนินการขัดจังหวะโดยแยกไปยังที่อยู่เฉพาะในหน่วยความจำ รหัสตามที่อยู่ที่เรียกว่าจัดการขัดจังหวะ เมื่อตัวแยกหน่วยประมวลผลอยู่ที่นั้นจะทำการปิดบังอินเตอร์รัปต์ (ดังนั้นตัวจัดการอินเทอร์รัปต์จะมีการควบคุมแบบเอกสิทธิ์) และบันทึกเนื้อหาของรีจิสเตอร์บางตัวในบางแห่ง (โดยทั่วไปคือรีจิสเตอร์อื่น)

ตัวจัดการขัดจังหวะทำสิ่งที่ต้องทำโดยทั่วไปแล้วโดยการสื่อสารกับอุปกรณ์ต่อพ่วงที่ทริกเกอร์การขัดจังหวะการส่งหรือรับข้อมูล หากอินเทอร์รัปต์ถูกยกขึ้นโดยตัวจับเวลาผู้จัดการอาจทริกเกอร์ตัวกำหนดตารางเวลาระบบปฏิบัติการเพื่อสลับไปยังเธรดอื่น เมื่อตัวจัดการดำเนินการเสร็จสิ้นคำสั่งจะเรียกใช้คำสั่ง return-from-interrupt พิเศษที่คืนค่าการลงทะเบียนและ unmasks อินเตอร์รัปต์

ตัวจัดการขัดจังหวะต้องทำงานอย่างรวดเร็วเพราะมันขัดขวางไม่ให้มีการขัดจังหวะอื่น ๆ ในเคอร์เนล Linux การประมวลผลขัดจังหวะจะถูกแบ่งออกเป็นสองส่วน:

  • “ ครึ่งบน” เป็นตัวจัดการขัดจังหวะ มันทำขั้นต่ำที่จำเป็นโดยทั่วไปจะสื่อสารกับฮาร์ดแวร์และตั้งค่าสถานะที่ใดที่หนึ่งในหน่วยความจำเคอร์เนล
  • “ ครึ่งล่าง” ทำการประมวลผลที่จำเป็นอื่น ๆ เช่นการคัดลอกข้อมูลไปยังหน่วยความจำกระบวนการการปรับปรุงโครงสร้างข้อมูลเคอร์เนล ฯลฯ อาจใช้เวลาและแม้แต่บล็อกการรอส่วนอื่น ๆ ของระบบเนื่องจากทำงานโดยเปิดใช้อินเทอร์รัปต์

ตามปกติในหัวข้อนี้สำหรับข้อมูลเพิ่มเติมอ่านไดรเวอร์อุปกรณ์ Linux ; บทที่ 10เป็นเรื่องเกี่ยวกับการขัดจังหวะ


22

Gilles ได้อธิบายกรณีทั่วไปของการขัดจังหวะแล้วสิ่งต่อไปนี้ใช้เฉพาะกับ Linux 2.6 บนสถาปัตยกรรม Intel (บางส่วนเป็นไปตามข้อกำหนดของ Intel)

การขัดจังหวะเป็นเหตุการณ์ที่เปลี่ยนลำดับของคำสั่งที่ดำเนินการโดยโปรเซสเซอร์
การขัดจังหวะมีสองประเภท:

  • การขัดจังหวะแบบซิงโครนัส (ข้อยกเว้น) ที่สร้างโดย CPU ในขณะประมวลผลคำสั่ง
  • Asynchronous interrupt (Interrupt) ที่ออกโดยอุปกรณ์ฮาร์ดแวร์อื่น ๆ

ข้อยกเว้นเกิดจากข้อผิดพลาดในการเขียนโปรแกรม (ข้อผิดพลาด fe Divide , Page Fault , Overflow ) ที่เคอร์เนลต้องจัดการ เขาส่งสัญญาณไปยังโปรแกรมและพยายามกู้คืนจากข้อผิดพลาด

ข้อยกเว้นสองข้อต่อไปนี้ถูกจัดประเภท:

  • ข้อยกเว้นที่ตรวจพบโปรเซสเซอร์ที่สร้างโดย CPU ในขณะที่ตรวจจับสภาพผิดปกติ แบ่งออกเป็นสามกลุ่ม: ข้อผิดพลาดโดยทั่วไปสามารถแก้ไขได้กับดักรายงานการดำเนินการยกเลิกเป็นข้อผิดพลาดร้ายแรง
  • ข้อยกเว้นแบบโปรแกรมที่ร้องขอโดยโปรแกรมเมอร์ซึ่งจัดการเหมือนกับแทร็บ

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

การจัดการอินเตอร์รัปต์เป็นงานที่ละเอียดอ่อน:

  • อินเทอร์รัปต์สามารถเกิดขึ้นได้ทุกเวลาเคอร์เนลพยายามทำให้มันหายไปโดยเร็วที่สุด
  • การขัดจังหวะสามารถถูกขัดจังหวะโดยการขัดจังหวะอื่น
  • มีพื้นที่ในเคอร์เนลซึ่งจะต้องไม่ถูกขัดจังหวะเลย

มีการกำหนดระดับอินเตอร์รัปต์ที่แตกต่างกันสองระดับ:

  • อินเตอร์รัปต์แบบ Maskable ที่ออกโดยอุปกรณ์ I / O; สามารถอยู่ในสองสถานะหน้ากากหรือไม่เปิดเผย เฉพาะการขัดจังหวะที่ไม่เปิดเผยที่ได้รับการประมวลผล
  • ขัดจังหวะ Nonmaskable ; ความผิดปกติร้ายแรง (ความล้มเหลวของฮาร์ดแวร์ fe); ประมวลผลโดย 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 เคอร์เนลรู้วิธีจัดการขัดจังหวะหรือข้อยกเว้นที่เกิดขึ้นอย่างแน่นอน


ดังนั้นเคอร์เนลจะเกิดอะไรขึ้นเมื่ออินเตอร์รัปต์เกิดขึ้น

  • CPU จะตรวจสอบหลังจากแต่ละคำสั่งถ้ามี IRQ จาก (A) PIC
  • ถ้าเป็นเช่นนั้นให้ปรึกษา IDT เพื่อจับคู่เวกเตอร์ที่ได้รับกับฟังก์ชัน
  • ตรวจสอบว่ามีการออกอินเทอร์รัปต์จากแหล่งที่ได้รับอนุญาตหรือไม่
  • บันทึกการลงทะเบียนของกระบวนการขัดจังหวะ
  • เรียกใช้ฟังก์ชันตามเพื่อจัดการกับการขัดจังหวะ
  • โหลดการลงทะเบียนที่บันทึกไว้ล่าสุดของกระบวนการขัดจังหวะและลองดำเนินการต่อ

คุณสามารถชี้แจง"การตรวจสอบ CPU หลังจากแต่ละคำสั่งถ้ามี IRQ จาก (A) PIC" มันเกิดขึ้นได้อย่างไร? มันเกี่ยวข้องกับVIP- แฟล็กในแฟล็กการลงทะเบียนหรืออะไร? ขอบคุณล่วงหน้า
red0ct

7

แรกของผู้เข้าร่วมทั้งหมดที่เกี่ยวข้องในการจัดการขัดจังหวะเป็นอุปกรณ์ฮาร์ดแวร์ต่อพ่วง, ตัวควบคุมขัดจังหวะ, 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.ใช่ ฉันสงสัยว่าโครงสร้างการควบคุมพิเศษเหล่านั้นคืออะไร ...
หุ่นยนต์

3

จากมุมมองของทฤษฎีเกือบทุกอย่างได้รับการอธิบาย แต่ถ้าคุณกำลังมองหาคำอธิบายเกี่ยวกับเคอร์เนลการขัดจังหวะการจัดการรหัสกรอบลิงค์ต่อไปนี้ควรคุณ: รหัสเดินในการจัดการเคอร์เนลขัดจังหวะ

และถ้าคุณยังคงมองหาทฤษฎีเกี่ยวกับการขัดจังหวะและตัวจัดการขัดจังหวะฉันขอแนะนำให้อ่านสิ่งนี้: ทำความเข้าใจเกี่ยวกับการขัดจังหวะและตัวจัดการขัดจังหวะ

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