ระบบปฏิบัติการฉีดรหัสเครื่องของตัวเองเมื่อคุณเปิดโปรแกรมหรือไม่?


32

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

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

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


7
โปรดดู: การสลับบริบทระบบปฏิบัติการเปลี่ยนบริบทเป็นแอป แอพสามารถร้องขอบริการระบบปฏิบัติการที่ทำบริบทกลับสู่ระบบปฏิบัติการ เมื่อแอพสิ้นสุดบริบทจะสลับกลับไปเป็นระบบปฏิบัติการ
Guy Coder

4
ดูเพิ่มเติมที่ "syscall"
กราฟิลส์


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

2
ผมคิดว่าการขัดจังหวะ , ตะขอ (จากขัดจังหวะ) จับเวลาฮาร์ดแวร์ (ที่มีการตั้งเวลา -handling เบ็ด) และเพจจิ้ง (คำตอบบางส่วนให้กับคำพูดของคุณในหน่วยความจำที่ต้องห้าม) เป็นคำหลักที่คุณต้องการ ระบบปฏิบัติการจำเป็นต้องร่วมมือกับหน่วยประมวลผลอย่างใกล้ชิดเพื่อเรียกใช้รหัสเมื่อจำเป็นเท่านั้น ดังนั้นพลังงาน CPU ส่วนใหญ่สามารถใช้ในการคำนวณจริงไม่ใช่การจัดการ
Palec

คำตอบ:


35

ไม่ระบบปฏิบัติการไม่ยุ่งกับรหัสของโปรแกรมที่ฉีดรหัสใหม่เข้าไป นั่นจะมีข้อเสียจำนวนหนึ่ง

  1. มันจะใช้เวลานานเนื่องจาก OS จะต้องสแกนผ่านโปรแกรมปฏิบัติการทั้งหมดเพื่อทำการเปลี่ยนแปลง โดยปกติส่วนหนึ่งของไฟล์ที่เรียกใช้งานจะโหลดตามต้องการเท่านั้น นอกจากนี้การแทรกยังมีราคาแพงเนื่องจากคุณต้องเคลื่อนย้ายสิ่งของต่างๆออกไปให้พ้นทาง

  2. เนื่องจากความลังเลของปัญหาการหยุดพักจึงไม่สามารถทราบได้ว่าจะใส่คำแนะนำ "ย้อนกลับไปยังระบบปฏิบัติการ" ของคุณได้ที่ใด ตัวอย่างเช่นหากรหัสมีบางอย่างเช่นwhile (true) {i++;}คุณต้องใส่ฮุกในลูปนั้น แต่เงื่อนไขในลูป ( trueที่นี่) อาจมีความซับซ้อนตามอำเภอใจดังนั้นคุณจึงไม่สามารถตัดสินใจได้ว่าจะใช้ลูปนานแค่ไหน ในทางกลับกันมันจะไม่มีประสิทธิภาพในการใส่ hooks ลงในทุกลูปตัวอย่างเช่นการกระโดดกลับไปที่ระบบปฏิบัติการในระหว่างfor (i=0; i<3; i++) {j=j+i;}นั้นจะทำให้กระบวนการช้าลงมาก และด้วยเหตุผลเดียวกันคุณไม่สามารถตรวจจับลูปสั้น ๆ เพื่อปล่อยให้มันอยู่คนเดียว

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

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

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

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

