포트 매핑과 메모리 매핑 액세스의 차이점은 무엇입니까?


19

포트 매핑과 메모리 매핑의 차이점과 두 가지 모두를 달성 한 점을 누구나 설명 할 수 있습니까? 포트 매핑이 필요한 이유, 메모리 맵과 구조가 어떻게 다른지, 많은 아키텍처가 두 가지를 모두 사용하는 이유가 있습니까? 또한 포트가 다른 상황에서 다른 것을 의미 할 수 있기 때문에 이러한 의미에서 "포트"란 무엇입니까?

예 : 포트 포워딩, 통신 엔드 포인트로서의 포트, "포트 매핑".

포트 400h에 OUT을 씁니다 (예 : 가상; 예를 들어 x86-64 등).

메모리에없는 경우 무엇을 또는 ​​어디에 쓰는가? "포트"는 어떻게 매핑되며이 의미에서 무엇입니까?



답변:


24

메모리 매핑 된 I / O 및 포트 매핑 된 I / O는 I / O를 보완하는 두 가지 방법입니다.

메모리 매핑 된 I / O

메모리 매핑 시스템에서 I / O 장치는 메모리의 일부인 것처럼 액세스됩니다. LoadStore명령에서 읽고 그들이 메모리에 사용되는 것처럼, I / O 장치에 쓰기 위해 실행됩니다 (포트 매핑은 I / O를위한 특별한 명령이 있습니다). 이는 I / O 장치가 메모리와 동일한 주소 버스를 사용한다는 것을 의미합니다. 즉, CPU는 주소 값에 따라 메모리 또는 I / O 장치를 참조 할 수 있습니다 . 이 방법을 사용하려면 주소 공간을 분리해야합니다. 즉, I / O 용으로 예약 된 주소를 실제 메모리에 사용할 수 없어야합니다.

아래는 간단한 기본 컴퓨터 시스템 의 이미지입니다 . 현대 시스템에서는이 사례가 훨씬 더 복잡합니다.

여기에 이미지 설명을 입력하십시오


포트 매핑 I / O

Wikipedia 에 따르면

포트 매핑 된 I / O는 종종 I / O를 수행하기 위해 특별한 종류의 CPU 명령을 사용합니다. 이것은 IN 및 OUT 명령어가있는 Intel 마이크로 프로세서에서 찾을 수 있습니다. 이 명령어는 1/4 바이트 (outb, outw, outl)를 읽고 I / O 장치에 쓸 수 있습니다. I / O 장치는 CPU의 물리적 인터페이스에있는 추가 "I / O"핀 또는 I / O 전용 버스 전체를 통해 일반 메모리와 별도의 주소 공간을 갖습니다. I / O의 주소 공간이 주 메모리의 주소 공간과 분리되어 있기 때문에이를 분리 된 I / O라고도합니다.


장단점 : 주변 장치가 메모리보다 느리기 때문에 데이터와 주소 버스를 공유하면 메모리 액세스가 느려질 수 있습니다. 반면, I / O 단순성으로 메모리 매핑 된 시스템은 CPU에 더 적은 내부 로직이 필요하므로 더 빠르고 저렴하며 전력 소비가 적은 CPU를 구현할 수 있습니다. 논리는 RISC 시스템의 논리와 유사합니다. 예를 들어, 복잡성을 줄이고보다 헌신적이고 강력한 시스템을 갖추어 임베디드 시스템에 매우 편리합니다.

반대로 (위키에서 다시) :

포트 매핑 된 I / O 명령어는 종종 매우 제한적이며 종종 CPU 레지스터와 I / O 포트 간의 간단한로드 및 저장 작업 만 제공하므로 포트 매핑 된 장치 레지스터에 상수를 추가하려면 3이 필요합니다. 지침 : 포트를 CPU 레지스터로 읽고 상수를 CPU 레지스터에 추가 한 다음 결과를 포트에 다시 씁니다.

자세한 내용은 해당 위키 기사를 읽는 것이 좋습니다.


질문 중 하나에 대답하려면 :

메모리에없는 경우 무엇을 또는 ​​어디에 쓰는가?

데이터 버스를 통해 I / O 인터페이스의 레지스터에 쓰는 중입니다. 나중에 데이터 버스가 준비되면 데이터를 실제 I / O 장치로 보냅니다. 아래는 예시적인 I / O 장치 인터페이스의 이미지입니다.

여기에 이미지 설명을 입력하십시오


이것이 의미하는 것은 메모리 매핑을 위해 쓰는 것입니다. "이 방법은 주소 공간에서 격리해야합니다. 즉, I / O 용으로 예약 된 주소는 실제 메모리에서 사용할 수 없어야합니다." I / O 용으로 예약 된 주소가 주 메모리에 있고 비 I / O 용으로는 사용할 수 없다는 것을 의미합니까? 분명히 IO 주소와 비 IO 주소는 실제 메모리입니다. 물리적이지 않은 메모리는 없습니다. (당신이 윌리엄 레인 크레이그의 주장을 믿는 사람이 아니라면 (즉, 어떤 것이 물리적이 아닌 두뇌와 기억을 가질 수 있다고!)).
barlop

