mmio는 io 장치로 어떻게 라우팅됩니까?

mmio는 io 장치로 어떻게 라우팅됩니까?

저는 Linux를 실행하는 최신 x86 시스템에서 IO 장치가 "일반" 메모리 주소 공간에 어떻게 매핑되는지 이해하려고 합니다.

내가 이해하려는 몇 가지 세부 사항은 다음과 같습니다.

  1. cat /proc/iomemIO 메모리 매핑 영역 목록을 인쇄합니다(인쇄물리적주소)가 불연속적입니다.

  2. 이러한 영역은 커널 모듈에 의해 런타임 시 동적으로 요청될 수 있으며 <linux/ioport.h>에 정의된 request_mem_region 함수를 통해 할당될 수 있습니다.

  3. x86 머신은 mov메모리 액세스와 IO(메모리에 매핑됨) 모두에 사용됩니다.

이제 커널 모듈 코드가 실행 중이라고 가정하면 mov [value] [virtual address]mmio 영역을 참조할 수 있는 가상 주소나 메모리에 존재하는 "정상" 데이터 값과 같은 명령을 접할 수 있습니다. "일반" 메모리에서 mmio 트래픽을 분리하는 프로세스에는 두 가지 주요 단계가 있습니다.

  1. 결정하다만약에주소는 mmio 입니다. 페이지 테이블에는 메모리 매핑 여부를 나타내는 플래그가 있으므로 페이지 테이블 변환을 수행할 때 mmu가 이를 결정한다고 가정합니다.
  2. 새로 생성된 물리적 주소(페이지 테이블 변환의 출력인 mmu)의 "IO 주소"를 결정하고 이를 IO와 인터페이스하는 모든 칩(노스브리지, 루트 콤플렉스 등)에 전달합니다.

질문 1: 위의 1단계를 올바르게 이해하고 있나요?

질문 2: 2단계는 어떻게 진행되나요? (무슨 뜻으로실재지도는 어떻게 저장되나요? )

확인해야 할 범위는 /proc/iomem에 나열되어 있으며, 여기에서 가져오는 데이터는 다음과 같은 맵인 것 같습니다. map[mmio_address] = io_address_object

이런 일이 일어나고 있다는 것을 기억하세요이내에movCPU의 관점에서 단일 명령의 컨텍스트를 살펴보면 이러한 변환이 CPU 외부 하드웨어 이외의 다른 것을 통해 어떻게 발생할 수 있는지 알 수 없습니다.

답변1

1단계에 대한 이해가 정확합니다. MMU는 해당 가상 주소에 대한 페이지 테이블 항목을 확인하여 주소가 MMIO인지 여부를 결정합니다.

2단계에서 물리적 주소를 해당 IO 주소로 매핑하는 역할을 담당하는 개체는 마더보드의 칩셋입니다. 칩셋에는 일반적으로 CPU의 IO 요청을 처리하고 이를 시스템에 연결된 다양한 IO 장치가 이해할 수 있는 신호로 변환하는 MMIO(Memory Mapped IO) 컨트롤러가 포함되어 있습니다.

MMIO 컨트롤러는 일반적으로 각 MMIO 주소 범위를 각 IO 장치의 해당 IO 주소 범위에 매핑하는 메모리 맵을 유지 관리합니다. 이 메모리 맵은 일반적으로 칩셋 내의 하드웨어 레지스터에 저장되며 시스템 초기화 중에 BIOS에 의해 프로그래밍됩니다.

CPU가 MMIO 작업을 수행하면 MMU는 가상 주소를 물리적 주소로 변환한 후 이를 MMIO 컨트롤러로 보냅니다. MMIO 컨트롤러는 메모리 매핑을 사용하여 물리적 주소에 해당하는 IO 주소를 결정하고 적절한 IO 신호를 생성하여 IO 장치와 통신합니다.

요약하면 MMIO 주소와 IO 주소 간의 매핑은 칩셋의 MMIO 컨트롤러에 의해 유지되며 이 매핑은 시스템 초기화 중에 BIOS에 의해 프로그래밍됩니다.

관련 정보