一:背景
1. 讲故事
昨天在分析一个 linux 的 dump 时,看到了这么一话警告,参考如下:
对,就是上面的 SYSV10cf21d1
,拆分一下为 System V + 10cf21d1
,前者的System V
表示共享内存机制,后面的 10cf21d1
表示共享内存中用到的唯一键key,所以这表示当前的 .net 程序直接或者间接的使用了 System V
的进程间共享内存,我对 Linux 不是特别熟悉,所以稍微研究了下就有了这篇文章。
二:System V 研究
1. 什么是进程间通信
其实在 Linux 中有很多中方式进行 IPC(进程间通信),我用大模型帮我做了一下汇总,截图如下:
现如今Linux使用最多的还是 POSIX
标准,而 System V
相对来说比较老,为了研究我们写一个小例子观察下基本实现。
2. System V 的一个小例子
为了能够实现进程间通信,开启两个进程(writer,reader)端,一个是往共享内存写入,一个从共享内存中读取,画个简图如下:
接下来在内存段的首位置设置控制flag
,后面跟着传输的 content
内容,然后创建一个key与申请的内存段进行绑定,参考代码如下:
1)writer.c
接下来就是 gcc 编译并运行,参考如下:
从输出看已经将 "Hello from writer process!"
写到了共享内存,接下来可以用 ipcs -m
观察共享内存段列表,以及虚拟地址段。
上面输出的 /SYSV78030002 (deleted)
便是,哈哈,现在回头看这句 WARNING: Unable to verify timestamp for SYSV10cf21d1 (deleted)
是不是豁然开朗啦。。。
接下来继续聊,另一个进程要想读取共享内存,需要通过同名的key寻找,即下面的 shmget 方法。
2)reader.c
如果有朋友对绑定逻辑(shmget)的底层感兴趣,可以观察 Linux 中的 ipcget_public 方法,其中的 rhashtable_lookup_fast 便是。
最后就是相同方式的编译运行,截一张图如下:
三:总结
哈哈,dump分析之旅就是这样,在分析中不断的学习新知识,再用新知识指导dump分析,就这样的不断的螺旋迭代,乐此不疲。