1
이 글을 쓸 때 "데이터 버스를 통해 I / O 인터페이스의 레지스터에 쓰려고합니다. 데이터 버스는 나중에 (준비 될 때) 실제 I / O 장치로 데이터를 보냅니다. 아래는 I / O 예제 이미지입니다. 장치." IO "레지스터"가 장치에 있는지 확실하지 않습니다. 호출하면 장치에있는 것처럼 들린다 고 생각합니다. 그러나 ".. 나중에 (준비되면) 실제 I / O 장치로 데이터를 전송합니다."라고 쓴다. 따라서이 메모리 위치가 어디에 있는지 확실하지 않다. 장치 내부에 있는지 또는 장치 외부에 있는지 또는 장치 외부에 있는지 여부
barlop

1
헤즈 업 : 저는 마이크로 프로세서 강의에서 배운 것과 위키에서 얻은 것을 수집했습니다. 내가 말했듯이, 첫 번째 의견에서 당신이 묻는 의미는 "IO 주소와 비 IO 주소는 실제 메모리입니다"라는 생각 은 분명 하지 않습니다 . 실제로 (내가 아는 한, 내가 가르치는 한) 주소 코드 디코더는 IO 주소가 지정 될 때 IO 인터페이스를 활성화합니다. 즉, 주소를 제공 할 때 물리적 주소의 범위 내에 있지 않아야 합니다. , 물리적 인 경우 $ 0000-$ 00FF, IO의 경우 $ 0100-$ 01FF (금액을 무시하고 경계를 돌림).
Varaquilex

@barlop 두 번째 질문은 "아래는 I / O 장치 인터페이스 의 예 입니다."라는 의미입니다. 방금 편집 한 내용에서이 문제를 해결했습니다. 편집이 혼란을 없애기를 바랍니다. 그렇지 않은 경우 더 문의하십시오. 최선을 다해 답변을 드리겠습니다.
Varaquilex

1
@barlop 메모리의 위치는 내가 접한 대부분의 게시물과 문헌에서 모호합니다. 그들은 당신이 이미 알고 있다고 생각하거나 실제로 모른다. 대답은 LDD3 ch 의이 단어들에 있다고 생각합니다. 9 : "I / O 메모리는 단순히 장치 버스를 통해 프로세서에 제공 하는 RAM과 유사한 위치입니다 ." (이탈리아어 추가) 즉, 메모리 및 / 또는 레지스터가 장치에 있습니다. I / O 포트 및 I / O 메모리는 시스템이 해당 위치를 소프트웨어에서 사용할 수있게하는 두 가지 방법 일뿐입니다.
orodbhen

2

메모리 매핑 된 I / O (간단히 MMIO)에서는 실제로 메모리에 액세스하기위한 명령을 통해 장치에 액세스합니다. 각 장치는 특정 메모리 주소를 얻습니다. 그러나 메모리의이 부분을 읽거나 쓰려고하면 특정 장치 (예 : 노스 브릿지)가 대신 관련 장치로 장치를 보냅니다. 컴퓨터에 이러한 주소를위한 메모리가 충분하지 않더라도 (MMIO 주소가 매우 높기 때문에) 실제 메모리 (마더 보드를 볼 때 볼 수있는 메모리, RAM이라고 함)는 중요하지 않습니다. )도 관련이 없습니다. address에 충분한 RAM이 있으면 더 높은 비 I / O에 매핑되거나 읽거나 쓸 수 없다는 의미가 손실됩니다.

포트 매핑 I / O (단순한 PMIO)는 매우 다릅니다. 포트를 읽고 쓰는 데 사용되는 지침이 다릅니다. 주소가 실제로 장치와 통신하는 I / O 주소이거나 유효하지 않은 메모리 주소 공간과 같은 포트 주소 공간이 있습니다. PMIO는 본질적으로 I / O 전용 메모리 주소 공간이있는 MMIO로 생각할 수 있습니다.


"PMIO는 본질적으로 I / O 전용 메모리 주소 공간을 가진 MMIO로 생각할 수 있습니다." -주소 공간은 그렇게 단순하고 기본적인 개념입니다. 왜 합리적인 답변에 대한 오해의 소지가 있습니까? 오해의 소지가있는 사실은 변경되지 않습니다. 예를 들어 "메모리 주소 공간"외에 다른 주소 공간이있을 수 있습니다.
톱밥

1

