虚拟内存抽象,进程的地址空间

1.动态链接与静态链接区别

首先写一个main.c死循环程序

int mian() {
      while (1);
}

进入main.c所在的目录下,打开一个终端,执行动态链接

gcc main.c 

在此终端下进行静态链接

gcc -static main.c -o static.out

生成了可执行文件a.out static.out:
在这里插入图片描述比较静态链接和动态链接的时间上的区别:
在这里插入图片描述
在这里插入图片描述
动态链接花费的时间比静态链接的时间更短。

分别打开两个终端,运行a.out static.out可执行程序,进入死循环状态;新建一个终端输入:top。找到两个程序的进程号
在这里插入图片描述a.out的进程号是8175,在终端中输入pmap 8175(此时不要杀死死循环)

(base) bionic@bionic-DL:~$ pmap 8342
8342:   ./static.out
0000000000400000    728K r-x-- static.out
00000000006b6000     24K rw--- static.out
00000000006bc000      4K rw---   [ anon ]
0000000001e23000    140K rw---   [ anon ]
00007ffc0e820000    136K rw---   [ stack ]
00007ffc0e8b8000     12K r----   [ anon ]
00007ffc0e8bb000      4K r-x--   [ anon ]
ffffffffff600000      4K --x--   [ anon ]
 total             1052K


(base) bionic@bionic-DL:~$ pmap 8175
8175:   ./a.out
000055763c080000      4K r-x-- a.out
000055763c280000      4K r---- a.out
000055763c281000      4K rw--- a.out
00007fb0c3d43000   1948K r-x-- libc-2.27.so
00007fb0c3f2a000   2048K ----- libc-2.27.so
00007fb0c412a000     16K r---- libc-2.27.so
00007fb0c412e000      8K rw--- libc-2.27.so
00007fb0c4130000     16K rw---   [ anon ]
00007fb0c4134000    164K r-x-- ld-2.27.so
00007fb0c4306000      8K rw---   [ anon ]
00007fb0c435d000      4K r---- ld-2.27.so
00007fb0c435e000      4K rw--- ld-2.27.so
00007fb0c435f000      4K rw---   [ anon ]
00007ffcf307d000    136K rw---   [ stack ]
00007ffcf30b4000     12K r----   [ anon ]
00007ffcf30b7000      4K r-x--   [ anon ]
ffffffffff600000      4K --x--   [ anon ]
 total             4388K

动态链接的地址空间中比静态链接的多了不少如00007fb0c3d43000 1948K r-x-- libc-2.27.so,就是libc动态链接出来的,rx文件。动态链接后的可执行文件小了很多。

2.pmap是如何实现的呢?

strace pmap 8175
在这里插入图片描述pmap是打开map做read,打印信息
对proc作操作

(base) bionic@bionic-DL:~$ cat /proc/9169/maps
00400000-004b6000 r-xp 00000000 08:04 411558                             /home/bionic/static.out
006b6000-006bc000 rw-p 000b6000 08:04 411558                             /home/bionic/static.out
006bc000-006bd000 rw-p 00000000 00:00 0 
01a13000-01a36000 rw-p 00000000 00:00 0                                  [heap]
7ffe41024000-7ffe41046000 rw-p 00000000 00:00 0                          [stack]
7ffe41186000-7ffe41189000 r--p 00000000 00:00 0                          [vvar]
7ffe41189000-7ffe4118a000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

3 访问进程地址空间:游戏外挂实现 “游戏外挂程序”

mem-probe.c 这是一个简单版的 “内挂”——修改自己进程的地址空间 游戏外挂就像是游戏专用的 debugger
在适当的时候修改游戏本地的数据 (透视、瞬移等)
例如直接修改 rendering pipeline 指令
根据 pmap 的结果,读/写地址空间中的内存
其他进程的内存可以通过 /proc/[pid]/mem 访问,原理类似

gcc此c程序时候报错解决方法
主要是要对readline进行链接,如果系统没有readline还要下载。

4.总结

程序=状态机,而操作系统就是状态机这样的一个管理者,也就是需要硬件这个状态机,实现多个并发执行的虚拟的模拟器。本节主要是linux系统上进程(状态机)作为内存的一部分,进程中的内存到底有什么?从应用程序的视角来看,进程的内存就是一个又一个的地址空间的段,而这些段是用mmap来申请管理的,可以用mmap把一部份文件加载到内存里。我们的动态链接都是依靠这样的机制。硬件实现这样的api,主要是通过计算机系统中的分页管理技术,分页机制切入点是,把进程的虚拟空间看作为一个页面到页面的映射,而这个映射是靠radius tree来实现的。mmap等手册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值