[Linux:Kernel] Documentation/io-mapping.txt

이 문서의 저작권은 GPL 라이센스를 따릅니다(This document is released under GPL license).
Documentation/io-mapping.txt
번역: 양정석 <dasomoli@gmailREMOVETHIS.com>
linux/io-mapping.h 안의 io_mapping 함수들은 CPU에 I/O 디바이스들의 작은 영역을
효율적으로 맵핑하는 추상화를 제공합니다. 애초의 용도는 ioremap_wc가 커널 주소
영역을 너무 많이 소비할 때 처럼 CPU에 전체 영역을 정적으로 맵핑할 수 없을 때,
32비트 프로세서들에서 큰 그래픽 영역을 제공하기 위함입니다.
맵핑 객체는 드라이버 초기화 중에 다음을 사용하여 생성합니다
        struct io_mapping *io_mapping_create_wc(unsigned long base,
                                                unsigned long size)
                ‘base’는 맵핑 가능하게 만들어 질 영역의 버스 주소인 반면,
                ‘size’는 얼마나 크게 영역을 맵핑할 것인지를 나타냅니다.
                둘다 바이트 수 입니다.
                이 _wc 변형은 io_mapping_map_atomic_wc나 io_mapping_map_wc로만
                사용할 수 있는 맵핑을 제공합니다.
이 맵핑 객체로, 개별 페이지들이 자동적으로, 혹은 아니게 필요한 스케줄링 환경에
따라 맵핑될 수 있습니다. 물론, 어토믹 맵핑은 더 효율적입니다:
        void *io_mapping_map_atomic_wc(struct io_mapping *mapping,
                                       unsigned long offset)
                ‘offset’은 정의된 맵핑 영역 안에서의 오프셋입니다. 생성 함수
                에서 지정된 영역을 넘어서서 주소를 접근하는 것은 정의되지
                않은 결과를 불러옵니다. 페이지 정렬되지 않은 오프셋을
                사용하는 것도 정의되지 않은 결과를 불러옵니다. 반환 값은
                CPU 주소 공간 안의 한 페이지를 가리킵니다.
                이 _wc 변형은 페이지로의 write-combining 맵핑을 반환하고,
                io_mapping_create_wc에 의해 생성된 맵핑에만 사용가능합니다.
                태스크가 이 맵핑된 페이지를 잡고 있는 동안 슬립하지 않음을
                알아두세요.
        void io_mapping_unmap_atomic(void *vaddr)
                ‘vaddr’은 반드시 마지막 io_mapping_map_atomic_wc 호출에
                의해 반환된 값이어야 합니다. 이것은 지정된 페이지를 맵핑
                해제하고 그 태스크가 다시 한번 잠들 수 있게 합니다.
여러분이 그 락을 잡은 동안 슬립해야할 필요가 있다면, 극히 더 느리긴 하지만,
어토믹이 아닌 변형을 사용할 수 있습니다.
        void *io_mapping_map_wc(struct io_mapping *mapping,
                                unsigned long offset)
                이것은 태스크가 맵핑된 페이지를 잡고 있는 동안 슬립할 수 있다는
                것을 제외하면 io_mapping_map_atomic_wc와 같이 동작합니다.
        void io_mapping_unmap(void *vaddr)
                이것은 io_mapping_map_wc로 매핑된 페이지들이 사용되는 것을
                제외하면 io_mapping_unmap_atomic과 같이 동작합니다.
드라이버에 가까운 시간에, io_mapping 객체는 반드시 해제되어야만 합니다:
        void io_mapping_free(struct io_mapping *mapping)
현재 구현:
이들 함수의 초기 구현은 이미 구현된 맵핑 메카니즘을 사용해서 오직 추상 계층만
제공하고 새로운 기능은 없습니다.
64비트 프로세서에서 io_mapping_create_wc는 자원으로의 영구적으로 커널이 볼 수
있는 맵핑을 생성하는 전체 영역을 위해서 ioremap_wc를 호출합니다. 그 map_atomic과
map 함수들은 ioremap_wc에 의해 반환되는 가상 주소의 기준점으로부터의 요청된
오프셋을 더합니다.
HIGHMEM이 정의된 32비트 프로세서에서는 io_mappinc_map_atomic_wc가
kmap_atomic_pfn을 지정된 페이지를 어토믹하게 맵핑하는데 사용됩니다;
kmap_atimic_pfn은 디바이스 페이지와 사용될 것이라고 정말 여겨지지 않았습니다만,
이 용도를 위한 효율적인 맵핑을 제공합니다.
HIGHMEM 정의가 없는 32비트 프로세서에서는 io_mapping_map_atomic_wc와
io_mapping_map_wc 모두 새로운 맵핑을 모든 프로세서에 알리기 위해서 IPI를 수행하는
극악하게 비효율적인 함수인 ioremap_wc를 사용합니다. 이것은 극적인 성능 저하를
가져옵니다.