'I / O 신호'및 '메모리 매핑'과 같은 이름을 사용하면 모든 것이 실제보다 훨씬 복잡해 지므로 사람에게 더 많은 인상을주고 고급 주제를 다룹니다. 사람들이 그것을 새로운 것으로 보는 경향이 있습니다. 그러나 이것은 사실과는 거리가 멀다. 1830 년대의 Babbage조차도 그의 프린터를 운전했는데, 이것은 엑셀과 톱니 바퀴에 의해 수행되었지만 I / O 신호가 필요했습니다. 예를 들어 2000 년 전 알렉산드리아의 영웅 기계 나 그리스 시대의 극장에서 조명이나 풍경을 제어하기 위해 항상 다른 로프 세트에서 로프를 뽑았습니다. 각 로프는 입력 및 출력 라인과 같습니다. 간단히 말해, 주소는 '어떤 라인'입니다. 즉, 우리가 선택하는 것, 메모리 또는 장치,

건물로 캐비닛을 가득 채운 대형 메인 프레임 컴퓨터가 40 년대에 64 비트와 같은 것을 사용했기 때문에 콘래드 주세 (Konrad Zuse)와 그의 방 크기 컴퓨터는 플로팅을 사용하는 등의 I / O 매핑을 처리했습니다. 1930 년대 10 진수로 약 20 자리의 숫자를 가지고 프린터와 다양한 전구 표시기 및 스위치와 같은 것을 구동해야했습니다. 그러나 작은 마이크로 프로세서에서는 60 년대까지 구상하지 않고 1971 년까지 구축 된 이야기가 다릅니다. 80 년대 8 비트 로직을 사용하는 이러한 모든 기술은 70 년대 4 비트, 60 년대 2 비트에 사용되었습니다. 90 년대 16 비트 모든 사람들이 컴퓨터를 갖기 시작했을 때, 이제는 그들 앞에 있었기 때문에이 I / O와 메모리 매핑 주제에 대해 처음으로 논의하기 시작했고, 인터넷의 출현과 함께 새로운 것이었던 것 같습니다. 우리는 00 년대에는 32 비트를, 10 년대에는 64 비트 컴퓨터를 사용했으며, 그 결과 메모리 다운 데이터 라인에 대한 끝없는 논의가있었습니다. 귀하의 질문에 대답하기 위해 전자 취미 애호가가 30-40 년 전에 구입 한 칩에 대해 이야기 할 것입니다. 예를 들어, 그 이후로, 나중에는 칩이 너무 발전하여 나중에 칩으로 만들 수 없었습니다. 원리는 이제 동일합니다. 게이트는 더 큰 블랙 박스 칩 안에 숨겨져 있습니다.이 칩은 이러한 동작을 훨씬 더 병렬로 처리하는 다른 핀을 통합합니다 (예 : 많은 8 진 래치 활성화,

글쎄, 나는 모든 새로운 언어 나 현대 PC에 대한 언어에 대해 전혀 모른다. 그러나 칩으로 컴퓨터를 만들 때 옛날에 어떻게 사용되었는지 말할 수있다.

모든 I / O 매핑 및 메모리 매핑은 간단한 용어로, 일부 축하를 위해 전구의 예를 들어 올리고 각각 와이어를 연결하여 전구 메모리 위치라고 불렀습니다 (예 : 전구는 RAM의 메모리를 나타냄). 켜거나 끄고 위치 0을 선택하면 와이어 0, 위치 1, 와이어 1, 위치 2 와이어 2 등을 얻습니다.) 예를 들어 하나의 와이어가 벨이면 특정 위치는 메모리가 아닙니다. OUT 명령을 사용하여 출력하기 위해 출력하는 장치입니다. 그러나 컴퓨터의 관점에서 볼 때 메모리 위치로 간주됩니다. MPU와 똑같이 연결되기 때문입니다. 외부에서 작동 한 스위치 인 다른 와이어가 추가 된 경우 이것은 I / O 장치이며 PC에 대한 IN 명령어입니다. 이를 I / O 매핑 I / O라고합니다.

