อะไรคือสิ่งที่ทำให้แอสเซมบลีหยุดการทำงานของระบบล้มเหลว [ปิด]


18

ก่อนอื่นฉันเป็นผู้เริ่มต้นดังนั้นหากคำถามนี้ฟังดูไร้สาระโปรดชี้ให้เห็นสมมติฐานที่ไม่ถูกต้อง

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

เมื่อได้รับอิสรภาพในการยุ่งเกี่ยวกับการลงทะเบียนและแรมมันเป็นไปไม่ได้ที่โปรแกรมประกอบจะส่งผลกระทบต่อระบบปฏิบัติการหรือไม่ สมมติว่าระบบปฏิบัติการใช้การลงทะเบียน A เพื่อเก็บข้อมูลที่สำคัญและสมมติว่าฉันเรียกใช้โปรแกรมที่ประกอบบนระบบปฏิบัติการนั้น หากโปรแกรมเขียนขยะลงใน register A ได้สำเร็จระบบปฏิบัติการจะได้รับผลกระทบอย่างแน่นอน

คำถาม:

  1. เป็นไปได้หรือไม่ที่จะยุ่งกับ register A ตามที่อธิบายไว้ข้างต้น?

  2. ถ้าไม่จะหยุดโปรแกรมการประกอบไม่ให้แก้ไขการลงทะเบียนที่ใช้โดยระบบปฏิบัติการ


13
โปรแกรมเมอร์ที่ชาญฉลาด ...
Tony Stewart Sunnyskyguy EE75

ปัจจุบันมีสถาปัตยกรรมคอมพิวเตอร์จำนวนมากในอดีตและในอดีตเช่นเดียวกับระบบปฏิบัติการหลายระบบที่ได้รับการพัฒนา คุณอ้างอิงถึงสถาปัตยกรรม / OS ใดกันแน่? ในสถาปัตยกรรมเก่า ๆ บางอย่างไม่มีความเป็นไปได้ที่จะหยุดโปรแกรมจากสิ่งที่มันทำหลังจากเริ่มต้นถูกต้อง แต่ฮาร์ดแวร์ / OS ที่ทันสมัยมีเครื่องมือฮาร์ดแวร์ที่สร้างขึ้นในตัวซึ่งให้เฉพาะส่วนของหน่วยความจำสำหรับโปรแกรมในโหมด "ปกติ" (ไม่ใช่ superuser) และไม่สามารถเข้าถึงหน่วยความจำนอกขีด จำกัด นี้ได้ การลงทะเบียนนั้นสามารถใช้งานได้ฟรีเนื่องจากระบบปฏิบัติการไม่ได้จัดเก็บข้อมูลที่เป็นประโยชน์ใด ๆ ในการลงทะเบียนไว้ในหน่วยความจำ / บนดิสก์
cyclone125

2
ในไมโครโปรเซสเซอร์โปรแกรมของคุณทำงานใน "โหมดผู้ใช้" ระบบปฏิบัติการทำงานใน "โหมดระบบ" หากโปรแกรมโหมดผู้ใช้สั่งการหยุดทำงานตัวอย่างเช่นเครื่องจะไม่หยุดทำงาน การหยุดจะถูกดักและระบบปฏิบัติการก็ถูกเรียกใช้ เกี่ยวกับ RAM ระบบปฏิบัติการจะตั้งค่าสภาพแวดล้อมสำหรับโปรแกรมโหมดผู้ใช้เพื่อให้ผ่านฮาร์ดแวร์การจัดการหน่วยความจำสิ่งที่โปรแกรมผู้ใช้เห็นว่าเป็นที่อยู่ RAM X จะไม่เป็นที่อยู่ RAM X จริง ๆ
George White

1
@flux ฉันได้อัปเดตความคิดเห็นของฉันแล้ว คำตอบคือ: ไม่มีคำตอบ "ทั่วไป" สำหรับคำถามของคุณเนื่องจากมี / เป็นสถาปัตยกรรมคอมพิวเตอร์ที่แตกต่างกัน / ระบบปฏิบัติการ มันอาจจะมีวิธีที่แตกต่างกัน
cyclone125

2
... นานมาแล้วฉันใช้ในการเขียนในรหัสเครื่องดิบ เย้ฮา !!! :-)
รัสเซลแม็คมาฮอน

