[블로그 통합으로 이전해 온 자료] - 2008. 4. 29. 20:57
* mmap
* I/O 물리 주소의 커널 가상 주소로 맵팽
<asm/io.h>
void *ioremap( unsigned long offset, unsigned long size );
void *ioremap_nocache( unsigned long offset, unsigned long size );
void *iounmap( void *data );
*_nocache() 버전은 pci 디바이스의 non-prefetchable 영역에 사용
* I/O 물리 주소와 커널 가상 주소간의 변환
<asm/page.h>
unsigned long virt_to_phys( volatile void *address );
void *phys_to_virt( unsigned long address );
unsigned long virt_to_bus( volatile void *address );
void *phys_to_virt( unsigned long address );
- 맵핑은 하지 않고 주소 변환 계산만 한다.
- DMA 관련 루틴에서는 _bus_ 함수만 사용.
* 프로세스를 위한 메모리 맵핑
app. 영역에서 사용하는 mmap() 시스템 콜에 대하여 처리하는 드라이버 메소드
file_operations 구조체의 mmap 필드 에서
remap_page_range() 함수나 xxx_nopage() 함수를 호출한다.
<linux/mmh.>
int remap_page_range( struct vm_area_struct *vma,
unsigned long from, unsigned long to, unsigned long size, pgprot_t prot );
struct page *xxx_nopage( struct vm_area_struct *vma, unsigned long addr, int *type );
remap_page_range() 함수를 호출하는 경우는 '한방'에 맵핑하는 방식
xxx_nopage() 함수를 사용하는 경우는 page 단위로 맵핑하는 방식으로 사용자가 직접 작성해야함.
주로 드라이버에 의해 할당된 메모리를 공유하기 위해 사용된다. ex) DMA
'실습 > 리눅스 커널' 카테고리의 다른 글
Major, Minor # (0) | 2021.02.08 |
---|---|
DMA 처리 (0) | 2021.02.08 |
인터럽트 (Interrupt) 처리 (0) | 2021.02.08 |
커널 타이머, 태스크릿, 작업큐 (0) | 2021.02.08 |
드라이버 코드의 실행 지연 (0) | 2021.02.08 |