รหัสเครื่องมีลักษณะอย่างไรในขณะที่ทำงานอยู่


21

เมื่อรหัสฮาร์ดแวร์ถูกประมวลผลโดยฮาร์ดแวร์และ CPU จริง ๆ แล้วมันมีลักษณะอย่างไร?

มันจะมีลักษณะเป็นเลขฐานสองตามคำแนะนำในการเป็นตัวแทนของคนและศูนย์หรือมันจะเป็นสิ่งที่ประกอบด้วยเลขฐานสิบหกหลักที่ opcodes เป็นไบต์นำเสนอเป็นตัวเลขฐานสิบซึ่งสามารถแบ่งกลับลงในเลขฐานสองเช่น bytecode?


24
สิ่งที่คุณจะเห็นคือสายประตูและลงทะเบียนกะพริบบนซิลิคอน ยกตัวอย่างเช่นvisual6502.org/JSSim
Nayuki

4
@ นายูกิฉันคิดว่าการสร้างภาพข้อมูลนั้นยอดเยี่ยมและสมควรได้รับคำตอบ!
nalzok

2
มันไม่เหมือนอะไรกับฉันเลย
Gaius

3
มันไม่ได้มีอยู่จริงในตอนที่มัน "ถูกประหาร" มันคือ "JIT compiled" โดยอุปกรณ์ (ฮาร์ดแวร์!) บน CPU ไปยัง microcode ซึ่งสั่ง CPU จริง ๆ !
xuq01

2
วิธีหนึ่งที่รวดเร็วในการทำความเข้าใจว่าคอมพิวเตอร์แปลอย่างไรคือสร้างจากประตูตรรกะฉันชอบดูสิ่งที่สร้างโดย Ben Eater youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU
Ferrybig

คำตอบ:


38

คำตอบที่ดีที่สุดที่ฉันสามารถให้ได้คือมันไม่ได้ "ดู" เหมือนอะไรเลย คำสั่งที่กำลังดำเนินการโดย CPU นั้นแสดงโดยชุดสายไฟบางอันมีแรงดันไฟฟ้าสูงซึ่งบางอันมีแรงดันไฟฟ้าต่ำ

คุณสามารถตีความแรงดันไฟฟ้าสูงและต่ำเป็นศูนย์และวัตถุได้ แต่คุณสามารถตีความกลุ่มของแรงดันไฟฟ้าสูงและต่ำเป็นเลขฐานสิบหกได้ดีเท่า ๆ กันหรือเป็นคำสั่งแอสเซมบลีเช่นADD $0 $1(ซึ่งใกล้เคียงกับที่ CPU ตีความ) ตัวเลขและตัวช่วยจำเหล่านี้ช่วยอำนวยความสะดวกให้มนุษย์อ่าน ภายในมันไม่มีอะไรนอกจากแรงดันไฟฟ้าบนสาย

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


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

4
@ TimHardly ใช่! Hex นั้นง่ายต่อการอ่าน แอสเซมบลีในทำนองเดียวกันอ่านง่ายยิ่งขึ้น แต่สามารถแปลโดยอัตโนมัติเป็นศูนย์และคน นั่นเป็นสาเหตุที่แอสเซมเบลอร์เขียนง่ายกว่าคอมไพเลอร์
Draconis

ขอบคุณคำถามทั้งหมดนี้ได้ขยายความรู้ของฉันและขจัดความสับสนของฉัน
ทิมแทบจะ

1
@ TimHardly แอสเซมเบลอร์แมปลำดับของอักขระเช่น "NOP" กับชุดของบิตเช่น "10010000" ซ้ำแล้วซ้ำอีกเพื่อเปลี่ยนไฟล์แอสเซมบลีเป็นรหัสเครื่อง opcodes ถูกกำหนดโดย CPU เนื่องจากเป็นส่วนที่ใช้งานจริง คอมพิวเตอร์ทุกเครื่องที่สามารถเรียกใช้ไฟล์ปฏิบัติการเดียวกันนั้นมี opcode ชุดเดียวกัน ชุด x86 เป็นชุดที่ใช้กันทั่วไปและใช้ในพีซีทุกเครื่องในทุกวันนี้ อีกหนึ่งทั่วไปคือ MIPS ใช้ในเกมคอนโซลจำนวน
Draconis

