[커널/드라이버 프로그래밍] 커널이 알지 못하는 메모리영역의 page 맵핑하기

okssi의 이미지

현제 bio structure를 생성해서 generic_make_request()를 호출하는 함수를 구현했습니다
그러나.. 문제가 된 것이 무엇이냐 하면
현재까지 kmalloc 또는 vmalloc을 통해 메모리를 영역을 잡아서 테스트를 했었는데,
이는 virtual address를 사용한 것이지요. 그리고 이는 low memory에 해당되는 영역이라 logical address 즉, page가 사용됩니다.
(동작은 잘 되었었지요)
그러나, 저의 궁극적인 과제는 이것이 아니라 ioremap_nocache()를 통해서 커널이 알지 못하는 physical address를 사용해 virtual address로 만들어 page를 사용해야 합니다.
page를 사용해야 하는 이유(logical address를 사용해야하는 이유)는 bio structure에서 page를 사용하기 때문입니다.

여기서 문제점은 ioremap()또는 ioremap_nocache()를 통해서 physical address를 virtual address로 변환(맵핑)하였으나 이는 low memory도 아니고 그렇다고 high memory도
아닌지라 logical address가 안된다는 것입니다. 책의 정의에 의하면 low memory는 커널이 알고 있는 영역 high memory는 커널이 모르는 영역이라고 되어 있더군요(물론 간단하게 말하면 말입니다. 실제로는 high memory는 메모리가 아주 클경우 사용되더군요 말그대로 high memory 제가 사용하고자 하는 영역의 이름을 굳이 만든다면 low low memory라고나 할까...ㅡㅡ;) high memory가 유사한 계념인지라 kmap을 통해서 해보긴했는데 역시 안되는 군요.

간단히 말하자면
physical address ---> virtual address ---> logical address 로 만들어야 합니다. 또는 (hysical address ---> virtual address (available to be used as a logical address)
현재 사용 플렛폼에서는 ppc 프로세서를 사용하고 있습니다.
어떻게 해결해야 할까요?

다시 말하자면

void* page_ptr
u32 address = 0x03F80000;
struct page* page_descriptor;

//KERNEL VIRTUAL ADDRESS
page_ptr = ioremap_nocache(address,MALLOC_SIZE);
page_descriptor = virt_to_page(page_ptr); //===> 유효하지 않습니다.

================================================================
0x03F80000 가 0xC3F80000와 같은 형식으로 나와야지 physical address로 다시 변환 될 수 있으나
ioremap_nocache()를 통해서 나오는 주소는 임의의 영역으로 맴핑 된 것으로 보여지는 0xC4020000 와 같은 주소가 나오게 됩니다.
따라서 page_address() 또는 __pa()와 같은 함수를 통해서 physical address로 다시 변환했을때는 0x04020000가 나오게 되지요.