PCI 디바이스 드라이버에서 Base 어드레스에 접근하기

linux_chozza의 이미지

안녕하세요.

pci configuration 레지스터에서 base0~5 어드레스를 얻어왔습니다.

근데, 이 얻어온 베이스 어드레스로 접근을 할려고 하니깐

Unable to handle kernel paging request at virtual address feba0000

이런 에러가 발생합니다.
접근하고자 하는 주소는 feba0000 인데요.
이값은 pci_read_config_byte란 api를 이용해서 얻어왔구요.

이런 문제 해결해 보신 분 계시면 도와 주세요T_T

darkblue99의 이미지

제가 원인을 잘 못 안것일 수도 있습니다만..
참고 바랍니다.

pci configuration register에서 읽어온
pci장치의 base address는 physical address이고
linux에서 접근하기 위해서는
ioremap을 해줘야합니다.
ioremap은 physical address를 logical address로 바꾸어줍니다.
즉,

phy_base_addr=some_function();
logical_base_addr = ioremap(phy_base_addr, size);

를 한후에
logical_base_addr + offset 으로 접근해야겠지요..

Be Postive!

linux_chozza의 이미지

답변 정말 감사드립니다.^^
ioremap을 해주니깐, 접근가능한 것 같습니다.

근데, proc/iomem 은 실제 디바이스의 물리 메모리를 보여주는 건가요?

첨에는 proc/iomem 부분이 실제 매핑된 가상 메모리주소인지 알고 접근을 했었는데, page 에러가 발생하더군요.

에고..

우~싸!!! ^_________^