L原理コールのmmapシステムの解析でinuxと実装
[日付:2012-05-17] | 出典:Linuxコミュニティ著者:yinjiabin | [フォント:タイ 忠 小 ] |
1、のmmapシステムコール(関数)
void *型のmmap(void *型のaddr、size_tのLEN、int型Protの、int型のフラグ、int型FD、off_t型オフセット)
メモリマッピング機能をすることにより、プロセスの仮想メモリ空間にマッピングされたファイルの内容に責任のmmapこのメモリは、読みとコールの読み取り、書き込み、および他の操作を必要とせずに、ファイルの読み取りおよび変更を達成するために、変更します。
2、MMAPシステムコール(パラメータ)
。1)ADDR:指定システムによって割り当てられた一般NULLに設定された開始アドレスマッピング、、。
2)長さ:ファイルの長さは、メモリにマッピング。
3)PROT:マッピング領域の保護は、それがあってもよい:
PROT_EXEC:マッピング領域を行うことができる
PROT_READ:マッピング領域を読み取ることができる
PROT_WRITE:マッピング領域を書き込むことができます
4)フラグ:特性マッピング領域、次のいずれか
MAP_SHARED:シャドウ領域に書き込まれたデータがバックファイルにコピーされ、他のプロセスがファイル共有をマッピングすることを可能にします。
MAP_PRIVATE:農産物コピー(コピーオンライト)マッピングされた領域への書き込み動作のマッピング領域は、この領域への変更は、元のファイルにライトバックしませんでした。
5)fdがオープンファイル記述子によって返されたファイルを、代表者がマッピングされます。
6)オフセット、ファイルの先頭にオフセットページサイズの倍数である必要があり、通常は0、ファイルヘッダからスタートマッピングを示しています。
図3に示すように、マップ解除
INTと、munmap(ボイド*スタート、size_tの長さ)
機能:メモリマップされたパラメータをキャンセルする開始点、パラメータ長をキャンセルするメモリのサイズを表します。
戻り値:成功したリターン0、それ以外の場合は-1を返し、エラーの原因には、errnoに保存されて持ち上げます。
ケーススタディ
のmmapシステムコール
図4は、仮想メモリ領域
の仮想メモリ領域は、プロセスの均一な仮想アドレス空間部、すなわち、同じ特性連続アドレス範囲を有します。プログラムコード、データ、BSS:以下の成分のプロセスによってメモリイメージ
とスタック領域、およびメモリマッピング領域。
メモリ領域をを見ることで、プロセスになることができます:/ procの/ PID /地図
08048000-0804f000 R-XP 00000000 8:01 573の#text 748 /sbin/rpc.statd
0804f000-08050000 P-RW-08:01 573 748 00007000 / sbinに/ RPC。 #data statdの
08050000-08055000 rwxp 00000000午前0時0 #bss
040000000から40015000-R&LT XP 00000000 933 965 8:01 /lib/ld2.3.2.soの#text
40015000から40016000 RW-P 8:01 933 965 00014000 / LIB / LD -2.3.2.so #data
ドメインの各列:start_endパーマメジャーオフセット:マイナーiノード
の仮想アドレス開始領域:1)を起動
2)終了:領域仮想アドレス終了
3)パーマ:読み出し、書き込み、及び実行許可を、領域を発現し、プロセスを可能にします何をすべきか。このフィールドの最後の文字は、プライベート用のいずれかのpで、どちらかsが共有されています。
4)オフセット:ファイルの開始アドレスの一部にマッピングされる
メジャーおよびマイナー番号:5)メジャー、マイナー
6)iノード:inodeを
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;
}