何时在内核中发生中断,以及是否正在读取内核中的时间戳。 我正在通过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 sk_buff *skb) 
{
     skb->tstamp = ktime_get_real();   //this will give a timestamp and it will be stored in //skb buffer
     //I am calculating a timestamp here. because whenever kernel receive the data then the kernel is 
     //interrupted and start executing the newly arrived task but I have to read the time when the 
    //interrupt  occurs and get the value of it.
} 

但是如何将存储在skb->tstamp该值复制到procfs驱动程序? 最后我想将此时间戳值发送给用户?

===============>>#1 票数:1

There is sample proc code and its output


Sample proc code
===============

[root@localhost p]# cat test.c 

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/jiffies.h>
#include <linux/seq_file.h>

//extern uint64_t interrupt_time;

static struct proc_dir_entry *test_dir;

static int my_proc_show(struct seq_file *m, void *v)
{
    seq_printf(m, "%lu\n", jiffies);
    //seq_printf(m, "%lu", interrupt_time);
    return 0;
}

static int my_proc_open(struct inode *inode, struct file *file)
{
    return single_open(file, my_proc_show, NULL);
}

static const struct file_operations tst_fops = {
    .open       = my_proc_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = single_release,
};

static int __init test_init(void)
{
    test_dir = proc_mkdir("myproc", NULL);

    if (test_dir)
            proc_create("jiffies", 0, test_dir, &tst_fops);

    return 0;
}
static void __exit test_exit(void)
{
    remove_proc_entry ("jiffies", test_dir);
    proc_remove (test_dir);
}
module_init(test_init);
module_exit(test_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Test");

    Output
   ======
    [root@localhost p]# cat /proc/myproc/jiffies 
    4325737301

===============>>#2 票数:0

我想您已经添加了这一行interrupt_time = skb -> timestamp 如果是的话

  1. 在内核空间中打开proc文件(检查fs / proc /并添加时间戳记条目)
  2. 注册您的打开/读取呼叫。
  3. 每当用户尝试读取文件时,Linux内核调用已注册的读取调用,在您的情况下为dev_read。

检查此链接以了解如何使用proc fs

  ask by user3458454 translate from so

未解决问题?本站智能推荐:

1回复

在内核中创建一个简单的只写proc条目

当我使用命令echo 'hello' > /proc/write时,终端上没有任何显示。 您能帮我发现代码中的错误吗? 我在上面写的字符串应该已经显示在终端上。 范例: $ echo'你好'> / proc / write 你好
1回复

当同一驱动程序的多个实例同时运行时,内核如何处理对proc文件的读取操作

我对同一个驱动程序的多个实例同时运行时处理proc文件的方式有疑问。 假设我的系统同时运行同一驱动程序的几个实例,但是只有其中一个实例(根据内部决策)创建了一个proc文件,并维护在读取文件时应写入的信息。 由于所有实例都是同一驱动程序,因此它们都包含将在读取proc文件时调用的函数(尽管此
1回复

使用procfs的内核的用户输出将在哪里?

我想从内核读取一个值并在用户应用程序中使用它,因此我正在使用procfs api从内核读取并在用户空间中使用它。 以上是从内核读取并将其存储在用户缓冲区(buf)中的读取功能。 但是,如果我想从用户应用程序中读取输出,那么将从用户空间中存储的内核中读取值? 有人可以帮我吗?
1回复

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

我正在计算内核中的时间戳,后来我想将tmestamp从内核转移到用户空间。 所以我正在使用procfs在内核和用户之间进行通信。 我正在使用procfile_read函数从内核发送数据,如下所示。 我修改并计算了内核代码的时间戳,如下所示。 //此代码位于网络设备驱动程序级别。
1回复

用户空间应用程序如何从内核空间接收数据?

我正在计算dev.c内核源代码中的中断时间,如下所示: 我正在使用procfs从内核空间向用户空间写入数据,并在内核空间中使用以下api将数据发送到用户空间。 PROCFS.c: 如上所示,是否可以从PROCFS.c中的dev.c中读取InterruptTime? 从上述内核
2回复

如何在Linux内核中重用变量?

如上所述,我在dev.c中修改了内核源代码。 稍后,我在procfs中创建一个可加载的内核模块,并使用currentrx_time将其发送到用户空间,如下所示: 但是由于未声明current_rx_time在上面编译我的模块时遇到错误。 有人可以告诉我如何解决这个问题吗?
5回复

如何知道Linux Scheduler时间片?

我正在寻找我的Linux内核的时间片(或量子)的值。 是否有一个/proc文件公开此类信息? (或者)在我的发行版的Linux标头中是否定义明确? (或者)是否存在公开此值的Linux API的C函数(也许是sysinfo)? 提前致谢。
1回复

使用ssize_t(* read)函数而不是seq_file实现

我已经在proc下创建了一个文件以读取字符串,但是我可以使用file_operations中的ssize_t(* read)方法读取该文件,而不是使用seq_file实现。 这种方法是错误的吗? 谁能解释在什么情况下使用seq_file实现更好? 同样在输出中,我总是得到1310
1回复

如何读取在内核空间中与uid相关联的gids列表?

我有一个Linux内核驱动程序,它基于gid进行一些身份验证。 驱动程序将获得uid作为输入。 现在,我需要获取与此用户相关联的所有信息。 例如: 如果驱动程序获取1313作为uid,我需要读取所有gid,即1313、4、24、27、30、46、124 可能吗?
1回复

平衡Linux内核中的内存使用量

我正在为Linux内核开发一些网络驱动程序。 我在重新分配或释放“ skb”结构时遇到了多个if-else条件-这是我有些困惑的地方。 关于在if-else中该怎么做-我遇到2种错误: Calltrace,因为双重释放了skb,然后内核崩溃并重新启动 内存泄漏,因为我没有释