원칙 통화의 mmap 시스템 분석 및 구현에 패 inux

원칙 통화의 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;
}

linux
发布了33 篇原创文章 · 获赞 2 · 访问量 8509

추천

출처blog.csdn.net/QQ960054653/article/details/71077507