linux-kernel相关内容

中断处理程序中的printk,真的有那么糟糕吗?

每个人都知道中断处理程序应该尽可能短.并且添加诸如 printk 之类的函数用于在中断处理程序中进行调试是不应该做的.其实我之前在调试linux内核的时候,我写的一个中断驱动的char设备的时候试过,它破坏了驱动程序的时序. 我的问题是,为什么会发生这种情况?printk 函数被缓冲了!这意味着,据我所知,数据被插入到队列中,并且稍后被处理,很可能是在中断处理程序完成之后. 那为什么不 ..
发布时间:2022-01-04 22:44:10 其他开发

Linux内核有main函数吗?

我正在学习 Device Driver 和 Kernel 编程.根据 Jonathan Corbet 的书,我们在设备驱动程序中没有 main() 函数. #include #include 静态 int my_init(void){返回0;}静态无效 my_exit(void){返回;}模块初始化(my_init);模块退出(我的退出); 这里我有两个问题: 为什么我们不需要设备驱动程 ..
发布时间:2022-01-04 22:44:01 服务器开发

Linux系统上的niceness和priority进程

我正在寻找一种通过命令行修改进程优先级的方法.我发现内置 (bash) nice 和命令 renice 允许修改进程的 niceness,但不是内核计算的实际优先级.> 是否有允许设置优先级的命令?(还是我混淆了友好和优先级?) 解决方案 Linux 中进程的优先级是动态的:运行时间越长,优先级越低.进程在实际使用 CPU 时运行 - 典型 Linux 机器上的大多数进程只是等待 I/O ..
发布时间:2022-01-04 22:43:51 其他开发

将 QEMU 窗口输出重定向到运行 qemu 的终端

我正在尝试使用 qemu 调试 linux 内核的启动顺序,我正在运行的命令是: qemu -serial stdio -kernel -hda -附加“root=/dev/sda 终端= ttyS0" 在启动期间,所有内核消息都会打印到 QEMU 窗口.只有在启动完成后,我才会将提示返回到我运行 QEMU 的终端. 现在我可以开始使用我正在运行的内核终端,并在终端而不是 QEMU 窗 ..
发布时间:2022-01-04 22:43:43 服务器开发

在 Linux 内核 3.3 中添加新的系统调用

我对内核这个东西很陌生.我想要做的只是向内核添加一个新的系统调用.我遵循以下准则:http://hekimian-williams.com/?p=20. 问题是arch/x86/kernel下有syscall_table_32.S文件,但是我在3.3内核中找不到x86系统的文件.我还需要编辑文件并为新添加的系统调用再添加一行吗?或者我是否需要做其他事情让内核知道我的新系统调用?任何帮助将不胜 ..
发布时间:2022-01-04 22:43:31 服务器开发

完成变量和信号量的区别

在 linux 内核中,信号量用于为数据的临界区提供互斥,而 Completion 变量用于在等待事件的 2 个线程之间进行同步.为什么不使用信号量进行这样的同步?与信号量相比,使用完成变量有什么优势吗? 解决方案 您可能想要使用完成而不是信号量的原因有两个.首先,多个线程可以等待完成,并且可以通过一次调用 complete_all() 来释放它们.让信号量唤醒未知数量的线程更为复杂. ..
发布时间:2022-01-04 22:43:23 服务器开发

__KERNEL__ 在 linux 内核中有什么用?

谁能解释一下下面的代码是什么意思? 如果 __KERNEL__ 未定义,则定义以下宏.何时何地定义 __KERNEL__ ? /* 仅用于用户空间兼容性 */#ifndef __内核__/* IP6 钩子 *//* 在 promisc 删除后,校验和检查.*/#define NF_IP6_PRE_ROUTING 0/* 如果数据包的目的地是这个盒子.*/#define NF_IP6_LOC ..
发布时间:2022-01-04 22:42:55 其他开发

预计“内核太旧"2.6.16 和 2.6.26 内核版本之间的错误

我在一台运行 Linux (Debian) 内核为 2.6.26-2-amd64 的机器上构建了一个应用程序,我想在另一台运行 Linux (Suse) 内核为 2.6.16.60-0.21-smp 的机器上运行这个应用程序,但我收到错误“致命:内核太旧". 我从互联网上的研究中了解到,在针对未编译为支持旧内核版本的 glibc 库进行构建时可能会发生这种情况,但通常涉及 2.4 版.同一系 ..
发布时间:2022-01-04 22:42:48 服务器开发

是否可以用 gcc 以外的东西编译 Linux 内核

