Articles of linux kernel

互斥锁和request_module()行为

我在Linux内核中观察到以下代码模式,例如net/sched/act_api.c或许多其他地方: rtnl_lock(); rtnetlink_rcv_msg(skb, …); replay: ret = process_msg(skb); … /* try to obtain symbol which is in module. */ /* if fail, try to load the module, otherwise use the symbol */ a = get_symbol(); if (a == NULL) { rtnl_unlock(); request_module(); rtnl_lock(); /* now verify that we can obtain symbols from requested module and […]

fseek的性能开销是多less?

fseek有任何性能开销吗? 例如, fseek调用实际上是否要求内核移动磁盘头? 另外, fseek性能成本与它所追求的“远”有什么关系? 例如,fseek(1byte)vs fseek(100Mb)vs fseek(文件结束)。

使用O_DIRECT和IO内存

我试图从I / O内存(HIGHMEM)写入一些数据到硬盘。 我已经使用io_remap_pfn_range()mmap了内存缓冲区。 我的应用程序使用O_DIRECT进行磁盘读写操作。 使用O_DIRECT,写入返回EFAULT(坏地址)。 我把它logging在mm / memory.c中的__get_user_pages,IO页面被拒绝。 这和我现在的知识一样深,可以让我进入内核。 我不明白为什么IO指针不被允许。 超快磁盘IO是我们项目的一个要求,所以任何复制都不是一个选项。 任何暗示是赞赏。 提前致谢!

在内核空间中,如何获得与ext4格式磁盘上的文件对应的物理地址

第一次在linux内核这里。 无论如何,我的问题是,如果你在这里: https://github.com/torvalds/linux/blob/master/fs/ext4/file.c#L360 您可以访问ext4_file_mmap函数中的这两个结构: struct file *file, struct vm_area_struct *vma 我正在改变dax模式的这个函数的实现,以便在你调用mmap的时候,页面表被完全填充(看看没有任何pagefaults给了我们多less好的性能)。 到目前为止,我已经完成了以下工作(假设我可以访问ext4_file_mmap可以访问的两个结构): // vm_area_struct defined in /include/linux/mm_types.h : 284 // file defined in /include/linux/fs.h : 848 loff_t file_size = file_inode(file)->i_size; unsigned long start_va = vma->vm_start; 现在,困难在这里。 如何获得与此文件关联的物理地址(块?不知道dax使用块)? 我花了几天的时间盯着linux的源代码,试图理解一些东西,而男孩我是成功的。 任何帮助,暗示,或build议非常感谢! 谢谢! 一些更新:当您在dax模式下dax文件时,您不会将任何内容提取到内存中。 该设备,在这种情况下PMEM,是字节地址,并给DDR的延迟,所以它直接访问(之间没有记忆)。 某些pte导致访问这个PMEM设备,而不是内存。

QEMUdebugging::警告:TCG不支持请求的function:CPUID.01H:ECX

我想用QEMU在Ubuntu 16.04.3 LTS上debugging我编译好的内核linux-4.13.4 我遵循以下步骤: 1安装qemu sudo apt-get install qemu 2运行qemu qemu-system-x86_64 -s -S -kernel /home/wxf/kernelSources/linux-4.13.4/arch/x86_64/boot/bzImage -initrd /boot/initrd.img-4.13.4 注意: -gdb tcp :: 1234的缩写 -S在启动时冻结CPU(使用'c'开始执行) 但是我得到以下警告: warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5] terminal停在那里,我不能input其他命令。 当我运行它时popupQEMU窗口,但它停止。 所以,我的问题是 如何消除警告,这是正常的(因为它不是一个错误信息)?

Linux内核构build:以非交互方式执行“make localmodconfig”

我想以非交互方式运行“make localmodconfig”。 尝试时 是“”| 使localmodconfig 给出了以下错误: Console input/output is redirected. Run 'make oldconfig' to update configuration. make[1]: *** [scripts/kconfig/Makefile:45: localmodconfig] Error 1 make: *** [Makefile:547: localmodconfig] Error 2 我更喜欢localmodconfig而不是olddefconfig,因为旧的内核有3000多个模块,只使用了30个模块。 任何想法如何实现这一目标?

交叉编译Linux内核并通过VMware进行debugging

我正在考虑在Ubuntu 8.04主机上进行编译时,在vmware虚拟机下进行一些Linux内核和设备驱动程序的开发,以便进行testing(在vmware server 2.0下作为guest虚拟机使用Ubuntu 9.04)。 我不希望在虚拟机下编译的性能受到影响。 我知道内核显然不与任何东西联系在一起,所以在这方面不应该有任何问题,但是 有没有什么特别的问题需要注意? 除了内核崩溃之外还有一台正在运行的计算机,这个设置是否还有其他好处呢? 有没有使用这种设置的指南? 编辑 我已经在主机上看到了许多关于在VMware上通过Workstation 6.0使用GDB进行远程debugging的参考资料。 有谁知道这是否适用于任何免费版本的VMWare,如Server 2.0。

为什么我不能在Linux 2.6.26中注册边沿触发的中断?

第一次海报,所以请原谅任何愚蠢。 我正在为从2.6.22到2.6.26为MPC83xx构build的Linux内核上移植一个定制CPLD驱动程序,并且正在接收意外的Oops。 该驱动程序对于.22内核工作正常,但是在我调用request_irq时,.26内核会窒息。 有人知道为什么行为发生了变化,或者更好,我需要做些什么来解决它? 我跟踪了Oops的来源,调用kernel / irq / manage.c,其中desc->chip->enable(irq)在setup_irq()被调用,它看起来像要启用的函数指针是在arch / powerpc / sysdev / ipic.c中调用ipic_set_irq_type()被清除。 不幸的是,我不知道为什么。 我已经包含了Oops和复制问题的示例内核模块。 哎呀 – Unable to handle kernel paging request for instruction fetch Faulting instruction address: 0x00000000 Oops: Kernel access of bad area, sig: 11 [#1] PREEMPT SCPA-G2 Modules linked in: cpld(+) NIP: 00000000 LR: c004b930 CTR: 00000000 REGS: df8b5df0 […]

根据每个插槽调整MTU?

我想知道是否有任何方法来调整(在Linux系统上)给定套接字的MTU。 (使IP层分成小于实际设备MTU的块)。 当我说给定的套接字时,我并不是指在拥有套接字的应用程序代码中,而是在外部进行编程,例如通过sysfs条目。 如果目前没有办法做到这一点,你有什么想法在Linux内核挂钩/补丁来实现这种可能性? 谢谢。 编辑:为什么我要这样做? 我正在做一些Layer3-in-Layer4(例如:通过TCP隧道的隧道IP以上)隧道。 与VPN类似的解决scheme不同,我没有使用虚拟接口来实现这一点。 我使用iptables捕获数据包,以正常方式丢弃数据包并将它们写入到隧道套接字。 想想大文件传输的情况,所有的数据包都被填充到MTU大小。 当我将它们隧道化时,我会增加一些开销,导致每个原始数据包产生两个隧道数据包,这是不理想的。

从<linux / proc_fs.h>中缺lessUbuntu proc_root_driver

我正在尝试在Ubuntu 10.04中编译内核2.6.35-22的内核模块,并且抱怨proc_root_driver丢失。 我做了一些search,我发现这应该定义这个,但在我的版本的Linux头,它没有定义。 是否有另一个全局variables,我应该使用它的位置,还是有一种方法,我可以在某个地方定义它的内核模块可以编译?