0

메모리 맵핑은 I가 O, 그때는 가상 메모리 시스템을 사용하지 않으면,이 장치장치 드라이버

에 할당 된 물리적 메모리의 특정 범위가있다 즉/이용한 디바이스 있다고 가정 해당 물리적 ​​주소로 수행되는 읽기/쓰기 작업을 통해 장치를 조작하는 것은 매우 간단합니다.

가상 메모리 시스템이 있으면 어떻게됩니까?

장치 드라이버는 해당 장치에 할당 된 특정 실제 메모리 범위를 알고 있어야하지만 물리적 주소 대신 가상 주소를 사용해야하는 경우 해당 주소 범위에 어떻게 액세스합니까?

답변

1

메모리 매핑 IO 장치의 경우 해당 장치에서 공유하는 모든 물리적 주소는 ioremap() API [1]를 사용하여 커널 가상 메모리에 매핑 할 수 있습니다.

따라서 우리는 커널 주소를 얻기 위해 ioremap()을 사용하여 실제 주소 0x1234를 매핑하고이 주소에 데이터 쓰기를 시작할 수 있습니다.

[1] http://lxr.gwbnsh.net.cn/linux/arch/cris/mm/ioremap.c

+0

실제로 메모리 매핑 된 I/O 장치 드라이버가 작성 될 때 어떻게 수행 되는가? – mangusta

+0

예, 그렇습니다. TI OMAP 칩셋 용으로 작성된이 직렬 드라이버를 살펴보면 UART 물리적 주소 범위가 VM에 어떻게 재 매핑되는지를 알 수 있습니다. http://lxr.free-electrons.com/source/drivers/tty/serial/omap-serial.c#L1496 –

0

내가 해낸 지 오래되었지만, 실제 메모리 블록을 매핑하면 사용자 공간의 주소가 해당 실제 메모리에 해당한다는 것을 기억합니다. 사용자 공간 주소에 기록하는 것은 실제 메모리에 쓰기입니다.

+0

나는 확실히 당신이 무슨 뜻인지 이해 생각하지 않습니다. 내 말은, 예를 들어, 내 프로그램은 직렬 포트를 통해 char을 보내려고하므로 직렬 장치 드라이버의 일부인 serial_sendchar() 루틴을 호출합니다. 직렬 포트를 통해 char을 보내려면이 char을 실제 주소 0x1234에 써야한다고 가정하십시오. 내 질문에 serial_sendchar() 루틴은 가상 주소를 사용해야하는 경우 해당 특정 주소로 어떻게 기록합니까? 그 특정 물리적 주소에 쓰기를해야한다면 가상 대 실제 번역을 우회해야합니까? – mangusta