리눅스 디바이스 드라이버 책에 있는 ARM용 DIO 디바이스 드라이버 예제를 2.6커널용으로 제작하는 도중에
물리주소 접근에 문제가 있어서 소스코드를 찾아 보는 중에
arm에서 물리주소와 가상 주소를 변환하는 매크로 함수 두개에 대해서 이상한 점이 있어서 질문드립니다.
일반적으로 가상주소와 물리주소의 변환에 관련된 함수는 책에도 설명 되어 있는데로 vir_to_phys
과 phys_to_vir이 있는 데 함수를 이용해서 가상 주소로 변환한 주소값을 다시 물리 주소로 변환하면
다른 값이 나옵니다.
커널 소스의  /include /asm-arm/arch-pxa/hardware.h에 보면 주소변환에 대한 매크로가 정의 되어있는데

#define io_p2v(x)(0xf2000000 + ((x) & 0x01ffffff) +(((x) & 0x1c000000) >>1))
#defien io_v2p(x)(0x3c000000 + ((x) & 0x01fffff) + (((x)& 0e00000000) <<1))
매크로를 보면 p2v를 해서 v2p를 돌리면 다시 physical 값인 x 값이 나와야하는 걸로 생각되는데
0x10000000 값을 넣으면 가상 주소는 fa000000 다시 io_v2p를 실행하면 50000000이 나오네요
커널 소스내의 오류인지 아니면 다른 의도가 있어서인지 알 고 싶습니다.