이제 컴퓨터에서 버스의 와이어는 주소 라인 또는 데이터 라인을 나타내지 만 2 진으로되어 있습니다. 즉 2 개의 와이어를 사용하면 00 01 10 11 즉 4 개의 조합 2 ^ 2를 가질 수 있으므로 8 개의 라인이 2 ^ 8 = 256 일 수 있습니다. 20 줄 2 ^ 20 = 1048576 30 줄 2 ^ 30 = 1073741824 (1 기가) 30 줄. 따라서 I / O와 메모리를 말하는 것이 아니라 MAPPED라고 부르는 이유는 와이어를 바이너리 바이너리 코딩으로 조합하기 때문에 I / O 매핑 및 메모리 매핑이라고 말하는 것입니다. 따라서 2 개의 전선, 4 개의 조합이 있다면 전구에 연결할 수는 없지만 (MPU의 작은 전압에서 요구되는 전류 증폭 및 피드백 전류 방지는 말할 것도없고) 2 개의 전선은 디코더를 통과하기 위해 (우리는 3 라인을 8 라인으로 디코딩하기 위해 138을 사용했고, 164는 4 바이너리 라인을 16 라인으로 디코딩하기 위해 사용했습니다. ) 디코더를 통해 A0 및 A1 (주소 0 및 주소 1 (LINES))과 같은 두 줄은 운전중인 특정 전구 (컴퓨터의 경우 THE MEMORY)에 대해 4 줄 (켜기 또는 끄기)이되지만 경우에 따라 이러한 위치는 대신 일부 입 / 출력 장치를 선택하고 대신 '나를 사용하십시오'라고 말하십시오. 즉, 일단 메모리가 위치하면 데이터가 한 방향 또는 다른 방향으로 전달됩니다 (영리한 3 상태 논리를 사용하여 도중에 전압을 차단 함) 매번 데이터 버스 라인 D0..7 또는 D0..31 또는 컴퓨터의 데이터 크기 (2 비트, 4 비트, 8 비트, 16 비트, 32 비트, 64 비트, 128 비트, 256 비트, 컴퓨터 등) 컴퓨터)). 따라서 데이터는 데이터 라인에서 메모리 또는 I / O 장치 (메모리가 매핑 된 경우)로 자연스럽게 들어가거나 나옵니다. 그러나이 명령은 IN / OUT 명령어와 혼동해서는 안됩니다. 이 IN 및 OUT은 다른 I / O 메모리 블록, 즉 I / O 전용으로 할당 된 MPU 내부의 특수 I / O 메모리 블록, 즉 (메모리 매핑되지 않음)을 의미합니다.이 I / O 공간은 항상 얻을 수있는 것은 아닙니다. 일부 마이크로 프로세서의 경우, 예를 들어 6502에는 없다고 생각하지만 z80에는 있습니다. 보다 예술적인 칩은 메모리 매핑 만 사용합니다 (예 : 게임 콘솔 등).보다 합리적이지만 흥미롭지 않은 (책에 남아있는) 칩도 I / O 공간을 위해 사용됩니다. 메모리 매핑 I / O는 메모리 주소 지정 (RAM에 대해 매우 빠름)을 통합하므로 속도가 매우 빠르므로 그래픽 유형 컴퓨터는 I / O에 대한 메모리 매핑 만 사용하여 속도를 얻습니다. I / O 매핑 된 I / O는 느린 포트 (예 : rs232) 또는 병렬 포트에 할당되며 IN OUT 명령을 사용합니다. 이자형. (메모리 매핑되지 않음),이 I / O 공간은 항상 일부 마이크로 프로세서에 도달하지는 않습니다. 예를 들어 6502에는 없다고 생각하지만 z80에는 있습니다. 보다 예술적인 칩은 메모리 매핑 만 사용합니다 (예 : 게임 콘솔 등).보다 합리적이지만 흥미롭지 않은 (책에 머물러있는) 칩도 I / O 공간에 사용됩니다. 메모리 매핑 I / O는 메모리 주소 지정 (RAM에 대해 매우 빠름)을 통합하므로 속도가 매우 빠르므로 그래픽 유형 컴퓨터는 I / O에 대한 메모리 매핑 만 사용하여 속도를 얻습니다. I / O 매핑 된 I / O는 느린 포트 (예 : rs232) 또는 병렬 포트에 할당되며 IN OUT 명령을 사용합니다. 이자형. (메모리 매핑되지 않음),이 I / O 공간은 항상 일부 마이크로 프로세서에 도달하지는 않습니다. 예를 들어 6502에는 없다고 생각하지만 z80에는 있습니다. 보다 예술적인 칩은 메모리 매핑 만 사용합니다 (예 : 게임 콘솔 등).보다 합리적이지만 흥미롭지 않은 (책에 머물러있는) 칩도 I / O 공간에 사용됩니다. 메모리 매핑 I / O는 메모리 주소 지정 (RAM에 대해 매우 빠름)을 통합하므로 속도가 매우 빠르므로 그래픽 유형 컴퓨터는 I / O에 대한 메모리 매핑 만 사용하여 속도를 얻습니다. I / O 매핑 된 I / O는 느린 포트 (예 : rs232) 또는 병렬 포트에 할당되며 IN OUT 명령을 사용합니다. 더 현명하지만 흥미롭지 않은 (도서에 머물러있는) 칩도 I / O 공간에 사용됩니다. 메모리 매핑 I / O는 메모리 주소 지정 (RAM에 대해 매우 빠름)을 통합하므로 속도가 매우 빠르므로 그래픽 유형 컴퓨터는 I / O에 대한 메모리 매핑 만 사용하여 속도를 얻습니다. I / O 매핑 된 I / O는 느린 포트 (예 : rs232) 또는 병렬 포트에 할당되며 IN OUT 명령을 사용합니다. 더 현명하지만 흥미롭지 않은 (도서에 머물러있는) 칩도 I / O 공간에 사용됩니다. 메모리 매핑 I / O는 메모리 주소 지정 (RAM에 대해 매우 빠름)을 통합하므로 속도가 매우 빠르므로 그래픽 유형 컴퓨터는 I / O에 대한 메모리 매핑 만 사용하여 속도를 얻습니다. I / O 매핑 된 I / O는 느린 포트 (예 : rs232) 또는 병렬 포트에 할당되며 IN OUT 명령을 사용합니다.

