머신 코드는 실제로 실행되는 동안 어떻게 생깁니 까?


21

기계 코드가 실제로 하드웨어와 CPU에 의해 실행될 때, 어떻게 생겼습니까?

명령어가 1과 0으로 표시되는 것처럼 이진처럼 보입니까, 아니면 opcode가 바이트 코드와 같은 16 진 숫자로 표시되는 바이트 인 16 진 숫자로 구성됩니까? 바이트 코드와 같이 이진 숫자로 다시 나눌 수 있습니까?


24
실리콘에서 와이어, 게이트 및 레지스터가 깜박입니다. 예를 들어 visual6502.org/JSSim
Nayuki

4
@Nayuki 나는이 시각화가 훌륭하고 답을 얻을 가치가 있다고 생각합니다!
nalzok 2018 년

2
나에게는 아무것도 보이지 않습니다
Gaius

3
실제로 "실행"되었을 때는 존재하지 않습니다. CPU의 (하드웨어!) 장치에 의해 "JIT 컴파일"되어 마이크로 코드되어 실제로 CPU에 지시합니다!
xuq01

2
컴퓨터가 어떻게 번역되는지 이해하는 한 가지 빠른 방법은 논리 게이트에서 컴퓨터를 만드는 것입니다. Ben Eater가 만든 것을 보는 것이 정말
좋습니다.

답변:


38

내가 줄 수있는 가장 좋은 대답은, "아무것도"보이지 않는 "것입니다. 현재 CPU에 의해 실행되는 명령은 일련의 와이어로 표현되며, 일부는 고전압이고 일부는 저전압입니다.

고전압과 저전압을 0과 1로 해석 할 수 있지만, 고전압과 저전압 그룹을 16 진수로 또는 ADD $0 $1CPU가 해석하는 방식과 가장 유사한 조립 명령으로 동일하게 해석 할 수 있습니다 . 이 숫자와 니모닉 자체는 인간이 읽을 수있는 편의성입니다. 내부적으로는 전선의 전압에 지나지 않습니다.

이 옵션 중에서 이진수는 0과 1이 전선의 고전압과 저전압에 직접 매핑되므로 "금속에 가장 가깝습니다". 그러나 다른 것들 중 어느 것도 부정확하지 않으며, 종종 더 유용합니다. 사람들이 16 진 덤프 실행 파일을 보지만 거의 2 진 덤프를 보지 않는 이유가 있습니다.


따라서 16 진 편집기에서 프로그램을 열 수 있고 16 진으로 표시된 바이트가 0에 할당 된 전압과 1에 할당 된 전압에 의해 실행될 수있는 기계 코드 바이너리로 변환됩니까?
Tim Hardly

4
@TimHardly Yep! 16 진수는 읽기가 더 쉽습니다. 마찬가지로 어셈블리도 읽기가 쉽지만 기계적으로 0과 1로 변환 될 수 있습니다. 그렇기 때문에 어셈블러가 컴파일러보다 쓰기가 더 쉽습니다.
Draconis

고마워,이 모든 질문은 나의 지식을 넓히고 혼란을 없애 버렸다.
Tim Hardly

1
@TimHardly 어셈블러는 "NOP"와 같은 일련의 문자를 "10010000"과 같은 일련의 비트에 반복해서 매핑하여 어셈블리 파일을 기계 코드로 변환합니다. opcode는 실제로 사용하는 부분이기 때문에 CPU에 의해 결정됩니다. 동일한 실행 파일을 실행할 수있는 모든 컴퓨터 에는 실제로 동일한 opcode 세트가 있습니다. x86 세트가 가장 일반적이며 오늘날 거의 모든 PC에서 사용됩니다. 또 다른 일반적인 것은 MIPS이며 많은 게임 콘솔에서 사용됩니다.
Draconis 2016 년

1
@TimHardly 질문이 있다면, 어셈블러가 CPU에 NOP 명령에 대한 opcode가 무엇인지 물어볼 수 있습니까? 어셈블러는 명령이 작동하기 전에 출력 할 바이트를 이미 알고 있어야합니다. 실제로 어셈블러는 하나의 프로세서에 대해 프로그램을 출력하는 동시에 다른 프로세서 유형에서 실행됩니다.
Mr Lister

11

"처럼"는 은유를 의미합니다. 문자 그대로 "어떻게 보일 것"을 취하면, 그것은 마더 보드에 놓인 멋진 에칭 실리콘 조각처럼 보일 것입니다. 분명히 은유가 목표였습니다. 은유를 구축하기 위해 우리는 그것이 실제로 무엇인지 살펴 봐야합니다. 그런 다음 허용되는 은유를 만들 수 있습니다. 이것은 약간 길지만 다행히도 비디오 비유로 끝납니다 .

머신 코드는 실제로 메모리에 비트로 저장됩니다. 메모리 칩은 일반적으로 DRAM 으로 커패시터와 전자 양단의 전압으로 해당 비트를 저장합니다. 전자가없는 전압에 대해서는 말하기가 어렵습니다. 때때로 하나 또는 다른 것에 대해 이야기하는 것이 편리하지만, 어느 쪽이 가고 있는지, 다른 쪽이 따라 온다는 것을 이해하십시오.

