标签: procfs

Linux下的共享库加载地址

我对共享库有一个重大疑问.我研究的是,不同进程共享的库的虚拟地址对于所有这些进程都是相同的.但是我尝试通过以下命令集使用proc文件系统来查看相同的内容:

$ cat /proc/*/maps | grep /lib/libc-2.12.1.so
Run Code Online (Sandbox Code Playgroud)

输出是:

0025a000-003b1000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
003b1000-003b2000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
003b2000-003b4000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
003b4000-003b5000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
0086d000-009c4000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
009c4000-009c5000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
009c5000-009c7000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
009c7000-009c8000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so …
Run Code Online (Sandbox Code Playgroud)

linux shared-libraries virtual-memory procfs

6
推荐指数
1
解决办法
3625
查看次数

Unix Proc Directory

我试图找到包含当前用户ID的虚拟文件.我被告知我可以在proc目录中找到它,但不太确定哪个文件.

unix linux procfs

5
推荐指数
2
解决办法
3318
查看次数

如何从内核空间读取/写入linux/proc文件?

我正在编写一个由用户程序和内核模块组成的程序.内核模块需要收集数据然后"发送"到用户程序.这必须通过/ proc文件完成.现在,我创建了文件,一切都很好,并花了很长时间阅读互联网的答案,但仍然找不到.你如何内核空间读/写一个/ proc文件?提供给procfile的write_proc和read_proc用于从USER空间读取和写入数据,而我需要该模块能够自己编写/ proc文件.

linux kernel procfs

5
推荐指数
1
解决办法
5194
查看次数

/proc/cpuinfo 地址大小信息与内存页大小有什么关系?

标记为 -lm 的 cpu 上的 cat /proc/cpuinfo 给出

address sizes   : 36 bits physical, 48 bits virtual
Run Code Online (Sandbox Code Playgroud)

确定的页面大小

#include <unistd.h>
int getpagesize(void);
Run Code Online (Sandbox Code Playgroud)

给出 4096 字节。

使用后一种信息,我会认为系统使用地址的最低有效 12 位作为偏移量,其余的用于通过 TLB 和页表将虚拟地址转换为物理地址。

cpuinfo 中的信息与页面大小有何关系?

linux memory procfs

5
推荐指数
1
解决办法
2776
查看次数

RCHAR是否包含READ_BYTES(proc/<pid>/io)?

我读过proc/<pid>/io来测量SQL查询的IO活动,其中<pid>是数据库服务器的PID.我读取每个查询之前和之后的值以计算差异并获得请求被读取和/或写入的字节数.

据我所知,该字段READ_BYTES计算实际的磁盘IO,同时RCHAR包含更多内容,例如linux页面缓存可以满足的读取(请参阅了解/ proc/[pid]/io中的计数器以 进行说明).这导致了假设,即RCHAR应该得到一个等于或大于的值READ_BYTES,但我的结果与这个假设相矛盾.

我可以想象我为Infobright ICE得到的一些小块或页面开销(值为MB):

        Query        RCHAR   READ_BYTES
tpch_q01.sql|    34.44180|    34.89453|
tpch_q02.sql|     2.89191|     3.64453|
tpch_q03.sql|    32.58994|    33.19531|
tpch_q04.sql|    17.78325|    18.27344|
Run Code Online (Sandbox Code Playgroud)

但我完全不理解MonetDB的IO计数器(值为MB):

        Query        RCHAR   READ_BYTES
tpch_q01.sql|     0.07501|   220.58203|
tpch_q02.sql|     1.37840|    18.16016|
tpch_q03.sql|     0.08272|   162.38281|
tpch_q04.sql|     0.06604|    83.25391|
Run Code Online (Sandbox Code Playgroud)

我错误的假设RCHAR包括READ_BYTES?有没有办法欺骗内核计数器,MonetDB可以使用?这里发生了什么?

我可能会补充一点,我清除页面缓存并在每次查询之前重新启动数据库服务器.我在Ubuntu 11.10上运行内核3.0.0-15-generic.

linux io monetdb linux-kernel procfs

5
推荐指数
1
解决办法
2061
查看次数

在Linux中获取TCP RTT

我需要获取TCP流的RTT.我已经查看了proc文件系统,但无法获得TCP的RTT值.如果有任何人对此有任何想法,那么RTT将存储在哪个文件中.

提前致谢.

linux procfs

5
推荐指数
1
解决办法
5536
查看次数

损坏的符号链接和神秘的(已删除)

我一直在用 linux 上的 proc 文件系统做一些事情,我遇到了一些我想澄清的行为。

每个进程/proc都有一个指向它的可执行文件的符号链接,/proc/{pid}/exe. 如果一个进程在其可执行文件被删除后继续运行,读取此符号链接将返回可执行文件的路径,(deleted)并附加到末尾。

运行此命令,您甚至可能会在系统上看到一些:

grep '(deleted)' <(for dir in $(ls /proc | grep -E '^[0-9]+'); do echo "$dir $(readlink /proc/$dir/exe)"; done)
Run Code Online (Sandbox Code Playgroud)

我尝试使用一些简单的 bash 命令重新创建此行为:

>>> echo "temporary file" >> tmpfile.test
>>> ln -s tmpfile.test tmpfile.link
>>> rm tmpfile.test
>>> readlink tmpfile.link
tmpfile.test
Run Code Online (Sandbox Code Playgroud)

没有(deleted)附加到名称!尝试cat tmpfile.link确认链接已断开 ( cat: tmpfile.link: No such file or directory)。

然而,前几天,同样的测试确实导致了一个(deleted)被附加到 readlink 的输出。是什么赋予了?

这是我想知道的:

  • 是否有一系列事件保证(deleted)将附加到名称?
  • 为什么/proc/{pid}/exe显示(deleted) …

linux bash symlink procfs

5
推荐指数
2
解决办法
2275
查看次数

使用perl读取系统文件而不在打开时发出额外的搜索系统调用

我正在尝试使用perl来解析来自/proc/syslinux伪文件系统(procfssysfs)的一些伪文件.这些文件与常规文件不同 - 它们由自定义文件操作处理程序实现.其中大多数都是零大小stat,有些不能打开阅读,其他不能写.有时它们被错误地实现(这是错误的,但它已经在内核中)并且我仍然希望直接从perl读取它们而无需启动一些帮助工具.

有一个/proc/loadavg使用perl 读取的快速示例,此文件已正确实现:

perl -e 'open F,"</proc/loadavg"; $_=<F>; print '
Run Code Online (Sandbox Code Playgroud)

使用strace该命令,我可以检查perl如何实现open函数:

$ strace perl -e 'open F,"</proc/loadavg"; $_=<F>; print ' 2>&1 | egrep -A5 ^open.*loadavg

open("/proc/loadavg", O_RDONLY)         = 3
ioctl(...something strange...)    = -1 ENOTTY
lseek(3, 0, SEEK_CUR)                   = 0
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
Run Code Online (Sandbox Code Playgroud)

目前lseek所使用的系统调用openPerl函数.

有了strace,cat /proc/loadavg没有额外的seek系统调用:

$ …
Run Code Online (Sandbox Code Playgroud)

linux perl file-io seek procfs

5
推荐指数
1
解决办法
371
查看次数

无法访问 GDB 中 [vvar] 内存区域的内容?

我正在 Linux 下对 GDB 中的进程进行实时调试,我发现无法读取定义/proc/${PID}/maps为以下内容的内存区域的内容:

3aaef123000-3aaef125000 r--p 00000000 00:00 0                            [vvar]
Run Code Online (Sandbox Code Playgroud)

显然,中的r标志r--p表明它是可读的,但 GDB 总是告诉我它无法访问该内存区域的内容,例如:

警告:无法在<address>处访问<count>个字节的目标内存,停止搜索。

究竟什么是[vvar]内存区域?为什么我不能从 GDB 读取它的内容?

编辑:可能有助于回答问题的场外资源:

  • 实现虚拟系统调用- 一篇旧的(2014 年 10 月)并且很可能已经过时的 LWN 文章文章提到了该[vvar]部分。一半没看懂。
  • vvar, gup && coredump - 一个内核邮件列表线程(2015 年 3 月),关于似乎是同一问题的内容。也没看懂。

如果有人能用更简单的术语向我解释这一点,我将不胜感激。

linux memory gdb procfs

5
推荐指数
1
解决办法
3794
查看次数

如何从用户空间获取映射内存区域的数量(mm_struct-&gt;map_count)

我想将映射内存区域的数量添加到我的守护进程的状态报告中。

您可能想要这样的原因有很多:

  1. 有一个限制(vm.max_map_count),所以最好监控当前值。
  2. 不断增长的数字可能是导致不必要的虚拟内存碎片的分配器错误的迹象。
  3. 越来越多的数字可能是泄漏文件映射的迹象。它们不一定会导致 RSS 增长,也可能不会触发 OOM。但是,它们会污染 VMA 树并可能超过 max_map_count 限制。

问题是:从流程内部获取此数字的最佳方法什么?

一种方法是计算 /prof/self/map 中的行数,但它看起来并不理想。我既不想解析一个 10K 行的文本文件来获取单个整数,也不想每次都实现整个缓冲区。

内核中已经有一个计数器(mm_struct->map_count),所以我希望它出现在 /proc/self/* 的某个地方,但实际上找不到它。有任何想法吗?

linux mmap procfs sysctl

5
推荐指数
0
解决办法
257
查看次数