คำตอบ:


33

ในที่สุดโปรแกรมทั้งหมดเป็นรหัสเครื่องโดยไม่คำนึงว่าภาษาต้นฉบับเป็นแอสเซมเบลอร์หรือภาษาระดับสูง

สิ่งสำคัญคือมี กลไกฮาร์ดแวร์ที่ จำกัด สิ่งที่กระบวนการที่กำหนดสามารถทำได้รวมถึงการลงทะเบียน "messing with" ที่อาจส่งผลกระทบต่อโปรแกรมอื่นหรือระบบปฏิบัติการของตัวเอง

สิ่งนี้เริ่มต้นด้วยความแตกต่างอย่างง่ายระหว่างโหมดการทำงาน "ผู้ใช้" และ "ผู้ควบคุม" และตั้งแต่นั้นได้พัฒนาเป็นสถาปัตยกรรมความปลอดภัยที่มี "วง" หลายสิทธิ์


นี่เป็นตัวอย่างทั่วไปที่ทำให้เป็นรูปธรรมมากขึ้น:

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

  • ดังนั้นใน "โหมดผู้ใช้" กระบวนการไม่สามารถเข้าถึงการลงทะเบียนการควบคุม MMU

  • และแน่นอนใน "โหมดผู้ใช้" กระบวนการไม่สามารถเปลี่ยนโหมดเป็น "โหมดผู้ดูแล" ยกเว้นผ่านกลไกที่กำหนดไว้อย่างดีซึ่งเกี่ยวข้องกับการเรียกใช้ฟังก์ชั่นระบบปฏิบัติการ

ระบบปฏิบัติการได้รับการควบคุมหากกระบวนการพยายามที่จะทำลายกฎใด ๆ เหล่านี้ เมื่อเกิดเหตุการณ์ขึ้นระบบปฏิบัติการก็สามารถหยุดกระบวนการที่กระทำผิดได้


2
ถ้าฉันเข้าใจถูกต้องสิ่งที่คุณพูดคือโปรเซสเซอร์บางตัวมี "โหมดผู้ใช้" และ "โหมดผู้ควบคุม" ระบบปฏิบัติการทำงานใน "โหมดผู้ดูแล" และทำให้โปรเซสเซอร์เข้าสู่ "โหมดผู้ใช้" เพื่อเรียกใช้โปรแกรมการประกอบแบบสวมของฉัน ใน "โหมดผู้ใช้" มีการลงทะเบียนและที่อยู่ RAM ที่โปรแกรมการประกอบไม่สามารถเข้าถึงได้เนื่องจากการออกแบบโดยเจตนาของฮาร์ดแวร์
ฟลักซ์

3
โดยทั่วไปคำตอบนี้จะอธิบายสถาปัตยกรรม "ที่เหมือน i386" ที่ทันสมัยพร้อม MMU และโหมดที่ได้รับการป้องกัน แต่จริง ๆ แล้วมีหลายรุ่น (i8080, MOS 6502 และอื่น ๆ ) รวมถึงสถาปัตยกรรมที่เรียบง่ายทันสมัย ​​(AVR, ARM Cortex-M เป็นต้น) ที่ไม่มีคุณสมบัติเหล่านี้และหากใช้ระบบปฏิบัติการบางประเภท (เช่นเก่า) CP / M, FreeRTOS สมัยใหม่, ChibiOS ฯลฯ ) ไม่มีอะไรสามารถหยุดยั้งโปรแกรมจากสิ่งที่มันกำลังทำอยู่
cyclone125

2
@Flux สถาปัตยกรรม i386 (ขึ้นไป) ให้รายละเอียดเพื่อเรียนรู้ สถาปัตยกรรม x86 ไม่เพียง แต่มีที่อยู่หน่วยความจำที่สามารถป้องกันได้ แต่ยังมีที่อยู่ I / O ด้วย (มีคำแนะนำต่าง ๆ ที่ใช้สำหรับการเข้าถึงหน่วยความจำกับการเข้าถึง I / O) มีหน่วยความจำสามที่อยู่ใน i386 + ที่อยู่แบบแบ่งกลุ่ม / ตัวเลือกใช้การลงทะเบียนตัวเลือกที่อ้างอิงรายการตาราง (GDT หรือ LDT) เพื่อแมปคู่เข้ากับที่อยู่เชิงเส้นแบบ 32 บิตเดียว เพจจิ้งแล้วแปลที่อยู่เชิงเส้น 32 บิตเป็นที่อยู่ทางกายภาพ 36 บิต (P-II) การป้องกันที่มีอยู่ในขั้นตอนการแปลทั้งสอง
jonk