1
@ TimHardly หากคำถามของคุณคือผู้ประกอบสามารถถาม CPU ว่า opcode สำหรับคำสั่ง NOP ได้อย่างไรคำตอบคือไม่ แอสเซมเบลอร์ต้องทราบว่าต้องใช้ไบต์อะไรสำหรับเอาท์พุทของคำสั่งก่อนจึงจะสามารถใช้งานได้ อันที่จริงแล้วแอสเซมเบลอร์สามารถส่งออกโปรแกรมสำหรับโปรเซสเซอร์หนึ่งในขณะที่ตัวเองกำลังทำงานบนประเภทโปรเซสเซอร์ที่แตกต่างกัน
นาย Lister

11

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

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

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

หน่วยความจำสมัยใหม่ส่งกระแสข้อมูลแบบขนาน ซึ่งหมายความว่าบิตที่ประกอบขึ้นเป็นรหัสเครื่องจะแบ่งออกเป็น "เลน" (32 หรือ 64 เป็นเรื่องธรรมดา) ซึ่งเป็นวิธีตรรกะในการพูดสาย 32/64 จาก RAM ไปยัง CPU แรงดันไฟฟ้าในสายเหล่านั้นจะเพิ่มขึ้นและลดลงตามความจำเป็นเพื่อส่งผ่านไปยัง CPU

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

นั่นคือสิ่งที่ระบบจริงทำในระดับสูงอย่างมาก ฉันข้ามดี ... ทุกอย่างสวยมาก ... แต่มันก็ดีพอที่จะกลับไปที่คำถามจริงของคุณ มันจะมีลักษณะอย่างไร [เปรียบเทียบ]

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

เครื่องของเขานั้นเรียบง่ายเมื่อเทียบกับซีพียูสมัยใหม่ แต่ก็ไม่ได้เลวร้ายเท่าที่มีการเปรียบเทียบ และมันก็เป็นเล่ห์!


1
เครื่องหินอ่อนง่ายเกินไปสำหรับวิดีโอนี้ CPU ต้องการสถานะ
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersenจริง ฉันคิดว่าหากเครื่องหินอ่อนมีประตูไม่กี่ประตูที่ปล่อยให้คันโยกหมุนอัตโนมัติแทนที่จะเป็น Marin ต้องพลิกมันก็จะเข้าใกล้มากขึ้น
Cort Ammon - Reinstate Monica

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

@TimHardly การใช้ความหมายเพียงอย่างเดียวสำหรับ "แอสเซมบลี" "แอสเซมบลี" และ "รหัสเครื่องจักร" ผลิตภัณฑ์ของแอสเซมบลีแอสเซมบลีถูกกำหนดเป็นรหัสเครื่อง (ดังนั้นใช่มันจะถือว่าเป็น =) สิ่งที่อาจช่วยได้ก็คือทั้งชุดประกอบและรหัสเครื่องถือว่าเป็นแนวคิด "ตรรกะ" ใกล้กับแนวคิดทางคณิตศาสตร์ของ "2 + 2 = 4" และเพิ่มเติมจากกราไฟท์บนกระดาษที่เขียนสมการนั้น แอสเซมบลี / รหัสเครื่องคือแอสเซมบลี / รหัสเครื่องไม่ว่าจะถูกเก็บไว้ในดิสก์แม่เหล็กเขียนบนกระดาษหรือเก็บไว้ในตัวเก็บประจุใน DRAM
Cort Ammon - Reinstate Monica

1
ถ้าฉันอาจจะขัดเกลาปรัชญารหัสเครื่องเป็นรหัสเครื่องเพราะเราถือว่ามันเหมือนรหัสเครื่อง เราคิดว่ามันเป็นรหัสเครื่อง ฉันสามารถชี้ซีพียูที่ไบต์อธิบายเสียงในรูปแบบ. WAV และมันจะรันมันเป็นรหัสเครื่อง การประมวลผลที่เกิดขึ้นไม่น่าจะทำสิ่งใดที่มีประโยชน์ (เพราะเสียงไม่ได้ถูกสร้างเป็นรหัสเครื่อง) และมันอาจหยุดชะงัก
Cort Ammon - Reinstate Monica

