前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >awk 用于16进制内存地址的运算

awk 用于16进制内存地址的运算

作者头像
qsjs
发布2022-01-05 14:46:49
1.1K0
发布2022-01-05 14:46:49
举报

在proc 文件系统中关于进程的内存信息,避免不了涉及内存地址的问题,而对于内存地址的计算,默认是采用16进制的,其实可以使用awk进行处理,如下是一个例子:

代码语言:javascript
复制
root:map_files# ls -lht | head >/tmp/test.file
root:map_files# cat /tmp/test.file 
total 0
lr-------- 1 root root 64 Jan  2 20:48 7fd9eabd9000-7fd9eabda000 -> /usr/lib64/libpcre2-8.so.0.7.1
lr-------- 1 root root 64 Jan  2 20:48 7fd9eabda000-7fd9eabf9000 -> /usr/lib64/libgpg-error.so.0.24.2
lr-------- 1 root root 64 Jan  2 20:48 7fd9eabf9000-7fd9eadf9000 -> /usr/lib64/libgpg-error.so.0.24.2
lr-------- 1 root root 64 Jan  2 20:48 7fd9eadf9000-7fd9eadfa000 -> /usr/lib64/libgpg-error.so.0.24.2
lr-------- 1 root root 64 Jan  2 20:48 7fd9eadfa000-7fd9eadfb000 -> /usr/lib64/libgpg-error.so.0.24.2
lr-------- 1 root root 64 Jan  2 20:48 7fd9eadfb000-7fd9eae22000 -> /usr/lib64/libselinux.so.1
lr-------- 1 root root 64 Jan  2 20:48 7fd9eae22000-7fd9eb021000 -> /usr/lib64/libselinux.so.1
lr-------- 1 root root 64 Jan  2 20:48 7fd9eb021000-7fd9eb022000 -> /usr/lib64/libselinux.so.1
lr-------- 1 root root 64 Jan  2 20:48 7fd9eb022000-7fd9eb023000 -> /usr/lib64/libselinux.so.1
root:map_files# 
root:map_files# cat /tmp/test.file |grep -Evi  ^total | awk '{print $9}'  | awk -F'-' '{s=strtonum("0x"$1);e=strtonum("0x"$2);print (e-s)}' 
4096
126976
2097152
4096
4096
159744
2093056
4096
4096
root:map_files# 

上述例子中, 首先把要计算的16进制字符串找出来,然后加上0x标识,接着用strtonum函数把16进制转换为10进制,转换成10进制以后,就可以进行计算了,从而计算出两个16进制之间的差值; 在这个例子中,上述输出是某一个进程的map-files的一部分, 对于系统内存的使用分析,上述方法可能有一点点小用处哦. 毕竟,把上述的内存map都加起来,那么就是 该进程当前所可以访问的所有的文件在内存空间的影射,其值和top -p PID 显示的virt 有一定的关系,总体上总是小于VIRT的,但是占用了virt的大多数部分哦,至于和VIRT的区别,这个要去了解VIRT的构成部分了.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022.01.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档