草庐IT

通过 sysfs 访问 Linux 驱动程序

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

linux - 将物理地址映射到虚拟地址linux

我正在开发一个小型嵌入式系统。当我的linux启动到用户空间时,我知道我的设备在物理内存中的位置。我想将它们映射到用户空间虚拟地址。目前,我正在通过内核模块来完成它。我使用vmalloc/kmalloc(取决于大小),然后在返回的虚拟地址上使用ioremap_page_range来映射我的物理地址。我认为那不是正确的做法。首先,我正在分配内存,然后我要求内核将该虚拟地址空间重新映射到一些不同的物理地址空间。(最初在vmcall/kmalloc中映射物理->虚拟有点没用,因为我不关心那些物理页面。这绝对不好。)除此之外,还有一种更好的方法可以将已知的物理内存映射到用户空间进程。(我知道除

linux - 将物理地址映射到虚拟地址linux

我正在开发一个小型嵌入式系统。当我的linux启动到用户空间时,我知道我的设备在物理内存中的位置。我想将它们映射到用户空间虚拟地址。目前,我正在通过内核模块来完成它。我使用vmalloc/kmalloc(取决于大小),然后在返回的虚拟地址上使用ioremap_page_range来映射我的物理地址。我认为那不是正确的做法。首先,我正在分配内存,然后我要求内核将该虚拟地址空间重新映射到一些不同的物理地址空间。(最初在vmcall/kmalloc中映射物理->虚拟有点没用,因为我不关心那些物理页面。这绝对不好。)除此之外,还有一种更好的方法可以将已知的物理内存映射到用户空间进程。(我知道除

Linux 内核 - "put"一个 inode 是什么意思?

我在iput函数的顶部看到了以下注释:/***iput-putaninode*@inode:inodetoput**Putsaninode,droppingitsusagecount.Iftheinodeusecounthits*zero,theinodeisthenfreedandmayalsobedestroyed.**Consequently,iput()cansleep.*/对我来说,这听起来不是在“放置”任何东西,而是在“丢弃”它。我知道drop_inode函数,它在某些情况下从iput调用,因此术语“put”的用法在这里更加困惑。 最佳答案

Linux 内核 - "put"一个 inode 是什么意思?

我在iput函数的顶部看到了以下注释:/***iput-putaninode*@inode:inodetoput**Putsaninode,droppingitsusagecount.Iftheinodeusecounthits*zero,theinodeisthenfreedandmayalsobedestroyed.**Consequently,iput()cansleep.*/对我来说,这听起来不是在“放置”任何东西,而是在“丢弃”它。我知道drop_inode函数,它在某些情况下从iput调用,因此术语“put”的用法在这里更加困惑。 最佳答案

linux - 如何更改内核的版本字符串?

我对Linux很陌生,对构建/编译我自己的内核也很陌生。对于初学者,我只是想弄清楚如何更改内核的版本字符串。例如,当我执行uname-a时,它会打印出“Linuxlocalhost.localdomain3.11.10-100.fc18.i686”。我想自定义它,但我不确定要编辑哪个文件。我知道它一定是我内核目录中的某个文件,但我一直在浏览它们,但没有运气。任何帮助都会很棒! 最佳答案 在顶层Makefile的顶部,有四行VERSION=3PATCHLEVEL=18SUBLEVEL=7EXTRAVERSION=当然,不同内核版本的值

linux - 如何更改内核的版本字符串?

我对Linux很陌生,对构建/编译我自己的内核也很陌生。对于初学者,我只是想弄清楚如何更改内核的版本字符串。例如,当我执行uname-a时,它会打印出“Linuxlocalhost.localdomain3.11.10-100.fc18.i686”。我想自定义它,但我不确定要编辑哪个文件。我知道它一定是我内核目录中的某个文件,但我一直在浏览它们,但没有运气。任何帮助都会很棒! 最佳答案 在顶层Makefile的顶部,有四行VERSION=3PATCHLEVEL=18SUBLEVEL=7EXTRAVERSION=当然,不同内核版本的值

c - C中两个整数的快速双向散列

我正在编写一个Linux内核模块,我需要想出一个以两个整数作为输入的散列函数。因为代码在内核空间中运行,所以我无法使用任何标准库。基本上,我需要一个哈希函数,其中:hash(a,b)=chash(b,a)=c其中a和b的可接受输入是无符号32位整数。散列函数应返回一个无符号的64位整数。冲突(即hash(a,b)=c和hash(d,f)=c)是不可取的,因为这些值将用于二叉搜索树。搜索的结果是可能结果的链接列表,然后在实际比较a和b的位置迭代该列表。所以一些碰撞是可以接受的,但是碰撞越少,所需的迭代次数越少,它运行得越快。性能也极其重要,在我编写防火墙应用程序时,系统中接收到的每个数据

c - C中两个整数的快速双向散列

我正在编写一个Linux内核模块,我需要想出一个以两个整数作为输入的散列函数。因为代码在内核空间中运行,所以我无法使用任何标准库。基本上,我需要一个哈希函数,其中:hash(a,b)=chash(b,a)=c其中a和b的可接受输入是无符号32位整数。散列函数应返回一个无符号的64位整数。冲突(即hash(a,b)=c和hash(d,f)=c)是不可取的,因为这些值将用于二叉搜索树。搜索的结果是可能结果的链接列表,然后在实际比较a和b的位置迭代该列表。所以一些碰撞是可以接受的,但是碰撞越少,所需的迭代次数越少,它运行得越快。性能也极其重要,在我编写防火墙应用程序时,系统中接收到的每个数据

linux - madvise(___, ___, MADV_DONTNEED) 是否指示操作系统延迟写入磁盘?

假设,假设我想对一个可能非常大的文件执行顺序写入。如果我mmap()一个巨大的区域并在整个区域上进行madvise(MADV_SEQUENTIAL),那么我可以以相对有效的方式写入内存。我已经开始工作了。现在,为了在我写作时释放各种操作系统资源,我偶尔会在已经写入的小块内存上执行munmap()。我担心的是munmap()和msync()会阻塞我的线程,等待数据以物理方式提交到磁盘。我根本不能放慢我的作家的速度,所以我需要找到另一种方法。在已经写入的小内存块上使用madvise(MADV_DONTNEED)会更好吗?我想告诉操作系统将该内存延迟写入磁盘,而不是阻止我的调用线程。关于ma