มีสามวิธีหลักที่ระบบปฏิบัติการควบคุมจากกระบวนการ

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

  2. เพื่อหลีกเลี่ยงปัญหานั้นจะมีการใช้การขัดจังหวะตัวจับเวลา CPU อนุญาตให้ระบบปฏิบัติการลงทะเบียนการเรียกกลับสำหรับการขัดจังหวะประเภทต่าง ๆ ทั้งหมดที่ CPU ดำเนินการ ระบบปฏิบัติการใช้กลไกนี้เพื่อลงทะเบียนการติดต่อกลับสำหรับการขัดจังหวะตัวจับเวลาที่เริ่มทำงานเป็นระยะซึ่งช่วยให้สามารถประมวลผลรหัสของตัวเองได้

  3. ทุกครั้งที่กระบวนการพยายามอ่านจากไฟล์หรือโต้ตอบกับฮาร์ดแวร์ด้วยวิธีอื่นมันขอให้ระบบปฏิบัติการทำงานได้ เมื่อระบบปฏิบัติการถูกขอให้ทำอะไรบางอย่างโดยกระบวนการก็สามารถตัดสินใจที่จะหยุดกระบวนการนั้นและเริ่มการทำงานที่แตกต่างกัน นี่อาจฟังดูเล็กน้อย Machiavellian แต่สิ่งที่ถูกต้องคือ: ดิสก์ I / O ช้าดังนั้นคุณอาจปล่อยให้กระบวนการ B รันในขณะที่กระบวนการ A กำลังรอให้ก้อนโลหะหมุนไปที่ที่ถูกต้อง เครือข่าย I / O ช้าลง แป้นพิมพ์ I / O เป็นน้ำแข็งเพราะคนไม่ใช่สิ่งมีชีวิตที่กิกะเฮิรตซ์


5
คุณสามารถพัฒนาเพิ่มเติมเกี่ยวกับคุณ 2. จุดสุดท้าย? ฉันอยากรู้เกี่ยวกับคำถามนี้และรู้สึกว่าคำอธิบายถูกข้ามไปที่นี่ ดูเหมือนว่าฉันชอบคำถามคือ "วิธีที่ระบบปฏิบัติการใช้ CPU คืนจากกระบวนการ" และคำตอบของคุณบอกว่า "ระบบปฏิบัติการจัดการกับมัน" แต่อย่างไร ใช้วงวนอนันต์ในตัวอย่างแรกของคุณ: มันไม่หยุดคอมพิวเตอร์ได้อย่างไร
BiAiB

3
OS บางตัวทำ, OS ส่วนใหญ่อย่างน้อยยุ่งเกี่ยวกับรหัสที่จะทำ "การเชื่อมโยง" ดังนั้นโปรแกรมสามารถโหลดได้ทุกที่
Ian Ringrose

1
@BiAiB คำสำคัญที่นี่คือ "ขัดจังหวะ" ซีพียูไม่ได้เป็นเพียงสิ่งที่ประมวลผลคำสั่งที่กำหนด แต่ยังสามารถถูกขัดจังหวะแบบอะซิงโครนัสจากแหล่งที่แยกต่างหากซึ่งสำคัญที่สุดสำหรับเรา I / O และการขัดจังหวะสัญญาณนาฬิกา เนื่องจากรหัสพื้นที่เคอร์เนลเท่านั้นที่สามารถจัดการกับการขัดจังหวะ Windows จึงมั่นใจได้ว่าจะสามารถ "ขโมย" งานจากกระบวนการที่กำลังทำงานอยู่ได้ทุกเมื่อที่ต้องการ ตัวจัดการขัดจังหวะสามารถเรียกใช้โค้ดใดก็ได้ที่พวกเขาต้องการรวมถึง "จัดเก็บรีจิสเตอร์ของ CPU ไว้ที่ใดที่หนึ่งและเรียกคืนจากที่นี่ (เธรดอื่น)" เรียบง่ายมาก แต่นั่นคือการสลับบริบท
Luaan

1
การเพิ่มคำตอบนี้ รูปแบบของมัลติทาสกิ้งที่อ้างถึงในจุดที่ 2 และ 3 เรียกว่า "มัลติทาสกิ้งแบบยึดเอาเสียได้" ชื่อนี้อ้างถึงความสามารถของระบบปฏิบัติการในการจองกระบวนการทำงาน มัลติทาสกิ้งแบบมีส่วนร่วมถูกใช้บ่อยในระบบปฏิบัติการรุ่นเก่า บน Windows อย่างน้อยการทำงานแบบมัลติทาสก์แบบยึดเอาเสียก่อนยังไม่ถูกนำมาใช้จนกว่า Windows 95 ฉันได้อ่านระบบควบคุมอุตสาหกรรมอย่างน้อยหนึ่งระบบที่ใช้กันอยู่ในปัจจุบันซึ่งยังคงใช้ Windows 3.1 เพียงอย่างเดียวสำหรับพฤติกรรมการทำงานมัลติทาสกิ้งแบบ
Jason C

