문제

Arm Core 문서를 읽는 동안이 의심을 받았습니다. CPU는 데이터 버스와의 데이터를 명령어로 실행할지 또는 작동 할 수있는 데이터로서 데이터 버스와 어떻게 구별됩니까?

문서의 발췌문을 참조하십시오.

"데이터는 데이터 버스를 통해 프로세서 코어에 들어갑니다. 데이터는 실행하는 지침 또는 데이터 항목 일 수 있습니다."

나를 깨우쳐 주셔서 미리 감사드립니다! /ms

도움이 되었습니까?

해결책

각 오크 코드는 N 바이트의 명령으로 구성되며, 이후의 M 바이트가 데이터 (메모리 포인터 등)가 될 것으로 기대합니다. 따라서 CPU는 각 Opcode를 사용하여 다음 바이트가 데이터 수를 결정합니다.

확실히 오래된 프로세서 (예 : 6502 등과 같은 오래된 8 비트 유형)의 경우 차별화가 없었습니다. 일반적으로 프로그램 카운터를 메모리에서 프로그램의 시작에 가리키며 메모리의 다른 곳에서 데이터를 참조하지만 프로그램/데이터는 간단한 8 비트 값으로 저장되었습니다. 프로세서 자체는 둘을 구별 할 수 없었습니다.

데이터로 간주 된 것에 대해 프로그램 카운터를 지적하는 것이 완벽하게 가능했으며 실제로 교수가 한 오래된 대학 튜토리얼을 기억합니다. 바로 그거죠 그리고 우리는 그에게 실수를 지적해야했습니다. 그의 응답은 "그러나 그것은 데이터입니다! 그것을 실행할 수 없습니다! 그것을 실행할 수 없습니까?"

다른 팁

간단한 대답 - 그렇지 않습니다. 기계 코드 지침은 데이터와 마찬가지로 이진 번호입니다. 보다 복잡한 답변 - 프로세서가 메모리 세분화를 제공 할 수도 있고 그렇지 않을 수도 있습니다. 즉, 데이터로 지정된 것을 실행하려고 시도하면 일종의 트랩을 유발합니다. 이것은 "분할 오류"의 의미 중 하나입니다. 프로세서는 실행 가능한 코드라고 표시되지 않은 것을 실행하려고 시도했습니다.

원래 팔 디자인에는 지침을 실행하기위한 3 단계 파이프 라인이 있습니다.

  1. 지침을 CPU로 가져 오십시오
  2. Execution을 위해 CPU를 구성하도록 명령어를 디코딩하십시오
  3. 지침을 실행하십시오.

CPU의 내부 논리는 1 단계 (예 : 명령 페치) 또는 3 단계 (즉, "로드"명령으로 인한 데이터 페치)에서 데이터를 가져 오는지 여부를 알 수 있습니다.

최신 ARM 프로세서에는 지침을 가져 오기위한 별도의 버스가있어 (데이터를 가져 오는 동안 파이프 라인이 정지되지 않음) 더 긴 파이프 라인 (더 빠른 클럭 속도를 허용하기 위해)이지만 일반적인 아이디어는 여전히 동일합니다.

프로세서에서 읽은 각각은 데이터 페치 또는 명령 페치로 알려져 있습니다. 모든 프로세서 오래된 프로세서와 새로운 프로세서는 데이터 가져 오기에서 명령을 가져온다는 것을 알고 있습니다. 외부에서 당신은 말을하거나 말할 수 없을 수도 있습니다. 일반적으로 팔이 아닌 하버드 건축 프로세서를 제외하고는 그렇지 않습니다. 나는 최근에 Mpcore (ARM11)와 협력 해 왔으며 외부 인터페이스에 어떤 종류의 읽기가 어떤 종류의 독서인지, 주로 외부 캐시를 연결하고 MMU가 있는지 지식과 결합하는 비트가 있습니다. L1 캐시 켜기와 명령에서 데이터를 알 수 있지만 규칙의 예외입니다. 메모리 버스 관점에서 그것은 당신이 지시에서 데이터를 알지 못하는 데이터 비트 일뿐이지만, 그 메모리주기를 시작하고 결과를 기다리는 논리는 그것이 어떤 종류의 페치와 무엇을 할 것인지 사이클을 시작하기 전에 알았습니다. 그것을 얻을 때 그 데이터와 함께.

데이터가 프로그램에 저장되는 위치로 내려 가고 CPU가 코드인지 데이터인지 알리기위한 OS 지원을 지원합니다.

모든 코드는 변수 저장에 비해 이미지의 다른 세그먼트 (상수 문자열과 같은 정적 데이터와 함께)에 배치됩니다. OS (및 Memory Management Unit)는 간단히 버리고 원래 디스크 파일에서 다시로드하여 메모리에서 코드를 교체 할 수 있기 때문에이를 알아야합니다 (적어도 Windows가 수행하는 방식).

따라서 CPU는 메모리가 데이터인지 코드인지 '알고 있다고 생각합니다. 의심 할 여지없이 우리가 가지고있는 최신 파이프 CPU는 이제 CPU가 가능한 빨리 처리하는 데 도움이되도록이 메모리를 다르게 읽는 지침이 있습니다 (예 : 코드는 캐시되지 않을 수 있습니다. 데이터에 항상 스트림이 아닌 무작위로 액세스 할 수 있습니다).

프로그램 카운터를 데이터로 가리킬 수는 있지만 OS는 CPU에이를 방지하도록 지시 할 수 있습니다. NX BIT 및 Windows의 "데이터 실행 보호"설정 (시스템 제어판)을 참조하십시오.

따라서 CPU는 메모리가 데이터인지 코드인지 '알고 있다고 생각합니다. 의심 할 여지없이 우리가 가지고있는 최신 파이프 CPU는 이제 CPU가 가능한 빨리 처리하는 데 도움이되도록이 메모리를 다르게 읽는 지침이 있습니다 (예 : 코드는 캐시되지 않을 수 있습니다. 데이터에 항상 스트림이 아닌 무작위로 액세스 할 수 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top