- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
I am trying to test linux kernel stack size in 64 bit.
我发现了这种奇怪的行为。我写了下面的代码来使内核崩溃,但奇怪的是 只有当 printk 被取消注释时它才会崩溃,否则运行良好,没有错误/警告!
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int __init crash_stack_init(void)
{
long arr[1024];
long *a;
a = &arr[0];
//printk("%p\n", &arr[0]);
return 0;
}
enter code here
static void __exit crash_stack_exit(void)
{
}
module_init(crash_stack_init);
module_exit(crash_stack_exit);
Here is the "make" output without the printk,
make -C /lib/modules/4.4.0-53-generic/build M=/home/naveenvc/work/ker/crash_stack modules make[1]: Entering directory '/usr/src/linux-headers-4.4.0-53-generic' CC [M] /home/naveenvc/work/ker/crash_stack/crash_stack.o Building modules, stage 2. MODPOST 1 modules CC /home/naveenvc/work/ker/crash_stack/crash_stack.mod.o LD [M] /home/naveenvc/work/ker/crash_stack/crash_stack.ko make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-53-generic'
And make output with printk,
make -C /lib/modules/4.4.0-53-generic/build M=/home/naveenvc/work/ker/crash_stack modules make[1]: Entering directory '/usr/src/linux-headers-4.4.0-53-generic' CC [M] /home/naveenvc/work/ker/crash_stack/crash_stack.o > /home/naveenvc/work/ker/crash_stack/crash_stack.c: In function ‘crash_stack_init’: /home/naveenvc/work/ker/crash_stack/crash_stack.c:14:1: warning: the frame size of 8200 bytes is larger than 1024 bytes [-Wframe-larger-than=] } ^
Building modules, stage 2. MODPOST 1 modules CC
/home/naveenvc/work/ker/crash_stack/crash_stack.mod.o LD [M] /home/naveenvc/work/ker/crash_stack/crash_stack.ko make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-53-generic'
这可能是什么原因造成的?
最佳答案
堆栈大小已被详细记录,上面不是正确的测试方法,特别是在使用大页面支持堆栈的旧内核中,上述代码会跳转到下一个堆栈。
注释掉 prink 的 func __crash_stack_init 是一个叶函数——它不调用任何东西,所以编译器确切地知道局部变量会发生什么。特别是在这段代码中,它发现不需要完整的数组,因此它没有被分配。然而,对 printk 的调用传递了 arr。编译器不知道 func 将如何处理它,因此它必须在堆栈上保留 1024 * sizeof(long),这会导致警告。
堆栈在几年前达到了 16KB,您可以从这里开始阅读 https://lwn.net/Articles/600644/
关于c - 奇怪的 printk 对 linux 堆栈大小测试的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47733342/
据我了解系统控制变量,kernel.printk 中的第一个值是内核消息必须小于的数字才能写入控制台。因此,如果它是 4,那么由此生成的消息将只能通过 dmesg 可见: printk(KERN_IN
我正在尝试从 mm/filemap.c 中打印 __generic_file_write_iter() 中的一些信息. 我修改了函数如下: struct file *file = iocb->ki_f
我有一个关于在 3.10 内核中实现 printk() 的问题。我看到了calls local_irq_save一开始。然后我看到了 calls raw_spin_lock(&logbuf_lock)
我正在为 Linux 内核编写一个系统调用,但到目前为止它并没有像我预期的那样工作(这并不奇怪)。我正在尝试使用 printk 消息在一个函数中对其进行调试,但它们不起作用。然而,单独功能中的功能确实
有没有办法记录/打印内核中的 float 值。它是否取决于运行内核的 FPU? 编译 printk(KERN_DEBUG "error = %f ",floatvalue) 时,出现错误: 对 __a
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我使用 printk 在内核级别输出中断时间戳,这意味着每个中断一个 printk(在 irg_handler_ 方法中)。在使用那个新内核时,我注意到我的设备运行速度变慢了。 所以我的问题是每个 p
我正在尝试实现我自己的新 schedule()。我想调试我的代码。 我可以在 sched.c 中使用 printk 函数吗? 我使用了 printk 但它不起作用。我错过了什么? 最佳答案 你知道 s
在 Linux 应用程序级别,所有 printf 消息都转到 stdout,所有 err 消息都转到 stderr。在哪里 stderr 通常是无缓冲的, 标准输出是行缓冲的 所以在 kernel s
假设我想使用 printk()在 arch/x86/boot/string.c 内在编译内核之前。我必须包含哪个头文件,以便链接器知道在哪里可以找到 printk() ?我试过 #include 和
只是一个关于内核级别 printk() 函数的快速问题,如果我调用它,消息将打印到哪里?(我在 i386 架构上使用 Ubuntu 并下载最新的内核) 到处都找不到, 如果有人也可以为我指出正确的方向
我在内核代码中放了一些调试信息。 已经检查了/var/log/messages、dmesg 并且那里没有这样的转储。 syslogd 正在机器上运行 我还将/proc/sys/kernel/print
当我 printk(KERN_INFO, ...) 时,我得到这样的结果: [116584.000183] ... 方括号之间的数字到底是多少? 最佳答案 启动后的秒数。您可以控制是否使用内核配置中的
我正在做一些内核修改,并试图让 printk 将信息输出回控制台。我用它传递了任何内核日志级别,即使是最高日志级别,也没有在控制台上正确地返回任何响应。 我检查过,printk 的当前日志配置是 4
我在我的内核可加载模块中使用 printk 来记录系统调用的参数。对于每个系统调用,使用几个 printk 来打印变量,它们以“\t”作为分隔符出现。要将内核日志缓冲区中的数据重定向到系统/var/l
从原子上下文调用 printk 是否安全,例如IRQ? 最佳答案 是的,明确允许在原子上下文中使用它;该函数实际上非常强大,因为它也可能在紧急情况下被调用。 printk 只会尝试锁定控制台来打印消息
systemd 的 journald 支持内核风格的日志记录。因此,该服务可以在 stderr 上写入以“”开头的消息,它们将像信息一样被解析,“”- 警告。 但是在开发服务时,它是在 systemd
我试图让我的模块显示一个printk。我是新手,所以我可能会遇到一些编程错误。这是我的模块 C 文件: #include #include #include asmlinkage long sy
我是 Linux 内核开发的新手,当我尝试通过在 timekeep.c 文件中添加一个 printk 函数来修改系统调用函数时,比如 printk("BEGIN!$$$$$\n"); dmesg 实
printk()打印的信息只有在Alt+Ctrl+F1 ~ F7 控制台。这些控制台非常不方便调试,因为它们无法回滚。我正在使用 KDE 桌面环境和控制台终端,如何将 printk() 消息重定向到控
我是一名优秀的程序员,十分优秀!