Tag: linux kernel

怀疑linux中的container_of宏

为什么我们使用container_of宏? container_of(pointer, container_type, container_field); 据LDD说 “这个宏在一个类型为container_field的结构中接受一个名为container_field的字段的指针,并返回一个指向包含结构的指针”。 我的问题是: 如果我们想要一个指向结构的指针(即container_type),我们可以直接分配,对吧? 那为什么其中一个字段的指针被用来为整个结构分配地址? 任何人都可以用一个例子解释使用该宏的优势吗?

从内核空间代码访问文件?

我正在浏览源代码“ drivers / staging / comedi / drivers / serial2002.c ”,实现提示从内核空间代码访问文件。 系统调用(读,写)提供了一个标准接口,可防止对h / w和其他系统资源的错误访问。 简而言之,应该从用户空间访问设备文件。 所以我很困惑为什么我们需要从内核空间访问文件,因为这种实现不提供安全function。 请提供指针,了解原因。

当读取带有错误ENOMEM返回的套接字时,怎么会发生这种情况

当读取带有错误ENOMEM返回的套接字时,怎么会发生这种情况? 男人2看了,我看不出有关这个错误的任何细节,有人可以帮帮我。 谢谢。 我的linux内核2.6.26-1-686。

在linux内核中嵌入锁定的动态分配/自由结构

我想释放一个嵌入了spin_lock的结构。 场景如下: 我有两个function f1 () { ***************** spin_lock_irqsave(&my_obj_ptr->my_lock, flags) …. …. …………………………………. here f2 is called spin_lock_irqstore(&my_obj_ptr->my_lock, flags) ******************* kfree(my_obj_ptr) } 和f2具有与f1类似的内容。 当f2被调用时,正在使用my_lock,f2必须忙着等待。 但是,当f2进入临界区时,my_obj_ptr是免费的。 内核崩溃…… 我现在想的是在struct my_obj中添加一个ref_count变量 在spin_lock_irqsave => ref_count ++之前 在spin_lock_irqstore => ref_count–之后 在免费之前,请检查ref_count变量。 现在似乎没有崩溃。 我只是想知道是否会有角落案件,我不考虑? 或者有更好的方法来处理这个问题? 任何帮助将不胜感激。 谢谢

转换和copy_to_user宏

我需要将curr_task->pid (内核空间中的curr_task->pid复制到用户空间中具有很长空间的结构字段。 由于这是一个不断扩大的转换,我不期待任何问题。 但是,我收到一个令人讨厌的编译器警告( copy_long_to_user与copy_to_user一样用于所有意图和目的): cs300/process_ancestors.c:31:3: warning: passing argument 2 of ‘copy_long_to_user’ from incompatible pointer type [enabled by default] if(copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_task->pid)) { ^ cs300/process_ancestors.c:9:5: note: expected ‘long int *’ but argument is of type ‘pid_t *’ 这个警告是我可以放心忽略的(编译器会为我做演员表)吗? 如果我需要明确地将curr_task->pid转换为long,那么如何在使用copy_to_user的上下文中执行此操作? 我的猜测是这样的: (copy_long_to_user(&info_array[num_filled_kernel].pid, &((long)curr_task->pid)))

从用户空间应用程序调用内核空间中的用户定义函数

我在我的设备驱动程序中编写了一个用户定义的函数,我想从用户空间应用程序中调用它。 我该如何实现这一目标? 我所说的用户定义函数是除了内核定义函数之外的任何函数。 在struct file_operations定义的指针,如下所示。 struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct […]

call_usermodehelper()中的UMH_NO_WAIT是否正常工作?

我怀疑call_usermodehelper()中的UMH_NO_WAIT选项是否正常工作,或者我遗漏了什么。 这是参考以下线程, 内核模块定期调用用户空间程序 #include /* Needed by all modules */ #include /* Needed for KERN_INFO */ #include /* Needed for the macros */ #include #include #include #include #include #include #include #define TIME_PERIOD 5000000000 static struct hrtimer hr_timer; static ktime_t ktime_period_ns; static enum hrtimer_restart timer_callback(struct hrtimer *timer){ char userprog[] = “test.sh”; char *argv[] = {userprog, “2”, […]

在C中遍历内核空间中的祖先的结束标志

我试图遍历进程的所有祖先,将其信息存储在用户传递的静态数组中,并且我使用NULL指针结束标志来结束遍历。 但是,这似乎不起作用,并且将继续循环,直到用户空间传递的大小编号(数组的容量)在所有情况下都匹配num_filed数字(数组中的元素数量),即使我有运行的进程数量很少。 那么,什么似乎是穿越祖先的结束标志? 这是我的遍历循环代码: current_process = current; int i = 0; while (current_process != NULL && current_num_filled parent; }

linux-kernel模块最大分配内存

我想编写一个模块,其任务是捕获传入的数据包,而不将它们发送到用户空间应用程序并对捕获的数据包进行一些修改。 然后该模块将发送此数据包以传输到NIC。 但主要的问题是我的模块尺寸非常大而且还进行了大量的处理。 因此,在内核模块内部进行此处理是好的,还是应该将信息和数据包传递给用户空间进行处理以避免复杂性。 &我这样做只是为了快速获取数据包处理。 所以最大化linux内核模块可以分配多少内存。

初始化元素不是常数 – 如何解决错误?

点击此链接 我做了: static const struct attribute const *attrs1= { &foo_attribute.attr, NULL, }; static const struct attribute_group const attr_group = { .attrs = attrs1, }; 但是得到这些错误: error: initializer element is not constant error: (near initialization for ‘attr_group.attrs’) 发现这个解决方案,但不明白如何解决它… 编辑:该行触发了错误: .attrs = attrs1,