久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

8.?mmap

 xrzs 2010-03-04

8. mmap 請點評

mmap可以把磁盤文件的一部分直接映射到內(nèi)存,,這樣文件中的位置直接就有對應(yīng)的內(nèi)存地址,,對文件的讀寫可以直接用指針來做而不需要read/write函數(shù),。

#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);
int munmap(void *addr, size_t len);

該函數(shù)各參數(shù)的作用圖示如下:

圖 28.4. mmap函數(shù)

mmap函數(shù)

如果addr參數(shù)為NULL,,內(nèi)核會自己在進(jìn)程地址空間中選擇合適的地址建立映射。如果addr不是NULL,,則給內(nèi)核一個提示,,應(yīng)該從什么地址開始映射,內(nèi)核會選擇addr之上的某個合適的地址開始映射,。建立映射后,,真正的映射首地址通過返回值可以得到。len參數(shù)是需要映射的那一部分文件的長度。off參數(shù)是從文件的什么位置開始映射,,必須是頁大小的整數(shù)倍(在32位體系統(tǒng)結(jié)構(gòu)上通常是4K),。filedes是代表該文件的描述符。

prot參數(shù)有四種取值:

  • PROT_EXEC表示映射的這一段可執(zhí)行,,例如映射共享庫

  • PROT_READ表示映射的這一段可讀

  • PROT_WRITE表示映射的這一段可寫

  • PROT_NONE表示映射的這一段不可訪問

flag參數(shù)有很多種取值,,這里只講兩種,其它取值可查看mmap(2)

  • MAP_SHARED多個進(jìn)程對同一個文件的映射是共享的,,一個進(jìn)程對映射的內(nèi)存做了修改,,另一個進(jìn)程也會看到這種變化。

  • MAP_PRIVATE多個進(jìn)程對同一個文件的映射不是共享的,,一個進(jìn)程對映射的內(nèi)存做了修改,,另一個進(jìn)程并不會看到這種變化,也不會真的寫到文件中去,。

如果mmap成功則返回映射首地址,,如果出錯則返回常數(shù)MAP_FAILED。當(dāng)進(jìn)程終止時,,該進(jìn)程的映射內(nèi)存會自動解除,,也可以調(diào)用munmap解除映射。munmap成功返回0,,出錯返回-1,。

下面做一個簡單的實驗。

$ vi hello
(編輯該文件的內(nèi)容為“hello”)
$ od -tx1 -tc hello
0000000 68 65 6c 6c 6f 0a
h   e   l   l   o  \n
0000006

現(xiàn)在用如下程序操作這個文件(注意,,把fd關(guān)掉并不影響該文件已建立的映射,,仍然可以對文件進(jìn)行讀寫)。

#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(void)
{
int *p;
int fd = open("hello", O_RDWR);
if (fd < 0) {
perror("open hello");
exit(1);
}
p = mmap(NULL, 6, PROT_WRITE, MAP_SHARED, fd, 0);
if (p == MAP_FAILED) {
perror("mmap");
exit(1);
}
close(fd);
p[0] = 0x30313233;
munmap(p, 6);
return 0;
}

然后再查看這個文件的內(nèi)容:

$ od -tx1 -tc hello
0000000 33 32 31 30 6f 0a
3   2   1   0   o  \n
0000006

請讀者自己分析一下實驗結(jié)果,。

mmap函數(shù)的底層也是一個系統(tǒng)調(diào)用,,在執(zhí)行程序時經(jīng)常要用到這個系統(tǒng)調(diào)用來映射共享庫到該進(jìn)程的地址空間。例如一個很簡單的hello world程序:

#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}

strace命令執(zhí)行該程序,,跟蹤該程序執(zhí)行過程中用到的所有系統(tǒng)調(diào)用的參數(shù)及返回值:

$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 38 vars */]) = 0
brk(0)                                  = 0x804a000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fca000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=63628, ...}) = 0
mmap2(NULL, 63628, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fba000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260a\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1339816, ...}) = 0
mmap2(NULL, 1349136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e70000
mmap2(0xb7fb4000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x143) = 0xb7fb4000
mmap2(0xb7fb7000, 9744, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fb7000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e6f000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e6f6b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7fb4000, 4096, PROT_READ)   = 0
munmap(0xb7fba000, 63628)               = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc9000
write(1, "hello world\n", 12hello world
)           = 12
exit_group(0)                           = ?
Process 8572 detached

可以看到,,執(zhí)行這個程序要映射共享庫/lib/tls/i686/cmov/libc.so.6到進(jìn)程地址空間。也可以看到,,printf函數(shù)的底層確實是調(diào)用write,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多