我想知道是否有人设法使用 gcc 以外的其他编译器编译 Linux 内核.或者如果有人尝试过?问题可能看起来很愚蠢或很学术,但是当我想到以下问题的答案时就出现了:mips 架构上的 C++ int 操作是否具有原子性 似乎有些操作的原子性不仅取决于cpu架构,还取决于使用的编译器.所以,我想知道在 Linux 世界中是否存在除 gcc 之外的其他编译器. 解决方案 Linux 明确依 ..
发布时间:2022-01-04 22:42:37 服务器开发

DMA 缓存一致性管理

我的问题是:当我在设备驱动程序中正确使用 [pci_]dma_sync_single_for_{cpu,device} 时,如何确定何时禁用缓存监听是安全的? 我正在为通过 PCI Express (DMA) 直接写入 RAM 的设备开发设备驱动程序,并且担心管理缓存一致性.我可以在启动 DMA 时设置一个控制位以在 DMA 期间启用或禁用缓存侦听,显然为了性能我希望尽可能禁用缓存侦听. ..
发布时间:2022-01-04 22:42:29 服务器开发

为不同的 linux 版本构建内核模块

我是编写内核模块的新手,因此很少遇到非技术问题. 因为为特定内核版本(比如 3.0.0-10,10 是补丁号)创建内核模块需要相同版本的内核头文件,所以看起来直接安装内核头文件并从那里开始开发.但是补丁内核版本的内核头文件不可用.因为我有一个来宾内核 vmlinuz-3.0.0-10 在机器上运行并且在下载内核头文件时它说找不到. 另一种方法是获取该特定内核的源代码,但同样的问题是修补 ..
发布时间:2022-01-04 22:42:11 其他开发

如何自动获得 IP 地址更改通知

在 linux 中是否有任何方法,例如回调或信号,以便在 IP 地址发生任何变化时获得通知.我想向内核注册回调或从内核获取信号,这是自动完成的,而不是我的代码在套接字上轮询. 提前致谢. 解决方案 您通过 netlink 套接字接收来自内核的通知. 您需要创建一个 NETLINK_ROUTE 套接字并通过 bind() 将其订阅到 RTMGRP_IPV4_IFADDR 组来订阅 ..
发布时间:2022-01-04 22:42:02 服务器开发

linux 内核 aio 功能

我正在测试内核异步 io 函数(不是 posix aio)并试图弄清楚它是如何工作的.下面的代码是一个完整的程序,我只是简单地将一个数组重复写入使用 O_DIRECT 打开的文件中.我在回调函数中收到错误“write missing bytes expect 1024 got 0"(请参阅​​ work_done() 中的 fprintf 语句). 对于不熟悉内核 aio 的人,以下代码执行 ..
发布时间:2022-01-04 22:41:39 服务器开发

linux 的 perf 实用程序如何理解堆栈跟踪?

Brendan Gregg 曾使用 Linux 的 perf 实用程序为 c/c++、jvm 代码、nodejs 代码等生成火焰图. Linux 内核本身是否理解堆栈跟踪?我在哪里可以阅读更多关于工具如何能够内省进程的堆栈跟踪的信息,即使进程是用完全不同的语言编写的? 解决方案 Gregg 在 perf 中有关于堆栈跟踪的简短介绍:http://www.brendangregg.co ..
发布时间:2022-01-04 22:41:27 其他开发

使用 Cpuset 将内核模块隔离到特定内核

从用户空间我们可以使用 cpuset实际上隔离我们系统中的一个特定核心,并且只对该核心执行一个特定过程. 我正在尝试用内核模块做同样的事情.所以我希望模块在隔离的核心中执行.换句话说:如何在内核模块中使用 cpuset 的? * 在我的内核中使用 linux/cpuset.h模块不起作用.所以,我有一个这样的模块: #include #include ...#ifdef CONFIG ..
发布时间:2022-01-04 22:41:09 服务器开发

我可以用模块替换 Linux 内核函数吗?

为了我的一些暑期研究,我正在进入内核工作.我们希望在特定的 RTT 计算中对 TCP 进行修改.我想做的是将 tcp_input.c 中的一个函数的解析替换为动态加载的内核模块提供的函数.我认为这会加快我们开发和分发修改的速度. 我感兴趣的函数被声明为静态函数,但是我已经使用非静态函数重新编译了内核并由 EXPORT_SYMBOL 导出.这意味着该函数现在可以被内核的其他模块/部分访问.我已 ..
发布时间:2022-01-04 22:41:01 服务器开发