Articles of procfs

如何使用procfs将内核数据发送给用户空间?

我正在计算内核中的时间戳,后来我想从内核到用户空间传输tmestamp。 所以我使用procfs来进行内核和用户之间的通信。 我正在使用procfile_read函数从内核发送数据,如下所示。 我修改并计算了内核代码的时间戳,如下所示。 //此代码位于networking设备驱动程序级别。 int netif_rx(struct sk_buff *skb) { __net_timestamp(skb);//I modify the code in kernel to get the timestamp and store in buffer // or I can use : skb->tstamp = ktime_get_real(); //to get the timestamp } / ** * procfs2.c – 在/ proc *中创build一个“文件” #include <linux/module.h> /* Specifically, a module */ #include <linux/kernel.h> […]

使用proc文件打印mem_map的虚拟地址

我必须在内核中打印mem_mapvariables的内容。 但是,当我通过发布make编译我的代码时,我发现: WARNING: "mem_map" [/home/babak/code/module/mem_map.ko] undefined! 从: make -C /home/babak/code/linux-3.19.5 M=/home/babak/code/module modules make[1]: Entering directory '/home/babak/code/linux-3.19.5' CC [M] /home/babak/code/module/mem_map.o Building modules, stage 2. MODPOST 1 modules WARNING: "mem_map" [/home/babak/code/module/mem_map.ko] undefined! LD [M] /home/babak/code/module/mem_map.ko make[1]: Leaving directory '/home/babak/code/linux-3.19.5' 有我包括头,我的理解是,mem_map应该是在mmzone.h我不知道为什么它不拾起variables。 #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/types.h> /* size_t */ #include <linux/fcntl.h> /* O_ACCMODE */ #include […]

以非root用户身份以编程方式删除Linuxcaching

出于testing目的,我可以通过写入procfs下的Linux中的drop_caches文件来删除caching的内存。 我只能以root身份执行此操作。 这是在embedded式Linux上,所以没有sudo。 sync; echo 3 > /proc/sys/vm/drop_caches 我可以用c ++编写程序来编写文件 – > 如何以编程方式在Linux系统上清除C ++中的文件系统内存caching? sync(); std::ofstream ofs("/proc/sys/vm/drop_caches"); ofs << "3" << std::endl; 面临的挑战是想以非root用户的身份运行应用程序。 重新启动时,权限如下所示: # cd /proc/sys/vm/ # ls -lrt drop_caches -rw-r–r– 1 root root 0 Feb 13 19:50 drop_caches 而且你似乎无法改变这些权限 – 即使是root用户: # chmod 777 drop_caches chmod: drop_caches: Operation not permitted # chown user:user […]

从内核读取使用procfs的时间戳 – 从内核读取后存储在哪里?

