2016-12-26 4 views
1

CPU 명령은 메모리에서 무언가를 읽습니다. CPU와 MMU에는 명령이 실행될 때 주소가 MMU로 보내지며, MMU는이를 통해 BUS를 통해 메모리에서 읽고 대상 레지스터에 정보를 저장합니다. 또한 일반적으로 RAM에 해당하는 일부 주소가 일부 장치에 매핑된다는 것을 알게되었습니다. 그래서 나는 먼저 어떤 장치가 나에게 매핑 될 주소를 알려주는 방법이 있다고 생각합니다. 그런 다음 프로세서가 메모리 주소에서 읽으려고 시도하는 것을 속이고 일부 회로에 의해 대신 장치를 읽습니다.버스를 메모리에 매핑하는 지침은 무엇입니까?

더 나은 설명은 어디에서 찾을 수 있습니까? PCI 및 더 잘 알려진 장치를 다루는 x86 아키텍처에 특히 적합합니다.

+0

질문을 명확히해야합니다. 제목의 질문에 대한 답은 I/O 포트 읽기/쓰기, 메모리 읽기/쓰기, 없음 (BIOS/칩셋/기타가 하드 와이어드 또는 사전 구성)입니다. CPU를 "속일"수는 없습니다. CPU와 메모리/디바이스/버스간에 데이터를 라우팅하는 물리적 메모리 주소 디코딩이 있습니다. 일부 주소는 고정 배선되어 있지만 일부 주소는 변경 될 수 있습니다. –

답변

1

메모리에 장치 매핑에 대한 지침은 입니다.

완전한 대답은 너무 광범위 할 수 있지만 예제를 만들 수 있습니다.
우선, 듣고 자하는 주소로 장치를 구성하여 장치를 구성 할 수 있다고 스스로 생각하십시오. 하드웨어 수준에서 이것은 비교가 아닙니다.

  1. 일부 장치에는 고정 주소가 있습니다.
    시스템의 첫 번째 출시 당시에 있었고 다른 경쟁사 및 후진 호환성을 위해 연속 버전으로 복제 된 레거시 장치입니다.

  2. 구성 가능한 장치.
    이 장치에는 수신 대기 할 주소 범위를 선택하는 점퍼/스위치가 있습니다. 충돌을 피하고 소프트웨어를 적절히 구성하는 것은 사용자의 작업이었습니다.

  3. Plug and play 디바이스.
    가장 유명한 PnP 버스는 PCI이지만 ISA와 MCA는 PnP도 있습니다 (ISA는 "일종의"PnP).
    이러한 장치는 위와 비슷하지만 소프트웨어로 구성 할 수 있으며 필요한 리소스 (IRQ, DMA, MMIO)는 펌웨어와 OS가 충돌없이 할당 할 수 있도록 열거 할 수 있습니다.

이제 어떻게 옵션 3을 달성 할 수 있는지 궁금 할 것입니다. 대답은 간단합니다. 메타 주소 공간. 예를 들어, PCI의 경우

, 어드레스 0cf8h 및 디바이스 장치에 configuration space 레지스터를 선택하고, 판독 또는 레지스터를 작성하는 데 사용 0cfch 2 .
구성 공간의 레지스터를 사용하여 장치를 리베이스 할 수 있습니다.

의이 레지스터 10H 장치가 듣는 주소를 가지고 있다고 가정하자가,이 의사 코드가 88888888h

uint32_t* select = MAKE_POINTER(0xCF8); 
uint32_t* data = MAKE_POINTER(0xCFC); 

*select = MAKE_SELECT(0, 1, 31, 0x10); //Bus 0, Device 1, Function 31, Register 0x10 
*data = 0x88888888;      //Set reg 0x10 to 0x88888888 

당신이 볼 수 있듯이에서 장치를 매핑, 포인터를 deferencing하면 메모리 위치에 쓰기를 생성 0cf8h 및 0cfch이지만 이러한 위치는 하드웨어에 의해 주 메모리로 라우트되지 않고 관심있는 장치에서 수집 할 PCI 구성 공간 액세스로 변환하는 Host-to-PCI 브릿지 컨트롤러로 이동합니다.

이 때, 나중에 88888888h에 액세스되어, 이것을 다시 3하지만 PCI 버스 (보통 subtractive decoding의 결과로서) 가 구성된 장치가 수신 주기억에게로 전달되지 않는다. CPU에는 특별히 지시가 조작되지 않는 것을 의미에서


1 . 모든 것은 실행되는 일부 명령어의 결과이므로 일부 의미에서 매핑되는 장치에 대해 "책임 져야"합니다. 이 대답의 나머지 부분에 대해서는 MMIO이 어떻게 작동하는지 알고 싶다고 가정합니다.

IO 주소 공간에서 x86에 대해서만 그렇지만 그렇게하지 마십시오.

하드웨어는 실제로 메모리가있는 장치를 맵핑하는 경우 메모리가 끝나는 위치를 알고, 후자는 우선 순위를 가지며 장치에 액세스하지 않습니다.