본문 바로가기
실습/리눅스 커널

Memory Mapping

by 써드아이 2021. 2. 8.

[블로그 통합으로 이전해 온 자료] - 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