Tag: linux kernel

为什么在中断处理程序中使用自旋锁

我想知道为什么在中断处理程序中使用自旋锁而不是信号量。

关于linux设备驱动程序中的register_chrdev_region()的问题

我正在学习使用register_chrdev_region(dev_t from, unsigned count, const char * name);内核模块register_chrdev_region(dev_t from, unsigned count, const char * name); 。 我注意到有或没有这个函数,我的内核模块按预期工作。 我用来测试的代码: first = MKDEV(MAJOR_NUM, MINOR_NUM); register_chrdev_region(first, count, DEVICE_NAME);//ops= &fops; mycdev->owner = THIS_MODULE; if (cdev_add(mycdev,first, count) == 0) {printk(KERN_ALERT “driver loaded\n”);} 我注释掉了register_chrdev_region(first, count, DEVICE_NAME);行register_chrdev_region(first, count, DEVICE_NAME); , printk消息仍然出现。 我试图在有或没有用户空间的情况下与驱动程序通信,两者都是成功的。 所以我的问题是,这个函数register_chrdev_region()仅用于使我的驱动程序成为一个好的内核公民,就像告诉其他人“我用完主要数字,请不要使用”? 我试着看一下内核源代码char_dev.c来理解这个function,但是我发现它太难理解了,有谁熟悉这个? 谢谢!

尽管在Linux内核模块中使用EXPORT_SYMBOL,如何防止“错误:’符号’未声明”?

当我收到此错误时,我将一些驱动程序嵌入到Linux内核中(我在板文件中添加设备并注册它): error: ‘kxtf9_get_slave_descr’ undeclared here (not in a function) 我将上面的函数放在驱动程序文件中 struct ext_slave_descr *kxtf9_get_slave_descr(void) { return &kxtf9_descr; } EXPORT_SYMBOL(kxtf9_get_slave_descr); 它不应该由EXPORT_SYMBOL“可见”吗? 包含上面代码的C文件没有头文件(我没有写它,我只是在这里找到它并且我正在实现。他们说它已经过测试所以我假设不需要头文件? 其余代码编译完美(因此它“看到”文件夹中的代码),包含上面代码的文件也编译完成!

“Linux内核编程”中的源代码示例

正在阅读Robert Love的书,第5章关于系统调用,并发现这个简单的例子有点可疑: asmlinkage long sys_silly_copy(unsigned long *src, unsigned long *dst, unsigned long len) { unsigned long buf; if (copy_from_user(&buf, src, len)) return -EFAULT; … } 我们看到’buf’是’unsigned long’类型的对象,并在内核堆栈上定义,即它的初始值很可能是垃圾。 无论如何,在buf所在的堆栈中复制’len’字节是有效的,即它可以覆盖有用的东西吗? 也许这只适用于这个特定的例子?

在内核中处理线程的正确方法?

我已经看到了各种各样的零散信息,但我似乎无法得到最终答案。 你如何清理内核中的僵尸线程? 为了确保并在内核中生成处理线程的最终正确方法,我想更广泛地问这个问题。 如何在Linux内核中创建,终止和清理线程? 到目前为止我所拥有的是: thread_func: exited = 0; while (!must_exit) do stuff exited = 1; do_exit(0) init_module: must_exit = 0; exited = 1; kthread_run(thread_func, …) /* creates and runs the thread */ cleanup_module: must_exit = 1; while (!exited) set_current_state(TASK_INTERRUPTIBLE); msleep(1); /* How do I cleanup? */ 我发现清理解决方案最接近的是release_task ,但我没有找到任何谈论它的地方。 我想,因为线程函数是kthread_create , kthread_run等,应该有一个kthread_join或kthread_wait ,但是没有。 do_wait似乎也有可能,但它不需要struct task_struct […]

分段故障如何在内部工作(内核/硬件)?

从广义上讲,我想知道内核(或CPU)如何知道进程试图访问它缺少权限的内存位置,以及称为MMU的神秘硬件如何帮助实现这一点。 特别是:在我看来,MMU对操作系统内核的内存管理模型(分页,内存区域,进程地址空间……)是不可知的(我认为Linux和Windows页面不完全相同,因为例如,如果我错了,请纠正我。 但是,我的CPU如何确定当前代码是否可以访问位置x ? 它如何向内核发出信号?

如何在Linux内核中将char 字符串转换为int?

如何在linux内核中将char []转换为int validation输入的文本实际上是一个int? int procfile_write(struct file *file, const char *buffer, unsigned long count, void *data) { char procfs_buffer[PROCFS_MAX_SIZE]; /* get buffer size */ unsigned long procfs_buffer_size = count; if (procfs_buffer_size > PROCFS_MAX_SIZE ) { procfs_buffer_size = PROCFS_MAX_SIZE; } /* write data to the buffer */ if ( copy_from_user(procfs_buffer, buffer, procfs_buffer_size) ) { return -EFAULT; } […]

copy_to_user vs memcpy

我一直被告知(在书籍和教程中),在将数据从内核空间复制到用户空间时,我们应该使用copy_to_user()并使用memcpy()会给系统带来问题。 最近我错误地使用了memcpy(),它可以很好地解决任何问题。 为什么我们应该使用copy_to_user而不是memcpy() 我的测试代码(内核模块)是这样的: static ssize_t test_read(struct file *file, char __user * buf, size_t len, loff_t * offset) { char ani[100]; if (!*offset) { memset(ani, ‘A’, 100); if (memcpy(buf, ani, 100)) return -EFAULT; *offset = 100; return *offset; } return 0; } struct file_operations test_fops = { .owner = THIS_MODULE, .read = test_read, }; static […]

如何在编写Linux内核模块时获取userID

这是我的内核模块中的函数,我在后续阶段使用insmod命令后插入。 我正在研究goldfish (2.6.29) asmlinkage long our_sys_read(unsigned int fd, char *buf, size_t count) { printk(“——->> our_sys_read getuid() ———- %d\n”, getuid()); return original_call_read(fd,buf,count); } 我想捕获系统调用并找出哪些用户进行了这些系统调用。 但是当我运行’make’时,它会抛出我的错误。 /home/mohsin/LKM/trapcall.c:245: error: implicit declaration of function ‘getuid’ 任何建议将不胜感激。

printk在一个中断处理程序中,它真的那么糟糕吗?

大家都知道中断处理程序应该尽可能短。 并且在中断处理程序中添加用于调试的函数如printk是不应该做的事情。 实际上,我之前在为我编写的中断驱动的char设备调试linux内核时尝试过它,它破坏了驱动程序的时序。 我的问题是,为什么会发生这种情况? printk函数被缓冲! 这意味着,据我所知,数据被插入到队列中,并且稍后处理,很可能是在中断处理程序完成之后。 那为什么不起作用呢?