이제 두 개의 와이어를 추가하는 대신 원래 전구에 있던 두 개의 와이어를 실제로 교체하고 해당 전구 중 일부를 가져다가 다른 것으로 교체 한 경우 (예 : 하나의 벨과 다른 하나의 스위치)이 참조되지 않습니다 (선택됨) )을 각각 IN 및 OUT 명령어와 함께 사용하면 해당 와이어 (원래 전구)를 선택하는 특정 메모리 위치에 액세스하여 참조됩니다. 이것이 메모리 매핑 I / O입니다.

메모리 매핑 된 I / O는 일반적으로 메모리 (RAM)로 이동하는 실제 주소 버스가 다른 디코더 (로직 디코더)에도 연결되어 있으며, 특정 이진 조합의 주소 신호를 감지하면 높은 출력을 생성합니다. (예를 들어, 게이트가 있고로드되지 않았으며 핀 A0..A20 또는 주소 버스의 크기를 사용하여 말하거나 그렇지 않은 경우),이 높은 신호는 래치를 활성화합니다. (직렬 포트, 병렬 포트와 같은 특정 장치의 경우)이 래치는 데이터 버스의 데이터를 I / O 장치로 전달합니다. 이것은 I / O 장치에 쓰기위한 것입니다. 읽기는 I / O 장치와 반대로 작동하며 데이터를 다시 전달하며 올바르게 기억하면 정확히 동일한 주소 코드 조합을 주소 라인으로 보냅니다.

나는 그것이 훨씬 더 많은 데이터와 주소 줄이라는 것을 제외하고는 오늘날에도 이와 같은 방식으로 작동해야한다고 가정합니다.

문자 그대로 I / O를 주소 라인에 배선합니다. 따라서 I / O는 마치 메모리 인 것처럼 메모리 공간에 효과적으로 매핑됩니다. 그러나 다른 래치는 주소 핀이 동시에 램에 액세스하는 것을 비활성화하여 동일한 라인에서 두 개의 주소 또는 데이터 소스의 전압을 얻지 못하게하여 칩을 손상시킵니다.

IN과 OUT 명령으로, 우리는 40 년 전 z80 칩에있었습니다. 이것은 칩이 실제로 I / O 자체를 다른 방식으로 처리하는 특수한 경우를위한 것입니다. 즉, 메모리 매핑되지 않습니다. (즉, 메모리가 매핑되면 메모리 위치를 읽거나 쓰지만 IN 및 OUT을 사용하면 이미 CPU가 메모리가 아니라 I / O 신호임을 ​​CPU에 알리는 것입니다). 따라서 IN / OUT 명령어를 사용하면 자체 I / O 주소 공간 (램 메모리에 추가로 제공됨)이 있으며,이 I / O Ram은 보이는 것처럼 주소 집합이 동일합니다. 해당 I / O 주소에 대한 디코더 연결을 통해 장치에 직접 액세스하고 표준 주소 핀에서 I / O 장치에 액세스하지 않는 경우를 제외하고는 IN / OUT 명령어입니다.

이 경우 문자와 숫자에 대한 ASCII 코드 문자열로 전달되는 것이 가장 좋습니다. 이 명령은 카운트가 문자열 길이 인 루프에서 IN 및 OUT 명령을 사용한 것과 동일합니다.

예를 들어 PC 스피커에 액세스하는 경우 OUT을 사용하여 한 번에 하나의 데이터 만 전달합니다.

병렬 포트에서 읽는 중이라면 IN을 수행하고 포트의 I / O 주소 코드를 사용하는 것입니다. 예를 들어 전자 신호로 오래된 프린터 나 로봇을 구동하려면 OUT 명령을 사용하십시오. 병렬 포트 및 직렬 포트 (이전 RS232)는 일반적인 포트입니다. RS232는 직렬 데이터이며, 1 비트 만 출입 할 수 있으므로, rs232에서 읽는 경우 출력과 동일한 1 비트의 바이트 만 가질 수 있습니다. 전송 속도는 rs232의 경우 최대 약 17kHz이지만 전자를 많이 구동하는 데 사용되었습니다. 예를 들어 전압을 읽거나 PIC 마이크로 컨트롤러를 구동하는 등 rs232 회로를 구축하는 데 사용했습니다. 각 포트의 이름은 예를 들어 COM1 COM2 COM3 COM4이며 I / O 주소가 있습니다. 나는 여기에 확실하지 않지만, 예를 들어 3F8h 378h와 비슷합니다 (h = 16 진수 주소)

