linux-kernel相关内容
每个人都知道中断处理程序应该尽可能短.并且添加诸如 printk 之类的函数用于在中断处理程序中进行调试是不应该做的.其实我之前在调试linux内核的时候,我写的一个中断驱动的char设备的时候试过,它破坏了驱动程序的时序. 我的问题是,为什么会发生这种情况?printk 函数被缓冲了!这意味着,据我所知,数据被插入到队列中,并且稍后被处理,很可能是在中断处理程序完成之后. 那为什么不
..
我正在学习 Device Driver 和 Kernel 编程.根据 Jonathan Corbet 的书,我们在设备驱动程序中没有 main() 函数. #include #include 静态 int my_init(void){返回0;}静态无效 my_exit(void){返回;}模块初始化(my_init);模块退出(我的退出); 这里我有两个问题: 为什么我们不需要设备驱动程
..
我正在寻找一种通过命令行修改进程优先级的方法.我发现内置 (bash) nice 和命令 renice 允许修改进程的 niceness,但不是内核计算的实际优先级.> 是否有允许设置优先级的命令?(还是我混淆了友好和优先级?) 解决方案 Linux 中进程的优先级是动态的:运行时间越长,优先级越低.进程在实际使用 CPU 时运行 - 典型 Linux 机器上的大多数进程只是等待 I/O
..
我正在尝试使用 qemu 调试 linux 内核的启动顺序,我正在运行的命令是: qemu -serial stdio -kernel -hda -附加“root=/dev/sda 终端= ttyS0" 在启动期间,所有内核消息都会打印到 QEMU 窗口.只有在启动完成后,我才会将提示返回到我运行 QEMU 的终端. 现在我可以开始使用我正在运行的内核终端,并在终端而不是 QEMU 窗
..
我对内核这个东西很陌生.我想要做的只是向内核添加一个新的系统调用.我遵循以下准则:http://hekimian-williams.com/?p=20. 问题是arch/x86/kernel下有syscall_table_32.S文件,但是我在3.3内核中找不到x86系统的文件.我还需要编辑文件并为新添加的系统调用再添加一行吗?或者我是否需要做其他事情让内核知道我的新系统调用?任何帮助将不胜
..
在 linux 内核中,信号量用于为数据的临界区提供互斥,而 Completion 变量用于在等待事件的 2 个线程之间进行同步.为什么不使用信号量进行这样的同步?与信号量相比,使用完成变量有什么优势吗? 解决方案 您可能想要使用完成而不是信号量的原因有两个.首先,多个线程可以等待完成,并且可以通过一次调用 complete_all() 来释放它们.让信号量唤醒未知数量的线程更为复杂.
..
我尝试在 nasm 中编写简单的内核模块 (v3.6),但是 insmod 说我: $ sudo insmod ./hello.koinsmod:错误:无法插入模块 ./hello.ko:模块格式无效$回声 $?1 我编译我的代码: $ nasm -f elf64 -o hello.m hello.asm$ ld -m elf_x86_64 -r -o hello.ko hello.m 和
..
我一直在尝试移植一些 linux 驱动程序,并意识到 linux 的内核版本 2.4 和 2.6 之间存在重大差异. 在2.4版本的内核中,模块编程如下- #define MODULE#include #include int init_module(void){printk(KERN_INFO "嗨\n");返回0;}void cleanup_module(void){printk(KE
..
谁能解释一下下面的代码是什么意思? 如果 __KERNEL__ 未定义,则定义以下宏.何时何地定义 __KERNEL__ ? /* 仅用于用户空间兼容性 */#ifndef __内核__/* IP6 钩子 *//* 在 promisc 删除后,校验和检查.*/#define NF_IP6_PRE_ROUTING 0/* 如果数据包的目的地是这个盒子.*/#define NF_IP6_LOC
..
我在一台运行 Linux (Debian) 内核为 2.6.26-2-amd64 的机器上构建了一个应用程序,我想在另一台运行 Linux (Suse) 内核为 2.6.16.60-0.21-smp 的机器上运行这个应用程序,但我收到错误“致命:内核太旧". 我从互联网上的研究中了解到,在针对未编译为支持旧内核版本的 glibc 库进行构建时可能会发生这种情况,但通常涉及 2.4 版.同一系
..
我想知道是否有人设法使用 gcc 以外的其他编译器编译 Linux 内核.或者如果有人尝试过?问题可能看起来很愚蠢或很学术,但是当我想到以下问题的答案时就出现了:mips 架构上的 C++ int 操作是否具有原子性 似乎有些操作的原子性不仅取决于cpu架构,还取决于使用的编译器.所以,我想知道在 Linux 世界中是否存在除 gcc 之外的其他编译器. 解决方案 Linux 明确依
..
我的问题是:当我在设备驱动程序中正确使用 [pci_]dma_sync_single_for_{cpu,device} 时,如何确定何时禁用缓存监听是安全的? 我正在为通过 PCI Express (DMA) 直接写入 RAM 的设备开发设备驱动程序,并且担心管理缓存一致性.我可以在启动 DMA 时设置一个控制位以在 DMA 期间启用或禁用缓存侦听,显然为了性能我希望尽可能禁用缓存侦听.
..
我试图理解这个 用于 omap2 熊猫板的 mcspi 驱动程序代码. 我不明白谁调用了probe 函数以及这个驱动代码? 设备连接时如何通知驱动程序? 解决方案 spi-omap2-mcspi.c中的probe函数保存在static struct platform_driver omap2_mcspi_driver, 使用 module_platform_driver(oma
..
我是编写内核模块的新手,因此很少遇到非技术问题. 因为为特定内核版本(比如 3.0.0-10,10 是补丁号)创建内核模块需要相同版本的内核头文件,所以看起来直接安装内核头文件并从那里开始开发.但是补丁内核版本的内核头文件不可用.因为我有一个来宾内核 vmlinuz-3.0.0-10 在机器上运行并且在下载内核头文件时它说找不到. 另一种方法是获取该特定内核的源代码,但同样的问题是修补
..
在 linux 中是否有任何方法,例如回调或信号,以便在 IP 地址发生任何变化时获得通知.我想向内核注册回调或从内核获取信号,这是自动完成的,而不是我的代码在套接字上轮询. 提前致谢. 解决方案 您通过 netlink 套接字接收来自内核的通知. 您需要创建一个 NETLINK_ROUTE 套接字并通过 bind() 将其订阅到 RTMGRP_IPV4_IFADDR 组来订阅
..
我问这个问题是因为我很好奇 Linux 内核是如何工作的.根据 http://i-web.iu-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/02-VirtualMemory/VirtualMemory.ppt Windows 在其页面目录中使用特殊条目和名为 self-map 的页表,以便能够从内核虚拟地址空间操作页目录/表
..
我正在测试内核异步 io 函数(不是 posix aio)并试图弄清楚它是如何工作的.下面的代码是一个完整的程序,我只是简单地将一个数组重复写入使用 O_DIRECT 打开的文件中.我在回调函数中收到错误“write missing bytes expect 1024 got 0"(请参阅 work_done() 中的 fprintf 语句). 对于不熟悉内核 aio 的人,以下代码执行
..
Brendan Gregg 曾使用 Linux 的 perf 实用程序为 c/c++、jvm 代码、nodejs 代码等生成火焰图. Linux 内核本身是否理解堆栈跟踪?我在哪里可以阅读更多关于工具如何能够内省进程的堆栈跟踪的信息,即使进程是用完全不同的语言编写的? 解决方案 Gregg 在 perf 中有关于堆栈跟踪的简短介绍:http://www.brendangregg.co
..
从用户空间我们可以使用 cpuset实际上隔离我们系统中的一个特定核心,并且只对该核心执行一个特定过程. 我正在尝试用内核模块做同样的事情.所以我希望模块在隔离的核心中执行.换句话说:如何在内核模块中使用 cpuset 的? * 在我的内核中使用 linux/cpuset.h模块不起作用.所以,我有一个这样的模块: #include #include ...#ifdef CONFIG
..
为了我的一些暑期研究,我正在进入内核工作.我们希望在特定的 RTT 计算中对 TCP 进行修改.我想做的是将 tcp_input.c 中的一个函数的解析替换为动态加载的内核模块提供的函数.我认为这会加快我们开发和分发修改的速度. 我感兴趣的函数被声明为静态函数,但是我已经使用非静态函数重新编译了内核并由 EXPORT_SYMBOL 导出.这意味着该函数现在可以被内核的其他模块/部分访问.我已
..