기계 코드의 여정은 "가져 오기"로 시작합니다. 특정 패턴의 전압이 RAM 칩의 와이어에 적용되어이 특정 비트 세트가 CPU로 전송되어야 함을 나타냅니다. 왜? 상관 없어요. 일반적으로 해당 신호는 CPU가 마지막 명령을 마치고 첫 번째 명령을 내린 후 두 번째 치료를 요청하는 개와 같이 본능적 인 응답으로 새 명령을 요청하기 때문에 전송됩니다. 이 과정은 CPU의 자연스러운 불안정성으로 인해 바지가 약간 걷어차 기 시작합니다. 전원 공급 장치가 칩에 일정한 전압을 적용하면 전압 상승으로 인해 CPU가 RAM 칩에 올바른 전압을 공급하여 첫 번째 지침을 얻습니다 (BIOS 레이어를 조금 손으로 흔 듭니다. 이야기에).

최신 메모리는 데이터를 병렬로 스트리밍합니다. 이것은 머신 코드를 구성하는 비트가 RAM에서 CPU로 32/64 와이어를 논리적으로 말하는 "레인"(32 또는 64가 일반적)으로 분할됨을 의미합니다. 해당 라인의 전압은 CPU로 전송하기 위해 필요에 따라 상승 및 하강합니다.

CPU에 들어가면 작업을 수행 할 수 있습니다. 이것은 마이크로 아키텍처 의 영역 이며 문자 그대로 10 억 달러 규모의 산업이기 때문에 복잡해질 수 있습니다. 이러한 전압은 트랜지스터에 영향을 미치며 다른 비트에 영향을 미치며 "비트 추가"또는 "곱셈"으로 설명 할 수 있습니다. 그것들은 실제로 그 비트들을 나타내는 전압 일뿐입니다. 같은 방식으로 종이에 5 개의 문자열 "2 + 2 = 4"를 낙서하고 수학을했다고 말할 수 있습니다. 연필 흑연은 두 번째가 아닙니다. 그것은 우리가 그 숫자로 사용하고있는 물리적 표현 일뿐입니다.

이것이 실제 시스템이하는 것입니다. 잘 건너 뛰었습니다 ... 거의 모든 것 ...하지만 실제 질문으로 돌아갈 수있을만큼 괜찮습니다. [비 유적으로] 어떤 모습일까요?

그렇게된다면 Martin Molin이 Marble Machine으로 최고의 은유를 만들었을 것 입니다. 기계 코드는 커패시터의 전압이 아니라 중간에 페그로 일부 레고 테크닉스 스트립에 (수동으로) 인코딩됩니다. 이것은 DRAM보다 EPROM 과 비슷 하지만 둘 다 데이터를 보유합니다. 구슬은 전자와 같으며 전압 (또는 구슬의 경우 중력)에 의해 움직입니다. 그리고 전자가 움직일 때, 일을하는 게이트에 힘을가합니다.

그의 머신은 현대 CPU에 비해 ​​단순하지만 은유가 적용되는 한 그렇게 나쁘지는 않습니다. 그리고 그것은 흥미 롭다!


1
대리석 기계는 비디오에서 너무 간단합니다. CPU는 상태가 필요합니다.
Thorbjørn Ravn Andersen 2016

트윗 담아 가기 @ ThatbjørnRavnAndersen True. 대리석 기계에 마린이 뒤집 히지 않고 레버를 자동으로 던질 수있는 몇 개의 게이트가 있다고 가정하면 더 가깝습니다.
Cort Ammon-복원 모니카

감사! 위의 답변에 대해 물었던 질문과 유사하게 조립 된 어셈블리 코드는 전압과 사물로 변환되는 기계 코드로 간주됩니까?
Tim Hardly

@TimHardly "조립 된", "조립품"및 "기계 코드"에 대한 유일한 의미를 사용하여 조립품의 제품은 기계어 코드로 정의됩니다 (그래서 =라고 간주 될 수 있습니다). 도움이 될 수있는 것은 조립과 기계 코드가 "논리적"개념으로 간주되고 "2 + 2 = 4"의 수학적 개념에 더 가깝고 해당 방정식이 쓰여진 종이의 흑연에서 더 멀어진다는 것입니다. 어셈블리 / 기계 코드는 자기 디스크에 저장되거나 종이에 기록되거나 DRAM의 커패시터에 저장되는 어셈블리 / 기계 코드입니다.
Cort Ammon-복원 모니카

1
철학적으로 왁스를 칠 수 있다면 기계 코드는 기계 코드처럼 취급하기 때문에 기계 코드입니다. 우리는 이것을 기계 코드로 생각합니다. .wav 형식의 사운드를 설명하는 바이트를 CPU에 지정할 수 있으며 실제로 기계 코드로 실행합니다. 결과적인 실행은 사운드가 기계 코드로 구성되지 않았기 때문에 유용한 작업을 수행하지 않을 가능성이 높으며 중지 될 수 있지만 실행될 수 있습니다.
Cort