최신 포트는 확실하지 않지만 USB에 쓰는 경우 속도가 더 빠른 메모리 매핑 I / O 일 가능성이 높습니다.

PS / 2 키보드 포트는 IN 명령어를 사용하여 키보드에서 데이터를 읽습니다. 이것은 이전 RS232를 대체하지만 약간 다른 사양을 가지고 있습니다.

디스크 드라이브는 일반적으로 메모리에 매핑 된 것으로 추정됩니다. 예를 들어 IN / OUT 명령어로 디스크 드라이브를 구동하지 않으면 속도가 너무 느립니다. 그러나 포트는 느리므로 문제가되지 않습니다. 예를 들어 프린터는 하드 디스크에 필요한 200MB / 초와 비교할 때 필요한 데이터 속도만큼 느립니다. 스피커는 약 10 또는 20의 사운드 시간의 주파수 만 필요합니다. 20kHz는 버저에 충분할 것이므로 I / O입니다. 느린 것은 I / O, IN / OUT 명령어를 사용합니다. 따라서 USB는 아마도 메모리에 매핑되었을 것이므로 확인해야합니다.

그것을 이해하는 더 좋은 방법은 이것입니다. 80 년대의 오래된 컴퓨터에서는 때때로 당신이 만든 일부 장치를 제어하고 싶었고 출력 포트에 대한 사양이 없었습니다. 일부 비즈니스 거래에 의한 시장). 컴퓨터를 열고 말 그대로 주소 버스의 일부 지점에 와이어를 납땜하는 것이 좋습니다. 예를 들어 안전한 거리에서 회로의 특정 지점에 3 개의 와이어를 납땜했습니다 (열로 인해 칩이 손상되지 않도록). 회로 보드 레이아웃에 의해 배선 된 포인트, 예를 들어 마이크로 프로세서의 핀 A15 A7 및 A1. 또한 보통 MREQ 라인 (메모리 요청 라인 및 / 또는 RD / WR 라인)을 연결하여 더 깔끔한 신호를 만들어 로직에 추가하거나 로직에 추가하지 않아야합니다. 그러나 당신이 영리하다면 당신은 주소 라인으로 그것을 할 수 있습니다) 그리고 당신은이 세 가지 와이어 +이 여분의 준비 유형 신호 (예 : MREQ RD 또는 WR 라인을 연결하여 약간의 활성을 제공합니다. 200 ohm 저항을 통해 LED에 출력을주는 4 입력 AND 게이트를 통해 DATA가 라인에 지금 준비되어 있다고 말하면 고속 I / O를 LED 조명에 매핑 한 자체 메모리가 있습니다. SR 래치 또는 D 유형 래치를 통해 래치하여 일부 회로 보드의 외부에서 1 비트 메모리에 저장할 수 있습니다. 여기 15는 32K 라인, 7은 64 라인, 1은 2 라인 (이진수는 2의 거듭 제곱이므로 A1은 2 ^ 1, A7은 2 ^ 7, A15는 2 ^ 15)입니다. 32768 + 64 + 2 = 32834 = 16 진수로 F041 주소 지정, 어셈블러의 이전 MPU에서 LDA 또는 STA 또는 LD를 사용하면이 led로 출력됩니다. 저항이 약 100 옴이라고하면 밝게 빛날 것입니다. 그래서 당신은 메모리 매핑 I / O를하였습니다. 그것은 당신의 mpu 주소 라인에 동일한 방식으로 납땜함으로써 오늘날 그렇게 할 수 있습니다. 그러나 회로의 섬세함으로 인해 지금은 그렇게하지 않을 것입니다. 그러나 데이터 라인 D0..7 (이전의 날짜)에 가입하거나 이전 486 PC의 32 비트에 대해 d0..31이라고 말할 수도 있습니다. 그런 다음 값이 8 인 어큐뮬레이터 (현재 ax, 8)로 어큐뮬레이터로드를 수행하거나 해당 어큐뮬레이터 값을 주소 위치 (mov F041h, ax accumulator)에 저장하여 머신 코드에서 해당 위치를 지정했다면 오늘도 그 결과가 나올 것입니다 예제에서 8은 데이터 버스에있는 것입니다.이 특별한 경우에는 데이터를 전달하지 않고 특정 장치 만 활성화하고 있습니다 (LED가 켜져 있고 I / O 장치를 선택한 경우, 여기 LED 만) 따라서이 예제에서는 MOV ax, 8 명령어의 숫자가 중요하지 않습니다. 예를 들어 mov ax, 243 일 수 있으며 mov F041h를 수행 할 때 F041h 라인의 LED를 계속 활성화합니다. 우리는 같은 주소를 사용하고 있기 때문에. 주소 라인과 데이터 라인이 있습니다. 따라서 COM1에서 3F8을 주소 지정하거나 주소가 무엇이든간에, I / O 메모리 맵은 단순히 신호를 포트, 예를 들어 ps / 2로 전송하고 있으며 게이트는 1110000100이 라인에 있는지 확인합니다. 3 1000은 F이고 0100은 8입니다. 2 진수에서 16 진수로의 변환을 참조하십시오. 1이있는 비트 위치에 고전압이 나타나는 경우, 포트 (예 : rs232 또는 ps / 2)가 활성으로 설정되어 활성화됩니다. 즉, 활성화되면 CE 칩 활성화 신호 또는 CS 칩에 의해 래치가 활성화됩니다. 간단하게 선택하십시오. 8 명령, 예를 들어 mov ax, 243 일 수 있으며 동일한 주소를 사용하기 때문에 mov F041h를 수행 할 때 F041h 라인의 LED를 계속 활성화합니다. 주소 라인과 데이터 라인이 있습니다. 따라서 COM1에서 3F8을 주소 지정하거나 주소가 무엇이든간에, I / O 메모리 맵은 단순히 신호를 포트, 예를 들어 ps / 2로 전송하고 있으며 게이트는 1110000100이 라인에 있는지 확인합니다. 3 1000은 F이고 0100은 8입니다. 2 진수에서 16 진수로의 변환을 참조하십시오. 1이있는 비트 위치에 고전압이 나타나는 경우, 포트 (예 : rs232 또는 ps / 2)가 활성으로 설정되어 활성화됩니다. 즉, 활성화되면 CE 칩 활성화 신호 또는 CS 칩에 의해 래치가 활성화됩니다. 간단하게 선택하십시오. 8 명령, 예를 들어 mov ax, 243 일 수 있으며 동일한 주소를 사용하기 때문에 mov F041h를 수행 할 때 F041h 라인의 LED를 계속 활성화합니다. 주소 라인과 데이터 라인이 있습니다. 따라서 COM1에서 3F8을 주소 지정하거나 주소가 무엇이든간에, I / O 메모리 맵은 단순히 신호를 포트, 예를 들어 ps / 2로 전송하고 있으며 게이트는 1110000100이 라인에 있는지 확인합니다. 3 1000은 F이고 0100은 8입니다. 2 진수에서 16 진수로의 변환을 참조하십시오. 1이있는 비트 위치에 고전압이 나타나는 경우, 포트 (예 : rs232 또는 ps / 2)가 활성으로 설정되어 활성화됩니다. 즉, 활성화되면 CE 칩 활성화 신호 또는 CS 칩에 의해 래치가 활성화됩니다. 간단하게 선택하십시오. 동일한 주소를 사용하고 있기 때문에 주소 라인과 데이터 라인이 있습니다. 따라서 COM1에서 3F8을 주소 지정하거나 주소가 무엇이든간에, I / O 메모리 맵은 단순히 신호를 포트, 예를 들어 ps / 2로 전송하고 있으며 게이트는 1110000100이 라인에 있는지 확인합니다. 3 1000은 F이고 0100은 8입니다. 2 진수에서 16 진수로의 변환을 참조하십시오. 1이있는 비트 위치에 고전압이 나타나는 경우, 포트 (예 : rs232 또는 ps / 2)가 활성으로 설정되어 활성화됩니다. 즉, 활성화되면 CE 칩 활성화 신호 또는 CS 칩에 의해 래치가 활성화됩니다. 간단하게 선택하십시오. 동일한 주소를 사용하고 있기 때문에 주소 라인과 데이터 라인이 있습니다. 따라서 COM1에서 3F8을 주소 지정하거나 주소가 무엇이든간에, I / O 메모리 맵은 단순히 신호를 포트, 예를 들어 ps / 2로 전송하고 있으며 게이트는 1110000100이 라인에 있는지 확인합니다. 3 1000은 F이고 0100은 8입니다. 2 진수에서 16 진수로의 변환을 참조하십시오. 1이있는 비트 위치에 고전압이 나타나는 경우, 포트 (예 : rs232 또는 ps / 2)가 활성으로 설정되어 활성화됩니다. 즉, 활성화되면 CE 칩 활성화 신호 또는 CS 칩에 의해 래치가 활성화됩니다. 간단하게 선택하십시오. 11은 3 1000은 F이고 0100은 8입니다. 이진수에서 16 진수로의 변환을 참조하십시오. 1이있는 비트 위치에 고전압이 나타나는 경우, 포트 (예 : rs232 또는 ps / 2)가 활성으로 설정되어 활성화됩니다. 즉, 활성화되면 CE 칩 활성화 신호 또는 CS 칩에 의해 래치가 활성화됩니다. 간단하게 선택하십시오. 11은 3 1000은 F이고 0100은 8입니다. 이진수에서 16 진수로의 변환을 참조하십시오. 1이있는 비트 위치에 고전압이 나타나는 경우, 포트 (예 : rs232 또는 ps / 2)가 활성으로 설정되어 활성화됩니다. 즉, 활성화되면 CE 칩 활성화 신호 또는 CS 칩에 의해 래치가 활성화됩니다. 간단하게 선택하십시오.

래치에서는 E Enable 핀 또는 OE active low 출력 활성화입니다. 즉, 위에서 설명한 예에서는 주소를 사용하여 사용하려는 WHICH I / O 장치를 선택 (디코딩하여)합니다 (예 : 해당 I / O 장치가 선택된 경우 LED가 켜지는 예). 그런 다음 I / O 장치를 선택하면 데이터 버스 (이전의 D0..7 또는 64 비트 컴퓨터의 경우 예 D0..63)에서 이전의 3 진 래치 373을 통해 데이터가 전달됩니다. 요즘은 플립 플롭 내부에 데이터를 저장하는 D 형 플립 플롭 회로로 액티브 하이 클럭 에지에서는 데이터가 통과하여 저장됩니다.이 클럭 에지는 데이터 신호의 'DATA RDY'신호에서 나옵니다. , 여기에는 다양한 이름이 있는데, 현재 이름이 무엇인지 모르겠습니다 .64 비트의 경우 8 개의 8 진 래치가 있습니다. 또한 양방향 래치를 사용하여 데이터를 양방향 또는 3 상태로 제어하므로 I / O 장치를 사용하지 않을 때 데이터 라인이 높은 임피던스 상태에있게됩니다. 따라서 주소 라인에서 조합을 사용하여 I / O 장치를 선택합니다. 이것은 숫자입니다 (예 : OUT 3F8h의 3f8h, 7). 여기서 예제 7의 데이터는 데이터 라인에 전달 된 것입니다. OUT 명령은 데이터가 OUT을 데이터 래치로 전달하고 I / O 장치로 전달합니다. IN이 있다면 IN 3f8h, 800h와 같은 명령을 수행 할 것입니다. (예상하지만 x86 어셈블러의 구문을 알지 못합니다) IN의 경우 데이터를 입력하는 것입니다. 데이터 라인 (주소를 선택한 후 (예 : 3F7h, THAT I / O 장치를 선택))이 데이터는 I / O 장치에서 가져옵니다. 데이터 래치의 D 형 플립 플롭 (데이터 버스 라인의 각 비트마다 하나씩)을 통해 MPU 마이크로 처리 장치의 D0..7 또는 (D0..63) 핀에 입력됩니다. ). 이 예에서는 IN 3f8h, 800h를 입력하여 데이터가 들어 오면 주소 800h에 저장됨을 보여줍니다. x86의 구문이 다르다고 생각합니다. 아마 3f8h에서 아와 비슷한 것을해야합니다. 즉, 데이터가 들어있는 레지스터로 먼저 들어가면 MOV 800h가됩니다. 즉, 데이터를 메모리로 옮깁니다. RAM의 위치 (저장하고 싶다면) 또는 ah 등으로 다른 작업을 수행하십시오. ah는 레지스터 예입니다. 어떤 것이 든 al, bh, bl 등이 될 수 있지만 구문을 확인하십시오. 모든 어셈블러 시스템은 약간 다른, 나는 x86의 전문가가 아닙니다. 다시 한 번, I / O 주소의 예로 3f8h를 사용하고 있습니다.

