ioremap()과 ioremap_nocache()
안녕하세요. 최근 디바이스 드라이버를 공부하고있습니다.
책에 씌여있길(유영창씨가 쓰신책입니다 :D)
"일반적인 메모리 맵I/O는 ioremap()함수로도 충분하지만 PCI디바이스의 경우에는 ioremap()함수만 사용하면 제어에 문제가 발생한다.
PCI 디바이스는 I/O로 할당되는 주소 공간이 non-prefetchable 영역과 prefetchable영역으로 나뉜다.
prefetchable영역은 ioremap()함수를 이용해 PCI의 물리주소를 커널의 가상 주소로 변환하면 되지만,
non-prefetchable 영역은 반드시 ioremap_nocache()함수를 이용해야 한다."
prefetchable과 non-prefetchable에 대해서 이해가 잘안가서요.
이것에 대해 제가 알아낸 정보는
http://forums.xilinx.com/xlnx/board/message?board.id=PCIe&thread.id=676
에 씌여있는 답변중
In your hardware you have to make sure that prefetchable memories are not changed by the act of reading -- for a example a register that was clear on read is not prefetchable. Also FIFOs are not prefetchable since each time it is read the read pointer changes (and thus the data).
입니다.
구체적으로 이해가 잘안가서 그렇는데
ioremap_xxx()함수가 쓰일때 prefetchable과 non-prefetchable에 대한 경우와 자세한 스펙에대한 조언 부탁드려요~
PCI에서의 prefetchable은
PCI에서의 prefetchable은 CPU의 캐시와는 무관합니다. 그리고 non-prefetchable영역이라고 해서 반드시 ioremap_nocache()를 써야하는것도 아닙니다.
prefetchable은 PCI버스상에서는 4byte만 읽어가더라도 디바이스 내부적으로는 8byte혹은 그이상 읽는 동작이 수행될수도 있습니다. 인용하신 내용은 이런 사항때문에 읽은만큼 데이터가 빠져나가는 FIFO나 읽으면 상태가 없어지는 레지스터등은 prefetchable로 구현하지 말라는 내용입니다.
그리고 이러한 레지스터의 경우 읽어야할때 CPU쪽에서 캐싱된 데이터를 사용하면 문제가 될수 있기때문에 ioremap_nocache()가 도움이 될 수 있습니다.
댓글 달기