원칙 통화의 mmap 시스템 분석 및 구현에 패 inux
[날짜 : 2012-05-17] | 출처 : 리눅스 커뮤니티 저자 : yinjiabin | [폰트 : 타이 종 소형 ] |
1,의 mmap 시스템 호출 (기능)
무효 *들을 mmap (무효 * 요지로,이 size_t 렌, 보호 해주는 INT, INT 플래그, INT fd가, off_t 오프셋)
메모리 매핑 기능에 의해, 프로세스의 가상 메모리 공간에 매핑 파일의 내용에 대한 책임 메모리 매핑 이 메모리는 읽기 및 통화 읽기, 쓰기 등의 작업을 할 필요없이, 읽기 달성하고 파일을 수정, 수정합니다.
2,의 mmap 시스템 호출 (매개 변수)
. 1) 주소 : 지정 시스템에 의해 할당 일반적으로 NULL로 설정 시작 주소 매핑.
2) 길이 : 파일의 길이는 메모리에 매핑.
3) PROT : 맵핑 영역의 보호 때문일 수있다 :
PROT_EXEC : 맵핑 영역을 행할 수
PROT_READ : 맵핑 영역 읽을 수
PROT_WRITE : 매핑 영역은 기록 될 수있다
4) 플래그 : 특성 매핑 영역 중 하나
MAP_SHARED : 그림자 영역에 기록 된 데이터가 다시 파일에 복사하고, 다른 프로세스가 파일 공유를 매핑 할 수있다.
MAP_PRIVATE : 생산 복사 (기록 중 복사) 매핑 된 영역에 쓰기 작업의 매핑 지역은이 지역에 대한 수정은 원본 파일에 다시 기록하지 않았다.
5) 전략 중 : 열린 파일 기술자에 의해 반환 된 파일을, 대표는 매핑 할 수 있습니다.
6) 오프셋 : 파일의 시작 오프셋, 일반적으로 0 페이지 크기의 배수 여야합니다, 파일 헤더에서 시작 매핑을 나타냅니다.
(3) 매핑 해제
INT의 munmap은 (무효 * 시작이 size_t 길이)
기능 : 파라미터 매핑 된 메모리를 해제하는 점을 시작 파라미터 길이는 상기 메모리의 크기가 취소 될 나타낸다.
반환 값 : 그렇지 않으면 반환 성공적인 복귀 공을 들어 올려 -1 오류의 원인에 errno를에 저장됩니다.
사례 연구
의 mmap 시스템 호출
도 4는 가상 메모리 영역
가상 메모리 영역, 처리의 균일 가상 주소 공간 부 즉, 동일한 특성의 연속 어드레스 범위를 갖는. 프로그램 코드, 데이터는 BSS 다음 요소의 방법에 의해 화상 메모리
스택 영역과, 메모리 맵핑의 영역.
메모리 영역에보고하여 처리 할 수 있습니다 :은 / proc / PID /지도
하는 #text 08048000-0804f000 R-XP 00000000 8시 1분 573 748 /sbin/rpc.statd
01 573 748 00007000 / sbin에 / RPC : 0804f000-08050000는 P-RW-08. #data statd에
08050000-08055000 rwxp 00000000 0시 0 #bss
040000000-40015000-R 및 LT XP 00000000 933 965 8시 1분 /lib/ld2.3.2.so하는 #text
40015000-40016000 RW-P 8시 1분 933 965 00,014,000 / LIB / LD -2.3.2.so #data
도메인의 각 행 마이너 아이 노드 : start_end 파마 주요 오프셋
영역 가상 어드레스 개시 : 1) 시작,
2) 종료 : 영역 가상 어드레스 종료
처리를 허용하는 영역을 표시, 읽기, 쓰기 및 실행 권한 : 3) 파마를 무엇을해야합니다. 이 필드의 마지막 문자는 개인에 대한 중 페이지입니다, 하나의 공유됩니다.
4) 오프셋 : 파일의 시작 주소의 일부에 매핑되는
메이저와 마이너 번호 : 5) 메이저, 마이너
6) 소유자의 그룹 아이디 : 아이 노드를
5、vm_area_struct
Linux内核使用结构vm_area_struct(<linux/mm_types.h>)来描述虚拟内存区域,其中几个主要成员如下:
1)unsigned long vm_start 虚拟内存区域起始地址
2)unsigned long vm_end 虚拟内存区域结束地址
3)unsigned long vm_flags 该区域的标记。如:VM_IO和VM_RESERVED。VM_IO将该VMA标记为内存映射的IO区域,VM_IO会阻止系统将该区域包含在进程的存放转
存(core dump )中,VM_RESERVED标志内存区域不能被换出。
6、mmap设备操作
映射一个设备是指把用户空间的一段地址关联到设备内存上。当程序读写这段用户空间的地址时,它实际上是在访问设备。
mmap设备方法需要完成什么功能?
mmap方法是file_oprations结构的成员,在mmap系统调用发出时被调用。在此之前,内核已经完成了很多工作。mmap设备方法所需要做的就是建立
虚拟地址到物理地址的页表。
int (*mmap) (struct file *, struct vm_area_struct *)
mmap如何完成页表的建立?
方法有二:
1)使用remap_pfn_range一次建立所有页表;
2)使用nopage VMA方法每次建立一个页表。
构造页表的工作可由remap_pfn_range函数完成,原型如下:
int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,unsigned long pfn, unsigned long size, pgprot_t prot)
vma: 虚拟内存区域指针
virt_addr: 虚拟地址的起始值
pfn: 要映射的物理地址所在的物理页帧号,可将物理地址>>PAGE_SHIFT得到。
size: 要映射的区域的大小。
prot: VMA的保护属性。
int memdev_mmap(struct file*filp, struct vm_area_struct *vma)
{
Vma->vm_flags |= VM_IO;
Vma->vm_flags |= VM_RESERVED;
if (remap_pfn_range(vma, vma->vm_start,
virt_to_phys(dev- >data)>> PAGE_SHIFT,
size,
vma->vm_page_prot))
return -EAGAIN;
return 0;
}