저는 현재 Ubuntu용 PCI 장치 드라이버를 개발 중입니다. PCI 드라이버에 대한 몇 가지 샘플 코드가 있지만 ioremap 및 file_Operation.mmap을 이해하는 데 문제가 있습니다.
파일 작업 mmap 지침:
메모리 매핑은 현대 Unix 시스템의 가장 흥미로운 기능 중 하나입니다. 운전자 측에서는 사용자 프로그램이 장치 메모리에 직접 액세스할 수 있도록 메모리 매핑을 구현할 수 있습니다. 장치 매핑은 일련의 사용자 공간 주소를 장치 메모리와 연결하는 것을 의미합니다. 프로그램이 지정된 주소 범위 내에서 읽거나 쓸 때마다 실제로 장치에 액세스하는 것입니다.
ioremap에 대한 설명:
많은 시스템에서 I/O 메모리는 이런 방식으로 직접 액세스할 수 없습니다. 따라서 매핑이 먼저 설정되어야 합니다. 이것이 ioremap 함수의 역할입니다. 이 기능은 I/O 메모리 영역에 가상 주소를 할당하기 위해 특별히 설계되었습니다.
위의 설명은 모두 "makelinux"에서 가져온 것입니다. 하지만 이 두 기능의 차이점을 올바르게 이해하고 있는지는 여전히 확실하지 않습니다. 현재 제가 이해하는 방법은 다음과 같습니다. ( fops.mmap
파일 작업 mmap)은 일련의 사용자 공간 주소를 장치 메모리와 연결합니다. 이는 PCI 장치의 경우 .By 를 BAR
사용하여 에서 얻은 "실제 주소"에 대해 가상 주소 매핑을 수행한다는 의미입니다 .fops.mmap
ioremap
fops.mmap
누군가 내가 틀렸다면 말해 줄 수 있습니까? 감사합니다~
추신. 나는 이 글을 우분투 커뮤니티에도 게시하고 있습니다. 규칙을 어기지 않기를 바랍니다.
답변1
꼭 살펴보시길 권합니다LDD3 책, 이는 무료입니다. 9장 249페이지에서 ioremap을 설명합니다. 또한보십시오APIU 제3판, 14.8장, 525페이지. 제가 할 수 있는 한도 내에서 요약해 보겠습니다.
매핑I/O 매핑 메모리라는 메커니즘을 통해 하드웨어에 대한 액세스를 허용하는 커널 기능입니다. 메모리의 특정 주소는 CPU와 RAM 사이의 마더보드에 의해 가로채어 디스크나 키보드와 같은 다른 하드웨어로 리디렉션됩니다. 포인터나 다른 커널 기능을 통해 일반적인 주소 지정을 사용할 수 있는지 확실하지 않습니다.
I/O 메모리는 단순히 장치가 버스를 통해 프로세서에 제공하는 RAM과 유사한 위치 영역입니다. 이 메모리는 비디오 데이터 또는 이더넷 패킷을 보관하는 것뿐만 아니라 I/O 포트와 유사한 장치 레지스터를 구현하는 등 다양한 목적으로 사용될 수 있습니다(즉, 읽기 및 쓰기와 관련된 부작용이 있음).
매핑프로세스 메모리 영역을 RAM 대신 파일 내용에 매핑하는 사용자 공간에서 사용할 수 있는 시스템 호출입니다. 일반적인 포인터 역참조를 통해 매핑된 메모리 영역에 액세스하면 커널은 이를 파일 작업으로 변환합니다. 기본적으로 메모리에 쓰는 것은 파일에 쓰는 것입니다. 이것은 write()를 호출하는 더 멋진 방법일 뿐입니다.
메모리 매핑 I/O를 사용하면 디스크의 파일을 메모리의 버퍼에 매핑할 수 있으므로 버퍼에서 바이트를 가져올 때 파일의 해당 바이트를 읽습니다. 마찬가지로, 데이터를 버퍼에 저장하면 해당 바이트가 자동으로 파일에 기록됩니다. 이를 통해 읽기나 쓰기를 사용하지 않고 I/O를 수행할 수 있습니다.
(참고)첫 번째는 "IO 매핑 메모리"이고 두 번째는 "메모리 매핑 IO"라고 생각합니다. 당신이 혼란스러워하는 것도 당연합니다.
답변2
사용자 공간 메모리 액세스는 사용자 공간 주소로 제한됩니다. 파일을 메모리에 매핑하는 것 외에도 mmap은 IO 레지스터와 같은 물리적 메모리에 액세스하는 데에도 사용할 수 있습니다. 슈퍼유저로 "/dev/mem"을 연 다음 mmap을 사용하여 필요한 물리적 메모리 영역을 매핑해야 합니다. 그런 다음 IO 레지스터를 읽고 쓸 수 있습니다. 대부분의 시스템에서 매핑할 물리적 주소는 페이지 경계에 있어야 합니다.