10

ลองชมวิดีโอนี้โดยเฉพาะอย่างยิ่ง 1:00 ถึง 1:17 นั่นคือสิ่งที่ดูเหมือนว่าเมื่อโปรแกรมทำงานบนคอมพิวเตอร์ ไฟสองแถวแสดงเนื้อหาปัจจุบันของการลงทะเบียนที่อยู่และการลงทะเบียนข้อมูล PDP-11 ไม่มีคำสั่งลงทะเบียน แต่ถ้ามีและมีไฟที่ด้านหน้าเพื่อแสดงเนื้อหามันจะดูค่อนข้างเหมือนกัน 16 ไฟ - บางส่วนของพวกเขาเปิดบางส่วนออก

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

นี่คือ PDP11-70 ซึ่งทำงานที่ 15.2 MHz และแต่ละคำสั่งใช้เวลาประมาณ 1.5 microseconds ในการดำเนินการ สายตามนุษย์สามารถตรวจจับการเปลี่ยนแปลงได้ถึง 1/10 วินาทีและในเวลานั้น PDP-11 สามารถดำเนินการตามคำสั่งได้ 60,000 คำสั่ง โดยทั่วไปทุกอย่างจะเบลอ


ว้าวนั่นเป็นตัวอย่างที่ดีฉันเคยเห็นคนอื่นชอบมันมีบางอย่างตามที่คุณเห็นแสงและสิ่งอื่น ๆ youtube.com/watch?v=yOyaJXpAYZQ
Tim Hardly


6

ผู้ออกแบบฮาร์ดแวร์ใช้และทดสอบ (และทดสอบและทดสอบ) โปรเซสเซอร์ใช้แบบจำลองภาพเพื่อดูการออกแบบที่ทำอยู่ เครื่องมือจำลองสถานการณ์ HDL ส่วนใหญ่ (หากไม่ใช่ทั้งหมด) จะแสดงเอาต์พุตคลื่นมุมมองของรีจิสเตอร์และสายไฟทั้งหมดเพื่อให้สามารถดีบักได้ง่าย ภาพหน้าจอด้านล่าง (นำมาจากที่นี่ ) แสดงคลื่นเหล่านี้จากตัวจำลอง VCS สำหรับโปรเซสเซอร์ RISC-V ที่ใช้คำสั่งสองสามคำ

คลื่น DVE สำหรับ RISC-V

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

เป็นที่น่าสังเกตว่านี่เป็นเพียงการจำลองการทำงานของโปรเซสเซอร์ ไม่มีวิธีรับมุมมองประเภทนี้สำหรับชิปประมวลผลที่ประดิษฐ์ขึ้นแล้ว


2

ลองนึกภาพชายตาบอดคนหนึ่งเดินโซเซลงซอยระหว่างก่อสร้าง ทุกที่มีรูและรอยแยกดังนั้นเขาควรตกลง ไม่ใช่คนตาบอดคนนี้เพราะเขามีกระดาษม้วนพร้อมคำแนะนำเมื่อต้องรอเวลาที่จะย้ายสถานที่ที่จะย้ายและวิธีการจัดการสภาพแวดล้อมของเขาถึงจุดสิ้นสุดของถนน นั่นคือสิ่งที่การชุมนุมคือรายการตามคำแนะนำ - สุ่มสี่สุ่มห้าพวกเขาทำให้รู้สึกถึงซอยนี้และชายตาบอดคนนี้ ในทางทฤษฎีคุณสามารถสร้างแบบจำลอง 3 มิติได้จากคำแนะนำเพียงอย่างเดียว (Decompiling)

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

การรับข้อมูลเหล่านี้ทั้งหมดและการปลอมคำแนะนำการเชื่อมโยงกันเป็นงานของคอมไพเลอร์

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

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