어떤 플랫폼에서는 다음 C 또는 C++ 코드를 사용하는 경우가 있습니다. ptr
하드웨어 포트를 메모리 주소에 매핑하는 실제 플랫폼은 무엇입니까?
int* ptr;
*ptr = 0;
는 ptr
이 해당 포트가 매핑 된 주소를 저장하는 경우 하드웨어 입출력 포트에 기록 할 수 있습니다. 일반적으로 이들은 "임베디드 플랫폼"이라고합니다.
그런 플랫폼의 실제 예는 무엇입니까?
어떤 플랫폼에서는 다음 C 또는 C++ 코드를 사용하는 경우가 있습니다. ptr
하드웨어 포트를 메모리 주소에 매핑하는 실제 플랫폼은 무엇입니까?
int* ptr;
*ptr = 0;
는 ptr
이 해당 포트가 매핑 된 주소를 저장하는 경우 하드웨어 입출력 포트에 기록 할 수 있습니다. 일반적으로 이들은 "임베디드 플랫폼"이라고합니다.
그런 플랫폼의 실제 예는 무엇입니까?
내 경험상 대부분의 시스템은 메모리 매핑 I/O를 사용합니다. x86 플랫폼은 (프로세서 op 코드의 in
/out
패밀리를 사용하는) 메모리 매핑되지 않은 별도의 I/O 주소 공간을 가지고 있지만, PC 아키텍처는 장치 I/O를위한 표준 메모리 주소 공간을 광범위하게 사용합니다. 주소 공간이 넓고 액세스가 빠르고 (일반적으로) 프로그래밍이 쉽습니다 (일반적으로).
프로세서의 메모리 주소 공간이 때로는 제한적 이었기 때문에 별도의 I/O 주소 공간이 처음 사용되었다고 생각합니다. 일부는 장치 액세스에 사용하지 않았습니다. 메모리 주소 공간이 메가 바이트 이상으로 열리면 I/O 주소를 메모리 주소와 분리하는 이유가 덜 중요 해졌다.
얼마나 많은 프로세서가 x86처럼 별도의 I/O 주소 공간을 제공하는지 잘 모르겠습니다. 별도의 I/O 주소 공간이 어떻게 떨어 졌는지를 나타내는 지표로, x86 아키텍처가 32 비트 영역으로 옮겨 졌을 때 I/O 주소 공간을 64KB로 늘리지 않았습니다 (비록 그들이 능력을 추가했지만 한 명령으로 32 비트 데이터 청크 이동). x86이 64- 영역으로 옮겨 졌을 때 I/O 주소 공간은 64KB 였고 64 비트 단위로 데이터를 이동하는 기능조차 추가하지 않았습니다 ...
또한 최신 데스크탑 및 서버 플랫폼 (또는 가상 메모리를 사용하는 다른 시스템)은 일반적으로 메모리 매핑 여부와 관계없이 응용 프로그램이 I/O 포트에 액세스하는 것을 허용하지 않습니다. 이 액세스는 장치 드라이버에만 국한되며 장치 드라이버조차도 물리적 주소의 가상 메모리 매핑을 처리하거나 DMA 액세스를 설정하기위한 일부 OS 인터페이스를 갖습니다.
임베디드 시스템처럼 소형 시스템에서는 I/O 주소가 응용 프로그램에서 직접 액세스되는 경우가 많습니다.메모리 매핑 주소를 사용하는 시스템의 경우 일반적으로 장치의 I/O 포트의 실제 주소로 포인터를 설정하고 그 포인터를 다른 것과 같이 사용하여 수행됩니다. 그러나 액세스가 발생하고 올바른 순서로 발생하도록하려면 volatile
개체를 가리키는 것으로 포인터를 선언해야합니다.
메모리 매핑 I/O 포트 이외의 다른 장치 (x86의 I/O 주소 공간과 같은)를 사용하려면 컴파일러에서 일반적으로 해당 주소 공간을 읽고 쓸 수있는 확장 프로그램을 제공합니다 . 이러한 확장이 없으면 I/O를 수행하기 위해 어셈블리 언어 함수를 호출해야합니다.
내가 해왔다. 최근에이 주제에 대한 연구를 통해 귀하의 답변이 매우 유용하다는 것이 입증되었습니다. 몇 가지 질문이 있습니다 : 어떤 장치가 I/O 주소 공간을 사용합니까? 그리고 메모리는 메모리 매핑 된 장치와 모든 프로그램 (메모리 매핑 된 I/O)에 공통적으로 사용되므로 메모리 매핑 된 공간이 사용될 때 어떤 일이 발생합니까? 그 공간은 그 시간 동안 사용할 수 없게 렌더링됩니까? – Cygnus
PC에서 I/O 주소 공간을 사용하는 장치의 예로는 PS/2 키보드, 레거시 COM 포트 등이 있습니다. 나는 다른 몇 가지 물건이있을 것이라고 확신한다. 나는 하드웨어 디자이너가 아니기 때문에 새로운 디바이스가 I/O 공간을 사용할지 또는 관련된 포트 수가 적은 경우에도 메모리 맵핑 된 공간을 선호할지 모르겠다. (거의 모든 것 비디오 어댑터를 제외하고 USB 또는 요즘 SATA). –
가상 주소를 지원하는 시스템에서 메모리 매핑 I/O에 대한 응용 프로그램 액세스는 일반적으로 응용 프로그램간에 시스템이 여전히 중재 할 수있는 특정 요청을 제외하고는 메모리가 일반적으로 프로세스 공간에 매핑되지 않습니다. –
PlayStation. 이것이 시스템의 저수준 그래픽 (및 기타) 기능에 대한 직접 최적화 된 액세스 방법입니다.
이것을 메모리 매핑 I/O라고하며, 시작하기 좋은 곳은 Wikipedia article입니다.
최신 운영 체제는 일반적으로 드라이버를 작성하지 않는 한 사용자를 보호하지만이 기술은 PC 아키텍처에도 적용됩니다. DOS 640Kb 제한을 기억하십니까? 이는 640K에서 1Mb까지의 메모리 주소가 I/O에 할당 되었기 때문입니다.
An NDIS Windows 용 드라이버는 예입니다. 이를 메모리 매핑 I/O라고하며이 이점은 성능입니다.
Motorola 68k 시리즈와 PowerPC는 큰 특징입니다.
메모리 매핑 I/O를 사용하는 장치의 예는 Embedded-Systems을 참조하십시오. 라우터, 애드 - 모뎀, 마이크로 컨트롤러 등.
대부분의 주변 장치는 메모리 맵 레지스터를 통해 메인 CPU와 통신하기 때문에 드라이버를 작성할 때 주로 사용됩니다.
현대 Windows에서이 작업을 수행 할 수 있습니다 (Linux에서도이 작업을 수행 할 수 있습니다). 그것은 메모리 맵 파일이라고 불립니다. Windows의 메모리에 파일을로드 한 다음 포인터를 조작하여 파일을 쓰거나 변경할 수 있습니다.
OP가 말하는 것만 같지 않습니다. 메모리 매핑 된 I/O는 메모리 매핑 된 파일과 다릅니다. . –
메모리 매핑 된 I/O? – Chubsdad
모든 답변에 추가하기 만하면 x86 플랫폼에서도이 작업 (메모리 매핑 된 I/O)을 수행합니다. 당신은 OS에 의해 생성 된 보호 된 환경에서 작업하는 데 익숙해 져서 실제 하드웨어의 모든 더러운 부분을 만질 필요는 없습니다. 드라이버를 작성하거나 OS를 작성하는 것이 좋으며 다른 많은 재미있는 것들 중에서도 Memory Mapped I/O를 많이 다루어야합니다. :) [1] http://en.wikipedia.org/wiki/Protected_mode –
참조 http://stackoverflow.com/questions/15371953/memory-mapped-io-vs-port-mapped-io – Pacerier