메모리에 액세스 할 때 (90 년대, 70 년대에는 RAM, 예를 들어, 70 년대에는 64 바이트 정적 램, 80 년대에는 8K SRAM 및 DRAM, DRAM, 각각 몇 메가 바이트 (라인 메모리 모듈에 단일) 인 SIMMS 행) DIMM을 포함하는 DDR 모듈, 듀얼 인라인 메모리 모듈의 형태이며, 확인하지는 않았지만 최신 I / O 주소가 아닌 경우 (각각 작은 칩마다 몇 기가 바이트가 있음) 의심의 여지가 없습니다. 몇 개의 주소는 I / O 주소이며, 요즘 메모리는 현대 PC의 I / O보다 주소 공간에 수백만 번 이상있을 가능성이 높습니다) 여전히 메모리에 동일한 읽기 / 쓰기 데이터 명령어를 사용하지만 그렇지 않습니다 이러한 비트를 찾는 외부 로직 회로를 구동하는 대신 어드레스 및 데이터 핀이 RAM 칩에 직접 연결됩니다.

머신 코드에서, I / O와 메모리 어드레싱은 마치 둘 다 메모리 액세스 인 것처럼 동일하게 보이지만 실제 전자 회로에서는 물리적으로 진행되는 것과 완전히 다릅니다.

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