Call Trace包含以下条目:
[<deadbeef>] FunctionName+0xAB/0xCD [module_name]
[<f00fface>] ? AnotherFunctionName+0x12/0x40 [module_name]
[<deaffeed>] ClearFunctionName+0x88/0x88 [module_name]
Run Code Online (Sandbox Code Playgroud)
'?'是什么意思?在AnotherFunctionName之前标记?
在引导加载程序将执行交给内核后,会发生什么?我知道汇编程序,那么内核必须做的前几条指令是什么?或者是否有C函数执行此操作?在内核执行任意二进制文件之前的启动顺序是什么?
我正在尝试调试内核模块.我怀疑有一些内存泄漏.为了检查它,我准备了内核和模块的内存泄漏调试的构建.我得到了一些警告:
[11839.429168] slab error in verify_redzone_free(): cache `size-64': memory outside object was overwritten
[11839.438659] [<c005575c>] (unwind_backtrace+0x0/0x164) from [<c0116ca0>] (kfree+0x278/0x4d8)
[11839.447357] [<c0116ca0>] (kfree+0x278/0x4d8) from [<bf083f48>] (some_function+0x18/0x1c [my_module])
[11839.457214] [<bf083f48>] (some_function+0x18/0x1c [my_module]) from [<bf08762c>] (some_function+0x174/0x718 [my_module])
[11839.470184] [<bf08762c>] (some_function+0x174/0x718 [my_module]) from [<bf0a56b8>] (some_function+0x12c/0x16c [my_module])
[11839.483917] [<bf0a56b8>] (some_function+0x12c/0x16c [my_module]) from [<bf085790>] (some_function+0x8/0x10 [my_module])
[11839.496368] [<bf085790>] (some_function+0x8/0x10 [my_module]) from [<bf07b74c>] (some_function+0x358/0x6d4 [my_module])
[11839.507476] [<bf07b74c>] (some_function+0x358/0x6d4 [my_module]) from [<c00a60f8>] (worker_thread+0x1e8/0x284)
[11839.517211] [<c00a60f8>] (worker_thread+0x1e8/0x284) from [<c00a9edc>] (kthread+0x78/0x80)
[11839.525543] [<c00a9edc>] (kthread+0x78/0x80) from [<c004f8fc>] (kernel_thread_exit+0x0/0x8)
Run Code Online (Sandbox Code Playgroud)
转换指向内核的地址没有问题:
$ addr2line …Run Code Online (Sandbox Code Playgroud) 我正在运行一个相当大规模的Node.js 0.8.8应用程序,使用带有16个工作进程的Cluster,在具有超线程的16处理器盒子上(所以32个逻辑核心).我们发现自从迁移到Linux 3.2.0内核(从2.6.32开始)以来,工作者子进程之间的传入请求的平衡似乎被大量加权到5个左右的进程,而其他11个进程根本没有做太多工作.这可能对吞吐量更有效,但似乎增加了请求延迟并且对我们来说不是最佳的,因为其中许多是长期的websocket连接,可以同时开始工作.
子进程都在套接字上接受(使用epoll),虽然这个问题在Node 0.9(https://github.com/bnoordhuis/libuv/commit/be2a2176ce25d6a4190b10acd1de9fd53f7a6275)中有一个修复,但该修复似乎没有帮助我们的测试.是否有人知道内核调优参数或构建选项可能有所帮助,或者我们最好使用不同的方法回到2.6内核或跨工作进程进行负载平衡?
我们将其归结为一个简单的HTTP Siege测试,但请注意,这是在带有超线程的12核盒子上进行12次触发(因此有24个逻辑核心),并且有12个工作进程在套接字上接受,而不是我们的16在生产过程中.
在Debian Squeeze上使用Node 0.9.3进行HTTP Siege,在裸机上使用2.6.32内核:
reqs pid
146 2818
139 2820
211 2821
306 2823
129 2825
166 2827
138 2829
134 2831
227 2833
134 2835
129 2837
138 2838
Run Code Online (Sandbox Code Playgroud)
除了3.2.0内核以外的一切:
reqs pid
99 3207
186 3209
42 3210
131 3212
34 3214
53 3216
39 3218
54 3220
33 3222
931 3224
345 3226
312 3228
Run Code Online (Sandbox Code Playgroud) 我想知道kthread它是什么以及为什么它不占用任何内存并且没有打开的文件.我编写了一些代码,它们只是以父子树格式打印当前正在运行的进程的PID,以及一些其他信息,如使用过的VMZ,RSS,线程,openfiles.名为PID 2的所有子kthreadd节点在/proc/[pid]/status文件中没有VmSize和VmRSS .在/proc/[pid]/fd不包含任何打开的文件.
这些过程是什么,它们与init(PID 1)产生的正常过程有何不同.我读(在旧书中)交换器将生成init PID1,所有其他进程都是PID 1的子进程.当然,这背后有一个不同的架构(Linux内核3.7.10.1-16),我不知道,所以另一个问题是为什么PID 2是PID 0的子节点并且不是PID 1的子节点.
我想创建一个虚拟音频设备,从默认输出(输出IOAudioStream)获取音频数据,并将其转换为输入IOAudioStream.
我查看了我能找到的大多数示例,但是它们只实现了一个功能,可以将输出IOAudioStream最多复制到输入端.这意味着如果选择音频设备作为输出,它仅将音频转换为输入流.
这应该是可能的,因为ScreenFlow允许通过安装创建虚拟驱动程序的kext来记录计算机音频.
如何从默认输出访问音频数据并将其发送到我的虚拟驱动程序?
有人可以给我一个文档来描述内核源文件夹有关它们的结构,功能以及它们的组织方式吗?
具体来说,文件夹的用途包括/ uapi/**?
谢谢.
我正在编写一个API作为内核模块,为设备驱动程序提供各种功能.我在mycode.c中写了三个函数.然后我构建并加载了模块,然后将mycode.h复制到<kernel>/include/linux中.在设备驱动程序中,我有一个#include <linux/mycode.h>并调用这三个函数.但是当我构建驱动程序模块时,我得到三个链接器警告,说明这些函数是未定义的.
笔记:
很明显,函数正在正确导出,内核知道它们的位置和位置.那么为什么司机不能看到他们的定义呢?知道我错过了什么吗?
编辑:我在这里找到了一些相关的信息: http ://www.kernel.org/doc/Documentation/kbuild/modules.txt
有时,外部模块使用来自另一个外部模块的导出符号.kbuild需要完全了解所有符号,以避免吐出有关未定义符号的警告.这种情况存在三种解决方案.
注意:建议使用顶级kbuild文件的方法,但在某些情况下可能不切实际.
使用顶级kbuild文件如果你有两个模块,foo.ko和bar.ko,其中foo.ko需要来自bar.ko的符号,你可以使用一个通用的顶级kbuild文件,所以这两个模块都是用同一个编译的建立.请考虑以下目录布局:
Run Code Online (Sandbox Code Playgroud)./foo/ <= contains foo.ko ./bar/ <= contains bar.ko The top-level kbuild file would then look like: #./Kbuild (or ./Makefile): obj-y := foo/ bar/ And executing $ make -C $KDIR M=$PWD will then do the expected and compile both modules with full任何一个模块的符号知识.
使用额外的Module.symvers文件构建外部模块时,会生成Module.symvers文件,其中包含未在内核中定义的所有导出符号.要从bar.ko访问符号,请将module.symvers文件从bar.ko的编译复制到构建foo.ko的目录.在模块构建期间,kbuild将读取外部模块目录中的Module.symvers文件,并且在构建完成时,将创建一个新的Module.symvers文件,其中包含已定义的所有符号的总和,而不是内核的一部分.
使用"make"变量KBUILD_EXTRA_SYMBOLS如果从另一个模块复制Module.symvers是不切实际的,则可以在构建文件中将空格分隔的文件列表分配给KBUILD_EXTRA_SYMBOLS.这些文件将在其符号表初始化期间由modpost加载.
但是对于所有这三种解决方案,为了让任何驱动程序使用我的API,它必须创建一个新的Makefile或直接访问我的Module.symvers文件?这看起来有点不方便.我希望他们能够#include我的头文件并且好好去.不存在其他替代方案吗?
我想知道当内核运行故障处理程序以引入用户页面时,是否在功能上错误地对用户空间地址进行页面错误.
操作系统是Linux 2.6.30
假设任务的两个用户地址都有效(落在vma,rw权限范围内).
当我检查内核代码时,如果故障地址有效并且故障没有发生在原子上下文或irq处理程序中,我发现内核不介意嵌套故障.
(我不认为答案是cpu特定的,但我想补充一点,我对arm和mips感兴趣).
例如:如果我从页面错误处理程序打印堆栈数据,则可能发生这种情况.