4
@flux สรุปของคุณถูกต้อง โปรแกรมในระบบหน่วยความจำที่ได้รับการป้องกันด้วยระบบปฏิบัติการมัลติทาสก์ที่เหมาะสมไม่ควรผิดพลาดกับระบบของคำสั่งใด ๆ แม้กระทั่งสิ่งที่ไม่ถูกต้อง - สิ่งเหล่านั้นจบลงด้วยการจัดการพิเศษ
pjc50

แม้ว่าจะมีวงแหวนหลายวง (อย่างน้อย x86) มันหายากมากที่จะใช้มากกว่าสองอัน
ป่า

10

ระบบปฏิบัติการหลายภารกิจหลายระบบใช้โครงสร้างข้อมูลที่เรียกว่า Process Control Block (PCB) เพื่อดูแลปัญหาการเขียนทับลงทะเบียน เมื่อคุณเรียกใช้รหัสของคุณระบบปฏิบัติการจะสร้างกระบวนการใหม่เพื่อติดตามมัน PCB มีข้อมูลเกี่ยวกับกระบวนการและพื้นที่ของคุณที่จัดสรรเพื่อเก็บเนื้อหาการลงทะเบียน สมมติว่าโปรเซสกำลังทำงานบนโปรเซสเซอร์และรหัสของคุณอยู่ในโปรเซส B จะเกิดอะไรขึ้นเมื่อคุณรันโค้ดเพื่อทำสิ่งนี้:

  1. ข้อมูลสถานะของกระบวนการ A (เนื้อหาการลงทะเบียนตัวนับโปรแกรม ฯลฯ ) จะถูกคัดลอกลงใน PCB

  2. ข้อมูลสถานะของกระบวนการ B จะถูกคัดลอกจาก PCB ไปยัง CPU register

  3. กระบวนการ B รันบนตัวประมวลผลจนกว่าจะเสร็จสิ้นหรือถูกจอง

  4. ข้อมูลสถานะของกระบวนการ B จะถูกคัดลอกกลับไปยัง PCB

  5. ข้อมูลสถานะของกระบวนการ A จะถูกคัดลอกกลับไปยัง CPU และจะยังคงทำงานต่อไป

หากระบบปฏิบัติการกำลังทำงานเป็นกระบวนการ A คุณสามารถดูวิธีการบันทึกการลงทะเบียนก่อนที่โปรแกรมของคุณจะทำงานแล้วคัดลอกมันกลับสู่ซีพียูเมื่อโปรแกรมของคุณสิ้นสุดลงป้องกันโปรแกรมผู้ใช้

เพื่อหลีกเลี่ยงกระบวนการที่ผู้ใช้เขียนข้อมูลระบบปฏิบัติการในหน่วยความจำแพลตฟอร์มส่วนใหญ่จะใช้การแบ่งส่วนหน่วยความจำ โดยพื้นฐานแล้วการใช้หน่วยความจำเสมือนพื้นที่แอดเดรสที่กระบวนการเห็นสามารถแมปกับช่วงฟิสิคัลแอดเดรสใด ๆ ตราบใดที่พื้นที่หน่วยความจำกายภาพของกระบวนการไม่ทับซ้อนกันก็เป็นไปไม่ได้ที่กระบวนการหนึ่งจะเขียนทับข้อมูลของผู้อื่น

แน่นอนว่าระบบปฏิบัติการที่แตกต่างกันทำสิ่งที่แตกต่างกันดังนั้นสิ่งนี้จะไม่นำไปใช้ในทุกกรณี นอกจากนี้บนแพลตฟอร์มส่วนใหญ่กระบวนการ OS จะทำงานในโหมดที่แตกต่างจากกระบวนการผู้ใช้และมีความซับซ้อนบางอย่างที่นั่น


4