3
@BiAiB ที่จริงคุณผิด เดสก์ท็อปซีพียูไม่เรียกใช้รหัสตามลำดับและซิงโครนัสตั้งแต่ประมาณ i486 อย่างไรก็ตาม CPU ที่เก่ากว่ายังคงมีอินพุตแบบอะซิงโครนัส - อินเตอร์รัปต์ ลองนึกภาพคำขอขัดจังหวะฮาร์ดแวร์ (IRQ) เช่นเดียวกับขาของ CPU - เมื่อได้รับ1CPU จะหยุดสิ่งที่ทำและเริ่มประมวลผลการขัดจังหวะ (ซึ่งโดยทั่วไปหมายถึง "รักษาสถานะและข้ามไปยังที่อยู่ในหน่วยความจำ") การขัดจังหวะการจัดการตัวเองไม่ได้เป็นx86หรือรหัสใด ๆ ก็เดินสายอย่างแท้จริง หลังจากกระโดดแล้วจะรันx86รหัส(ใด ๆ ) อีกครั้ง หัวข้อเป็นสิ่งที่เป็นนามธรรมที่สูงขึ้น
Luaan

12

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

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

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

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

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


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

2
ฉันรู้ว่าอินเตอร์รัปต์ถูกกำหนดโดย cpu แต่เคอร์เนลตั้งค่าพอยน์เตอร์ ฉันอาจอธิบายได้ไม่ดี ฉันยังคิดว่า linux ใช้ int 9 เพื่อพูดคุยกับเคอร์เนล แต่ตอนนี้อาจมีวิธีที่ดีกว่า
Programmdude

นี่คือคำตอบที่ทำให้เข้าใจผิดอย่างเป็นธรรมถึงแม้ว่าความคิดที่ว่าตัวกำหนดเวลาแบบ preemptive ถูกขับเคลื่อนโดยการขัดจังหวะตัวจับเวลาถูกต้อง ก่อนอื่นก็ควรสังเกตว่าตัวจับเวลาอยู่ในฮาร์ดแวร์ นอกจากนี้เพื่อชี้แจงว่ากระบวนการ "บันทึก ... กู้คืน" เรียกว่าสวิตช์บริบทและส่วนใหญ่เกี่ยวข้องกับการบันทึกการลงทะเบียน CPU ทั้งหมด (ซึ่งรวมถึงตัวชี้คำแนะนำ) เหนือสิ่งอื่นใด นอกจากนี้กระบวนการสามารถเปลี่ยนตารางขัดจังหวะได้อย่างมีประสิทธิภาพซึ่งเรียกว่า "โหมดป้องกัน" ซึ่งกำหนดหน่วยความจำเสมือนและมีมาตั้งแต่ 286 - ตัวชี้ไปยังตารางขัดจังหวะถูกเก็บไว้ในทะเบียนที่เขียนได้
Jason C

(แม้กระทั่งตารางการขัดจังหวะโหมดจริงก็สามารถเปลี่ยนตำแหน่งได้ - ไม่ล็อคในหน้าแรกของหน่วยความจำ - ตั้งแต่ 8086)
Jason C

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

5

เคอร์เนลระบบปฏิบัติการได้รับการควบคุมกลับจากกระบวนการทำงานเนื่องจากตัวจัดการสัญญาณขัดจังหวะ CPU นาฬิกาไม่ใช่โดยการฉีดโค้ดเข้าสู่กระบวนการ

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


ไม่ใช่แค่นาฬิกาขัดจังหวะ: ขัดจังหวะใด ๆ และยังมีคำแนะนำการเปลี่ยนโหมด
Gilles 'หยุดความชั่วร้าย'

3

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

