草庐IT

linux - Linux 内核 v2.6+ 中的 pthread 与 kthread

这是一个概念性的问题。根据这个post,pthread实际上是使用clone()系统调用实现的。所以我们可以推断在用户空间有一个内核线程(或者轻量级进程)在备份一个pthread。内核知道pthread并且可以像进程一样调度它。至于kthread,根据RobertLove,kthreads也是用clone()系统调用创建的:clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0)因此pthread和kthread都使用clone()调用。我的第一个问题是:这两种线程有区别吗?为了回答我自己的问题,我继续阅读:Thesignificantd

linux - 如何从外部模块导出符号?

我在内核源代码树之外编码。有两个模块,第一个printt有一个函数printtty()来打印字符串到当前tty,第二个模块hello它在初始化期间调用printtty()。我在模块printt中添加了EXPORT_SYMBOL(printtty),在insmod./printt.ko之后,的信息printtty()可以在/proc/kallsyms中看到。模块hello的make过程一切正常。但是insmod./hello.ko会导致如下错误:insmod:ERROR:couldnotinsertmodulehello.ko:Invalidparameters和dmesg显示hello

linux - 如何从外部模块导出符号?

我在内核源代码树之外编码。有两个模块,第一个printt有一个函数printtty()来打印字符串到当前tty,第二个模块hello它在初始化期间调用printtty()。我在模块printt中添加了EXPORT_SYMBOL(printtty),在insmod./printt.ko之后,的信息printtty()可以在/proc/kallsyms中看到。模块hello的make过程一切正常。但是insmod./hello.ko会导致如下错误:insmod:ERROR:couldnotinsertmodulehello.ko:Invalidparameters和dmesg显示hello

linux - 正确导出 Linux 头文件、模块

从树中构建内核驱动程序时,我在驱动程序目录中像这样运行make,其中KERNELDIR是内核源代码或header的路径。make-C$(KERNELDIR)M=$(PWD)modules当我尝试自己构建header时:makeheaders_installARCH=i386INSTALL_HDR_PATH=$(HEADERSDIR)我发现导出不适合构建模块(没有完整的内核源代码树)似乎缺少几个文件和文件夹,例如Makefile、脚本、include/generated/autoconf.h或include/config/auto.conf等。Debian以可用的方式做事,如rules.

linux - 正确导出 Linux 头文件、模块

从树中构建内核驱动程序时,我在驱动程序目录中像这样运行make,其中KERNELDIR是内核源代码或header的路径。make-C$(KERNELDIR)M=$(PWD)modules当我尝试自己构建header时:makeheaders_installARCH=i386INSTALL_HDR_PATH=$(HEADERSDIR)我发现导出不适合构建模块(没有完整的内核源代码树)似乎缺少几个文件和文件夹,例如Makefile、脚本、include/generated/autoconf.h或include/config/auto.conf等。Debian以可用的方式做事,如rules.

linux - ioctl参数(如0x1268/BLKSSZGET)实际指定在哪里?

我正在寻找描述ioctl0x1268(BLKSSZGET)的预期参数和行为的明确规范。这个数字在很多地方都有声明(没有一个包含明确的引用来源),例如linux/fs.h,但我找不到它的规范。当然,过去某个时候有人决定0x1268将获取设备的物理扇区大小,并将其记录在某处。这些信息从何而来,我在哪里可以找到它?编辑:我不是在问BLKSSZGET通常做什么,也不是在问它在什么标题中定义。我正在寻找一个确定的、标准化的来源,说明它应该采用什么参数类型以及它的行为应该是什么任何实现它的驱动程序。具体来说,我问是因为在util-linux2.23(和2.24)的blkdiscard中似乎存在一个

linux - ioctl参数(如0x1268/BLKSSZGET)实际指定在哪里?

我正在寻找描述ioctl0x1268(BLKSSZGET)的预期参数和行为的明确规范。这个数字在很多地方都有声明(没有一个包含明确的引用来源),例如linux/fs.h,但我找不到它的规范。当然,过去某个时候有人决定0x1268将获取设备的物理扇区大小,并将其记录在某处。这些信息从何而来,我在哪里可以找到它?编辑:我不是在问BLKSSZGET通常做什么,也不是在问它在什么标题中定义。我正在寻找一个确定的、标准化的来源,说明它应该采用什么参数类型以及它的行为应该是什么任何实现它的驱动程序。具体来说,我问是因为在util-linux2.23(和2.24)的blkdiscard中似乎存在一个

c - 在 Linux 中调试一个简单的字符驱动程序在 device_create() 上失败

我写了一个简单的char驱动程序,现在想使用类在udev中自动注册它。我的代码包括加载驱动程序时调用的init函数和驱动程序加载其设备时调用的probe函数(当然还有它们的反等价exit和删除)。问题:添加新设备后,我的probe函数在执行device_create命令时失败。现在我想知道为什么:我怎样才能获得有关此命令失败原因的更多信息(除此之外)?缺少任何参数(例如我的fooClass全局声明是否存在问题,我是否应该将其移至probe函数,这在我看来没有意义,但在许多示例中显示)?或任何其他监督错误?按照我的代码,我删除了大部分返回验证(如IS_ERR())并清理函数以提高可读性。

c - 在 Linux 中调试一个简单的字符驱动程序在 device_create() 上失败

我写了一个简单的char驱动程序,现在想使用类在udev中自动注册它。我的代码包括加载驱动程序时调用的init函数和驱动程序加载其设备时调用的probe函数(当然还有它们的反等价exit和删除)。问题:添加新设备后,我的probe函数在执行device_create命令时失败。现在我想知道为什么:我怎样才能获得有关此命令失败原因的更多信息(除此之外)?缺少任何参数(例如我的fooClass全局声明是否存在问题,我是否应该将其移至probe函数,这在我看来没有意义,但在许多示例中显示)?或任何其他监督错误?按照我的代码,我删除了大部分返回验证(如IS_ERR())并清理函数以提高可读性。

通过 sysfs 访问 Linux 驱动程序

我正在制作一个小型内核模块,以提供用户空间访问ARMv7芯片的某些仅内核模式功能(特别是缓存控制)。我正在通读Corbet、Rubini和Hartman的Linux设备驱动程序。他们在其中描述了如何制作完整的驱动程序+设备+总线。我根本不想创建总线驱动程序。事实上,我制作的“驱动程序”根本不需要匹配设备定义——它隐式匹配平台的CPU。谁能给我解释一下:我的属性应该放在sysfs的什么地方?它应该在/sysfs/modules/mymodule下的我的模块条目中吗?/sys/devices/platform似乎也很有前途,/sys/devices/system/cpu也是如此。如果有一个