PCI 장치 메모리 영역을 읽으려고 합니다. (제가 찾고 있는 것이 장치로부터의 오프셋이라는 것을 알고 있습니다.) 먼저 PCI 장치 메모리가 매핑된 시스템 메모리 주소를 얻으려고 합니다. 그러기 위해 나는 이렇게 한다lspci-vvv나는 얻다:
00:1a.8 Memory controller
Subsystem: Dell Device
Flags: bus master, fast devsel, latency 64, IRQ 139
Memory at 601d198000 (64-bit, non-prefetchable) [size=16K]
Memory at 601d000000 (64-bit, non-prefetchable) [size=1M]
Capabilities: <access denied>
Kernel driver in use: nvm-mem-drv
지금까지는 매우 좋았습니다. 이제 dd의 도움으로 그 메모리에 무엇이 있는지 확인하려고 합니다.
dd if=/dev/mem iflag=skip_bytes skip=412803399680 bs=512 count=1 | hexdump -C
놀랍게도 내가 얻는 것은 다음과 같습니다.
dd: '/dev/mem'을 읽는 동안 오류가 발생했습니다.잘못된 주소0+0 레코드 입력 0+0 레코드 출력 복사 0바이트, 9,3556e-05초, 0,0kB/s
이 방법이 다른 플랫폼에서도 효과가 있었기 때문에 "놀랍게도" 이 방법을 설정했습니다.
이제 질문은 왜DD주소가 잘못되었다고요? 가장 먼저 눈에 띄는 점은 이 플랫폼의 주소가 다른 플랫폼의 주소보다 길다는 것입니다(정확히 두 자리). 그래서 나는 아마도 내가 무엇을 겪고 있는지 생각했습니다.뛰어 넘다오버플로 - 512개 청크에 "건너뛰기"를 지정하여 문제를 해결하려고 했지만 해당 메서드도 반환됩니다.잘못된 주소. 그래서 나는 여기서 약간 길을 잃었습니다. lspci가 나를 속이고 있는 걸까요, 아니면 무슨 일이 일어나고 있는 걸까요? :|
추신: 또한 커널 CONFIG_STRICT_DEVMEM이 설정되지 않았음을 확인했습니다. 다른 주소는 잘 읽을 수 있어요.