当中断发生在内核和如果我正在读取内核中的时间戳。 我正在通过procfs从内核读取用户的时间戳。 中断时间值将被存储在哪里? 用户应该如何从用户空间读取该值? ssize_t dev_read(struct file *filp,const char *buf,size_t count,loff_t *offset) { if ( count < sizeof(InterruptTime) ) { // Not enough space provided. return 0; // Or some error code maybe. } if (copy_to_user(buf,&InterruptTime,sizeof(InterruptTime)) { return -EFAULT; } else { return sizeof(InterruptTime); // Number of bytes we copied. } } 这是我在/linuxversion/net/core/dev.c中修改的代码 int netif_rx(struct […]

为什么proc / ID / maps具有共享库的多个条目

我正在研究embedded式Linux下的proc / ID / maps,而且我注意到一些共享库在一个进程的内存映射中出现了几次,为什么呢? 40094000-400d9000 r-xp 00000000 b3:09 723 /system/lib/libc.so 400d9000-400da000 —p 00000000 00:00 0 400da000-400dc000 r-xp 00045000 b3:09 723 /system/lib/libc.so 400dc000-400de000 rwxp 00047000 b3:09 723 /system/lib/libc.so 400de000-400e9000 rwxp 00000000 00:00 0 400e9000-400ed000 r-xp 00000000 b3:09 770 /system/lib/libgccdemangle.so 400ed000-400ee000 —p 00000000 00:00 0 400ee000-400ef000 r-xp 00004000 b3:09 770 /system/lib/libgccdemangle.so 400ef000-400f0000 rwxp 00005000 b3:09 770 […]

/ proc / pid / loginuid中的一些uid是奇怪的

我正在分析unix / linux中的procfs,一些进程的loginuid真的很奇怪。 有些PID有一个很大的数字:4294967295。他们是守护进程还是系统事件,或者最近怎么回事? # cat /proc/11071/loginuid 4294967295

Linux内核/ proc FIFO /pipe道

我目前正在尝试创build一个内核模块,它将根据内核事件生成数据,并将它们推送到一个文件中。 在阅读后,这是不好的(我同意),我决定将一个/ proc文件中的数据放在一个用户程序可以从必要时拉的数据更有意义。 然而,这个想法导致了各种各样的问题,特别是在何时以及如何清除这个文件。 所以我想……“为什么我不在/ proc中创build一个命名pipe道,并从中读取? 我有一个为proc文件设置读取函数和写入函数的一般要点,但是我仍然有一个概念上的麻烦,我怎么去做这件事。 也就是说,我将如何编写这样一个函数来获取任意数据并将其写入内核的pipe道? 有没有人有任何想法如何将数据从内核空间推送到命名pipe道? 最后,它不一定是/ proc文件(特别是如果我这样做是错误的),但这是我来到的结论。 然后,我将不得不弄清楚如何从用户空间程序附加到它,但我觉得这是一个单独的问题。

Linux的c + +:apis与/ proc文件?

我工作的应用程序来收集和发送系统信息的各种位(分区空间/免费,笔记本电池信息等)。 我没有太多的成功得到这个信息的forms直接c + + api ..虽然它的所有可用通过文件在/ proc(或类似)。 所以 – 我想知道是否读取/parsing我的c + +应用程序中的这些文件是获取此信息的适当方式,或者我应该不断尝试发现API? (注意:我正在使用statvfs)。 到目前为止,在Win32中收集这类信息似乎更容易。 看起来很奇怪。

通过/ proc / mounts监视挂载点更改

根据proc手册,可以通过打开“/ proc / mounts”并在select()调用中添加文件描述符来读取fd_set来监视linux系统中的挂载点更改。 以下代码在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++); […]

如何parsing通过/ proc文件传递给内核模块的大量数据?

编辑:我已经findseq_file ,可以轻松地从内核写入大量的数据到用户空间。 我正在寻找的是相反的; 一个API,便于从用户空间读取大量数据(多个页面)。 编辑2 :我正在执行一个<stdio.h>的端口作为内核模块,能够打开类似于FILE的/proc (以及后来的其他虚拟文件系统),并处理类似于<stdio.h>input和输出<stdio.h> 。 你可以在这里find项目。 我发现很多关于内核如何将大量数据写入/ proc(用于用户空间程序)的问题,但是却没有其他办法。 让我详细说明一下: 这个问题基本上是关于input被标记的algorithm(例如int或者int和string的混合等), 假设数据可能在多个缓冲区之间被破坏 。 例如,想象下面的数据被发送到内核模块: 12345678 81234567 78123456 67812345 5678 1234 45678123 3456 7812 23456781 为了这个例子,我们假设Linux提供/ proc处理程序的页面大小是20个字节(相对于真实的4KB)。 从/ proc(在内核模块中)读取数据的函数会看到这样的数据: call 1: "12345678 81234567 78" call 2: "123456 67812345 5678" call 3: " 1234 45678123 3456 " call 4: "7812 23456781" 正如你所看到的,当第一次调用78时,它不应该被处理,直到下一个帧才能决定78是一个整数还是一个帧之间的一个剪切。 现在我发现seq_file显然只是在内核想要写数据给用户而不是读 (或者可能是HOWTO被写成可怕的)的时候。 我做了什么 […]