我正在尝试解析套接字信息/proc/net/tcp,虽然我可以识别一些字段,例如内存地址或发送队列使用,但我无法找到每个条目如何绑定到其套接字描述符.例如,有了这些数据:
1: 5922140A:E459 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000 1000 0 507218 1 f6ab1300 57 3 12 4 -1
Run Code Online (Sandbox Code Playgroud)
我想知道哪个是对应的套接字描述符.
我解析数据/proc/[pid]/statm以获得关于某个进程的内存使用情况的线索.man proc说明驻留集大小(以"页面"衡量)与VmRSS(KB ??)相同/proc/[pid]/status.由于它们具有不同的值,我想了解这些值之间的联系.是否有某种因素我可以在某处阅读/proc(我想到了VmPTE,但它的......其他......)?我应该解析哪一个才能获得某个进程的已用内存的大小?
#ex 1782 = firefox
~$ cat /proc/1782/statm
224621 46703 9317 11 0 98637 0
# \--- resident set size
~$ cat /proc/1782/status | grep Vm
VmPeak: 935584 kB
VmSize: 898484 kB
VmLck: 0 kB
VmHWM: 257608 kB
VmRSS: 186812 kB
VmData: 394328 kB
VmStk: 220 kB
VmExe: 44 kB
VmLib: 61544 kB
VmPTE: 1224 kB
VmSwap: 0 kB
Run Code Online (Sandbox Code Playgroud) 'cat/proc/bus/pci/devices'的前几个字段是可以理解的.
字段1 - BusDevFunc
字段2 - 供应商Id +设备Id
字段3 - 中断线字段
4 - BAR 0
和其后的BAR寄存器(0-5).
打印BAR寄存器后,其他字段是什么?具体来说,打印出哪个PCI配置空间寄存器(偏移)?
由于create_proc_entry功能已被弃用,它的替代品是什么?我试图创建一个简单的proc条目,create_proc_entry但得到了这个错误:
错误:函数'create_proc_entry'的隐式声明
我create_proc_entry在proc_fs.h中抓了一下但是没找到它.有什么东西我缺少或有替代方法吗?
我正在尝试创建一个proc条目.我的init_module函数如下
int init_module()
{
printk(KERN_INFO "proc2:Module Loaded\n");
proc_entry=proc_create_data(proc_name,0644,NULL,&fops,NULL);
if(proc_entry==NULL)
{
printk(KERN_INFO "proc2:Error registering proc entry");
}
else
{
printk(KERN_INFO "proc2:Proc Entry Created");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下是清理方法
void cleanup_module()
{
printk(KERN_INFO "proc2:module unloaded");
remove_proc_entry(proc_name,proc_entry);
}
Run Code Online (Sandbox Code Playgroud)
程序的其余部分包括变量定义和回调函数.
当我编译这个程序时,它编译得很好.当我使用insmod它时不回复我提示.
lsmod列出我的模块和一个人使用的节目(不知道是什么).
dmesg没有显示上述printk消息.
你能告诉我这里有什么问题吗?
我正在开发一个应用程序来收集和发送各种系统信息(分区空间/免费,笔记本电脑电池信息等).我没有太多成功以直接c ++ api的形式获取此信息..虽然它可以通过/ proc(或类似)中的文件获得.
所以 - 我想知道在我的c ++应用程序中读取/解析这些文件是否是获取此信息的适当方式,还是应该继续尝试发现API?(注意:我正在使用statvfs).
到目前为止,看起来在Win32中收集此类信息更容易.似乎很奇怪.
根据proc手册,可以通过打开"/ proc/mounts"监视linux系统中的挂载点更改,并添加文件描述符以读fd_set入select()调用.
以下代码适用于Ubuntu 9.04,而不适用于Ubuntu 10.04(2.6.32 linux内核):
int mfd = open("/proc/mounts", O_RDONLY, 0);
fd_set rfds;
struct timeval tv;
int rv;
FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
int changes = 0;
while ((rv = select(mfd+1, &rfds, NULL, NULL, &tv)) >= 0) {
if (FD_ISSET(mfd, &rfds)) {
fprintf(stdout, "Mount points changed. %d.\n", changes++);
}
FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
if (changes > 10) {
exit(EXIT_FAILURE);
}
}
Run Code Online (Sandbox Code Playgroud)
文件描述符总是在一台机器上可读,因此它会在select调用中不断弹出.即使坐骑没有变化.
我在这里错过了什么吗?
在此先感谢您的帮助!
有没有人成功用Linux内核2.6 mmap'/proc/pid/mem文件?我收到一个ENODEV(没有这样的设备)错误.我的电话看起来像这样:
char * map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, mem_fd, offset);
Run Code Online (Sandbox Code Playgroud)
我通过在调试时查看/ proc/pid/maps文件进行验证,当执行到达此调用时,offset具有堆栈顶部的值减去PAGE_SIZE.我还用ptrace验证了mmap是将errno设置为ENODEV.
编辑:我发现seq_file很容易从内核向用户空间写入大量数据.我正在寻找的是相反的; 一个API,便于从用户空间读取大量数据(多个页面).
编辑2:我正在实现一个<stdio.h>作为内核模块的端口,它能够打开/proc(以及后来的其他虚拟文件系统),类似于FILEs并处理类似的输入和输出<stdio.h>.你可以在这里找到这个项目.
我发现了很多关于内核如何将大量数据写入/ proc(用于用户空间程序)的问题,但没有其他方面.让我详细说明:
这个问题基本上是关于输入被标记化的算法(例如ints或混合int和字符串等),假设数据可能在多个缓冲区之间被打破.
例如,假设以下数据被发送到内核模块:
12345678 81234567 78123456 67812345 5678 1234 45678123 3456 7812 23456781
Run Code Online (Sandbox Code Playgroud)
并且为了这个例子,假设Linux提供/ proc处理程序的页面大小是20字节(相对于真正的4KB).
从/ proc(在内核模块中)读取数据的函数然后查看数据:
call 1:
"12345678 81234567 78"
call 2:
"123456 67812345 5678"
call 3:
" 1234 45678123 3456 "
call 4:
"7812 23456781"
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,当78在第一次调用中读取时,它应该在下一帧之前处理,以便它决定78帧之间是整数还是一帧.
现在我发现seq_files显然只是在内核想要将数据写入用户而不是读取时(或者可能是HOWTO写得非常糟糕).
到目前为止,我已经提出了以下解决方案(我是从记忆中写的,所以我可能会错过几次错误检查,但请耐心等待):
在初始化阶段(比如说init_module …
我正在研究一种有时会劫持应用程序执行的工具,包括在不同的堆栈中工作.
我正在尝试让内核在执行某些系统调用时总是看到应用程序堆栈,这样它就会在/ proc/pid/maps中的正确位置打印[stack]限定符.
但是,简单地修改系统调用周围的esp似乎是不够的.当我在"cat/proc/self/stat"上使用我的工具时,我看到kstkesp(这里的条目29)有时具有我想要的值,但有时会有一个不同的值,对应于我的备用堆栈.
我想了解:
procfs ×10
linux ×7
c ×4
linux-kernel ×3
battery ×1
buffer ×1
c++ ×1
filesystems ×1
kernel ×1
mmap ×1
mount ×1
networking ×1
pci-bus ×1
system-calls ×1