การทำงานแบบมัลติทาสก์แบบ pre-emptive (ชนิดปกติในปัจจุบัน) อาศัยการขัดจังหวะจากแหล่งภายนอก อินเทอร์รัปต์แทนที่โฟลว์ของการควบคุมปกติและมักจะบันทึกรีจิสเตอร์ไว้ที่ใดที่หนึ่งดังนั้น CPU สามารถทำอย่างอื่นแล้วกลับมาทำงานที่โปรแกรมอย่างโปร่งใส แน่นอนระบบปฏิบัติการสามารถเปลี่ยนการลงทะเบียน "เมื่อคุณออกจากการขัดจังหวะการดำเนินการต่อที่นี่" ดังนั้นจึงดำเนินการต่อในกระบวนการที่แตกต่างกัน

(บางระบบทำคำแนะนำการเขียนในลักษณะที่ จำกัด ในการโหลดโปรแกรมที่เรียกว่า "thunking" และโปรเซสเซอร์ Transmeta คอมแบบไดนามิกเพื่อการเรียนการสอนชุดของตัวเอง)


AFAICR 3.1 ก็ให้ความร่วมมือเช่นกัน Win95 เป็นที่ที่มีการทำงานหลายอย่างที่ต้องห้ามมาก่อนโหมดที่ได้รับการป้องกันส่วนใหญ่นำมาซึ่งการแยกพื้นที่ที่อยู่ (ซึ่งจะปรับปรุงเสถียรภาพ
cHao

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

Transmeta ใช้รหัสที่รันได้ x86 เป็นซอร์สไม่ใช่ภาษาที่สื่อความหมาย และฉันคิดว่ามีหนึ่งกรณีที่รหัสถูกฉีด: ทำงานภายใต้ดีบักเกอร์ ระบบ X86 มักจะเขียนทับคำสั่งที่เบรกพอยต์ด้วย "INT 03" ซึ่งดักจับไว้ในตัวดีบั๊ก ในการดำเนินการต่อ opcode เดิมจะคืนสถานะ
pjc50

การแก้ไขข้อบกพร่องนั้นแทบจะไม่มีใครเรียกใช้แอปพลิเคชัน นอกเหนือจากผู้พัฒนาแอปพลิเคชัน ดังนั้นฉันไม่คิดว่าจะช่วย OP จริงๆ
Dave Gordon

3

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

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

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

สิ่งนี้ไม่เกี่ยวข้องกับ "การฉีดรหัส" ... มันขึ้นอยู่กับรหัสที่มีอยู่ในระบบปฏิบัติการในการทำงานร่วมกับคุณลักษณะฮาร์ดแวร์ของ CPU และวงจรสนับสนุน


2

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

VMware ทำหน้าที่เป็นเลเยอร์ภายใต้ระบบปฏิบัติการอย่างน้อยหนึ่งตัวพร้อมกันบนฮาร์ดแวร์เดียวกัน

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

VMware เขียนคำแนะนำเหล่านั้นใหม่ในรหัสระบบปฏิบัติการก่อนที่จะดำเนินการแทนที่ด้วยการกระโดดลงในรหัส VMware ที่จำลองผลที่ต้องการ

ดังนั้นเทคนิคนี้ค่อนข้างคล้ายกับสิ่งที่คุณอธิบาย


2

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

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


วิธีการของ FP ยังคงใช้งานอยู่ในโปรเซสเซอร์ ARM ซึ่งต่างจาก x86 CPU ที่ยังคงมีชุดตัวเลือก FP-less แต่มันหายากเนื่องจากการใช้ ARM ส่วนใหญ่อยู่ในอุปกรณ์เฉพาะ ในสภาพแวดล้อมเหล่านั้นเป็นที่ทราบกันโดยทั่วไปว่า CPU จะมีความสามารถของ FP หรือไม่
MSalters

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

@DaveGordon คำสั่ง Trapped สามารถพูดได้อย่างสมเหตุสมผลว่าเป็นรหัสการฉีด OS ลงในแอปพลิเคชัน
Gilles 'SO- หยุดความชั่วร้าย'

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