ขึ้นอยู่กับแพลตฟอร์มที่คุณกำลังพูดถึง

  • บนโปรเซสเซอร์ขั้นพื้นฐานเพิ่มเติมโปรเซสเซอร์เพียงดำเนินการตามคำแนะนำที่โปรแกรมสั่งให้ดำเนินการ

  • บนโปรเซสเซอร์ที่ซับซ้อนกว่ามีสองโหมด (อย่างน้อย) โหมด ในโหมดเดียวโปรเซสเซอร์จะทำสิ่งที่โปรแกรมบอกให้ทำ ในโหมดอื่นตัวประมวลผลเองปฏิเสธที่จะปฏิบัติตามคำแนะนำบางอย่าง

อะไรที่ทำให้โปรแกรมหยุดทำงานทั้งระบบ? ด้วยโปรเซสเซอร์ชนิดแรกคำตอบคือ "ไม่มีอะไร" ด้วยตัวประมวลผลพื้นฐานโปรแกรม rogue เดียวอาจทำให้ระบบทั้งหมดพังได้ คอมพิวเตอร์ที่ใช้ในบ้าน 8 บิตรุ่นแรกและคอมพิวเตอร์ 16 บิตส่วนใหญ่อยู่ในประเภทนี้

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

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

  1. โปรเซสเซอร์ที่มีฮาร์ดแวร์ป้องกันจริง ๆ (เช่นสามารถกำหนดค่าให้ปฏิเสธที่จะใช้งานคำสั่งบางอย่างได้)

  2. ระบบปฏิบัติการที่ใช้สิ่งอำนวยความสะดวกเหล่านี้เพื่อป้องกันตัวเอง (การใช้ชิปที่มีวงจรป้องกันไม่ดีถ้าระบบปฏิบัติการไม่เคยใช้!)

เดสก์ท็อประบบปฏิบัติการสมัยใหม่ใด ๆ ที่คุณสามารถตั้งชื่อ (Windows, Linux, Mac OS, BSD ... ) เป็นระบบปฏิบัติการที่มีโหมดการป้องกันที่ทำงานบนโปรเซสเซอร์ที่มีฮาร์ดแวร์ป้องกัน หากคุณกำลังพัฒนาสมองกลฝังตัวบนไมโครคอนโทรลเลอร์ 8 บิตบางตัวนั่นอาจจะไม่มีฮาร์ดแวร์ป้องกันใด ๆ (หรือระบบปฏิบัติการใด ๆ สำหรับเรื่องนั้น ... )


1

Q. อะไรคือสิ่งที่ทำให้แอสเซมบลีหยุดทำงานไม่ให้ทำงานล้มเหลวในระบบปฏิบัติการ

A. ไม่มีอะไร

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

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

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

  with open("myFile.txt", "w+") as f:
      # do some really clever things
      f.write("Goodbye cruel world!")

ให้ละเว้นรายละเอียดทั้งหมดเกี่ยวกับวิธีการเข้าถึงและเปลี่ยนแปลงสถานะฟิสิคัลหรือวิธีตีความสถานะเป็นบิตและไบต์หรือวิธีถ่ายโอนไบต์เหล่านั้นไปยังและจากหน่วยความจำและ CPU และเชื่อมั่นว่าโปรแกรมทั้งหมดที่ระบบปฏิบัติการมีให้ เบื้องหลัง. ลองคิดดูว่าคุณจะต่อท้ายไฟล์อย่างไร 1) ค้นหาว่าจุดสิ้นสุดของไฟล์คืออะไร 2) เขียนบางสิ่งที่ตำแหน่งนั้น สิ่งที่อาจจะผิดไป? จริงๆแล้วค่อนข้างเยอะ คิดเกี่ยวกับสิ่งอื่นที่เกิดขึ้นบนคอมพิวเตอร์ขณะที่คุณทำสิ่งที่ฉลาด หากสิ่งอื่นใดที่ทำโดยคนอื่น (รวมถึงระบบปฏิบัติการของตัวเอง) เปลี่ยนแปลงไฟล์ที่คุณกำลังทำงานอยู่ในทางใดทางหนึ่งแล้วงานที่เรียบง่ายนี้ก็จะซับซ้อนมากขึ้น ไฟล์ยาวกว่าไฟล์จะสั้นกว่า ไฟล์ไม่ได้อยู่ที่นั่นอีกต่อไป ดิสก์เต็ม

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