Linux文件映射的反思
16lz
2021-01-22
1. 思考
多个进程可以加载相同的共享链接库,比如C语言的运行库,加载运行库采用内存映射文件的方式,可以延迟对于文件内容的读入操作。
共享链接库文件,是一个elf格式的库文件,里面会包含多个不同的section,比如text/data/bss section。
不同的section的访问方式和权限都有差别,比如text section可能一般要求“只读、可以执行”的权限,而data/bss section最起码要在“可读、可写”的权限。
那么,这种不同权限的section在内存映射时,是怎样区分对待,映射到不同的内存区域中的呢?
Linux下的共享链接库可以通过dlopen函数来加载,该函数会负责将一个共享链接库的不同的section以不同的方式映射到进程的地址空间中,
1: daniel@ubuntu:/proc$ cat /proc/self/maps
2: 00262000-00280000 r-xp 00000000 08:01 525208 /lib/i386-linux-gnu/ld-2.13.so
3: 00280000-00281000 r--p 0001d000 08:01 525208 /lib/i386-linux-gnu/ld-2.13.so
4: 00281000-00282000 rw-p 0001e000 08:01 525208 /lib/i386-linux-gnu/ld-2.13.so
5: 002df000-00455000 r-xp 00000000 08:01 525221 /lib/i386-linux-gnu/libc-2.13.so
6: 00455000-00457000 r--p 00176000 08:01 525221 /lib/i386-linux-gnu/libc-2.13.so
7: 00457000-00458000 rw-p 00178000 08:01 525221 /lib/i386-linux-gnu/libc-2.13.so
8: 00458000-0045b000 rw-p 00000000 00:00 0
9: 009b8000-009b9000 r-xp 00000000 00:00 0 [vdso]
10: 08048000-08051000 r-xp 00000000 08:01 1310739 /bin/cat
11: 08051000-08052000 r--p 00008000 08:01 1310739 /bin/cat
12: 08052000-08053000 rw-p 00009000 08:01 1310739 /bin/cat
13: 08fad000-08fce000 rw-p 00000000 00:00 0 [heap]
14: b7516000-b7517000 r--p 0043a000 08:01 3021821 /usr/lib/locale/locale-archive
15: b7517000-b7557000 r--p 002bd000 08:01 3021821 /usr/lib/locale/locale-archive
16: b7557000-b7757000 r--p 00000000 08:01 3021821 /usr/lib/locale/locale-archive
17: b7757000-b7758000 rw-p 00000000 00:00 0
18: b7768000-b776a000 rw-p 00000000 00:00 0
19: bf9e6000-bfa07000 rw-p 00000000 00:00 0 [stack]
更多相关文章
- Linux下非root用户能创建新文件,却不能拷贝文件的问题
- Linux用户和组的操作(一) 用户文件/etc/passwd
- REDIS从LINUX文件写入批量数据
- Linux编程(8)_文件IO
- Linux学习第二天-文件系统和简单文件操作命令
- 【Azure】两台Linux虚拟机挂载共享文件
- Linux命令-权限管理命令:chmod
- TQ210 —— 嵌入式Linux根文件系统的设计与实现
- Linux locate(文件搜索) 命令