10

이 비디오 , 특히 1:00-1:17을 확인하십시오 . 프로그램이 컴퓨터에서 실행될 때의 모습입니다. 두 행의 표시등은 주소 레지스터와 데이터 레지스터의 현재 내용을 보여줍니다. PDP-11에는 명령 레지스터가 없지만 내용이 표시되는 표시등이 있고 전면에 표시등이 있으면 거의 동일하게 보입니다. 16 등-일부는 켜져 있고 일부는 꺼져 있습니다.

깜박이는 조명을 정말로 좋아한다면 6 개의 레지스터, 스택 포인터, 프로그램 카운터의 현재 내용을 표시하기 위해 더 많은 조명을 가질 수 있습니다. 추가 32768 조명의 경우 캐시의 각 비트에 대한 조명을 가질 수 있습니다. 메모리의 각 비트마다 조명을 가질 수도 있지만 실제로는 많은 조명이 될 것입니다.

이것은 15.2 MHz에서 실행되는 PDP11-70이며 각 명령을 실행하는 데 약 1.5 마이크로 초가 걸립니다. 사람의 눈은 1/10 초까지의 변화를 감지 할 수 있으며, 이때 PDP-11은 60,000 개의 명령을 실행할 수 있습니다. 기본적으로 모든 것이 흐릿합니다.


와우, 그것은 좋은 예입니다, 나는 당신이 빛과 다른 것들을 볼 수있는 선을 따라 뭔가 다른 것을 보았습니다. youtube.com/watch?v=yOyaJXpAYZQ
팀 거의


6

프로세서를 구현 및 테스트 (및 테스트 및 테스트)하는 하드웨어 디자이너는 실제로 시각적 모델을 사용하여 설계가 수행하는 작업을 확인합니다. 대부분의 HDL 시뮬레이션 도구는 모든 레지스터와 와이어의 웨이브 뷰를 출력하여 디버깅이 용이합니다. 아래 스크린 샷 ( 여기 에서 촬영 )은 몇 가지 지침을 실행하는 RISC-V 프로세서에 대한 VCS 시뮬레이터의 이러한 파형을 보여줍니다.

RISC-V 용 DVE 웨이브

이것은 전체 프로세서 설계와 관련된 논리의 작은 하위 집합을 보여주는 매우 간단한 예입니다. 전체 프로세서에 대해 이러한 뷰를 열고 로직을 통해 데이터가 전파되는 것을 볼 수 있습니다. 언급 한대로 머신 코드가 실행 중인지 확인하려면 명령 레지스터 또는 프로세서가 메모리에서 명령을 읽는 데 사용하는 버스의 웨이브를 볼 수 있습니다. 대부분의 웨이브 뷰어에는 버스 및 레지스터에 대한 유연한보기 옵션이 있으므로 이진, 16 진수, 8 진수 및 열거 형 레이블로 값을 표시 할 수 있습니다. 일부에서는 비트 패턴 매핑 표시 값을위한 고유 한 함수를 정의 할 수도 있습니다.

이것은 단지 프로세서의 시뮬레이션을 나타내는 것입니다. 이미 제조 된 프로세서 칩에 대해서는 이러한 종류의 견해를 얻을 수있는 방법이 없습니다.


2

건설중인 골목 아래로 걸려 넘어지는 맹인을 상상해보십시오. 사방에 구멍과 틈이있어 자연스럽게 넘어 져야합니다. 이 시각 장애인은 지시 사항, 대기 시간, 이동시기, 이동 위치 및 도로 끝까지 도달하기 위해 환경을 조작하는 방법에 대한 지침이 담긴 종이 스크롤이 있습니다. 그것이 맹목적으로 따르는 지침 목록 인 집회입니다. 그들은이 골목과이 맹인에게만 의미가 있습니다. 이론적으로 지침만으로 3D 모델을 재구성 할 수도 있습니다 (디 컴파일).

플랫폼을 변경할 때마다 맹인을위한 지침을 다시 컴파일해야합니다. 당신은 하드웨어 (건설 현장의 레이아웃), "12 개의 울타리가 나올 때까지 한 줄에있는 모든 울타리를 뛰어 넘기를 원합니다"와 같은 인간이 입력 한 의도 지침 (고수준 코드)을 알아야합니다. 맹인 (CPU)의 능력. 그는 단기 기억, 한 번에 여러 가지 일을 할 수있는 능력이 있습니까?

이러한 모든 정보를 취하고 일관된 명령어 스크롤을 만드는 것은 컴파일러의 일입니다.

프로그램이 어떻게 보이는지 설명 할 수 있습니까? 아니요. 그러나 우리는 그것을 어떻게 느끼는지 설명 할 수 있습니까? 그렇습니다. 어떤 곳도 보지 않고 거울 가장자리처럼 점프하고 달리는 것처럼 느껴질 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.