- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有这个代码
int64_t ret;
char *fmt = "\n\n\n%s\n\n\n";
char *s;
s = kmalloc(13, GFP_KERNEL);
memcpy(s, "Hello world!\0", 13);
__asm__ __volatile__ (
"movq %2, %%rdi;"
"movq %1, %%rsi;"
"movq $2, %%rax;"
"call printk;"
"movq %%rax, %0;"
: "=r" (ret)
: "r" (s), "r" (fmt)
:
);
__asm__ __volatile__ (
"movq %0, %%rdi;"
"movq $1, %%rax;"
"call kfree;"
:
: "r" (s)
:
);
return ret;
在 kfree
调用时崩溃。这一定很愚蠢,但我无法找出它是什么。有什么问题?
编辑:“崩溃”== 内核模块触发糟糕。
编辑:如果我使用 m
而不是 r
,它似乎工作得很好。但是为什么?
最佳答案
您应该查看生成的汇编代码(使用 gcc
的 -S
选项)以准确了解发生了什么。
我猜问题是您没有为 printk
block 指定正确的 clobbers。请记住,某些寄存器可以由被调用函数自由使用。编译器不处理内联 asm block 的内容,因此它不知道其中有一个 call
。它期望未指定为输出或破坏的寄存器将从 asm block 中原封不动地出来。因此,我假设编译器将变量 s
缓存在一个寄存器中,该寄存器被 printk
或您对 rax
、rdi 的使用所破坏
和 rsi
您也不会告诉编译器。请注意,存在特定的寄存器约束,因此您可以使用这些约束而不是在程序集中移动参数。
另请注意,rax
(实际上是 al
)仅用于可变参数和标准参数函数,即便如此,它也应该只包含通过 sse vector 传递的参数数量( xmm
) 寄存器,而不是总数。有关详细信息,请参阅 x86-64 ABI 文档。
最后,如果你真的想写 asm 代码,你应该考虑写独立的 asm 模块,而不是 C。你可以避免让自己头疼。参见 this question举个例子。
关于调用 kfree 时崩溃(在内核模块内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20316771/
如果我们通过 kmalloc() 分配内存,那么在释放内存时我应该只将内存块的起始地址传递给 kfree() 或分配的任何地址内存块? 例如:在下面的程序中,kfree() 是否能够释放分配的 1KB
我正在研究 linux 内核中的一些系统调用。由于双 kfree() 会引发错误,因此有什么好的防护措施可以防止这种情况发生? 我想到的一个明显的想法是在 kfree() 之后将指针设置为 NULL
我正在测试使用 kmalloc 将内存分配给某个变量的内核模块和 memset 它的值和 free。 这是带有归零内存例程的代码。 unsigned char *a = (unsigned c
我怀疑我的内核代码中存在双重 kfree。基本上,我有一个在模块中被 kzalloced 和 kfreed 的数据结构。我注意到相同的地址被分配然后再次分配而没有在模块中被释放。 我想知道我应该使用什
我正在调试内存损坏问题,发现 Linux 内核似乎接受用户“释放部分缓冲区”。课本上总是教我们成对调用alloc/free。我有点迷惑不解了!所以我写了一个在 Linux 内核中运行的小测试。 cha
我有这个代码 int64_t ret; char *fmt = "\n\n\n%s\n\n\n"; char *s; s = kmalloc(13, GFP_KERNEL); memcpy(s, "H
我试着做一个简单的程序。源代码如下。当插入模块时,我尝试 kmalloc 一些内存。然后释放内存,当移除模块时。但是我使用命令 free 发现它在移除模块时并没有释放内存。 #include #in
标题几乎就是问题...... 我正在编写一些使用自旋锁来帮助列表管理的代码。关于自旋锁的文档非常清楚不调用任何会休眠的东西。我知道有一些方法可以分配“原子”内存,但我还没有看到任何关于 kfree 或
我是一名优秀的程序员,十分优秀!