【发布时间】:2026-01-18 16:00:02
【问题描述】:
首先,我这样做是为了好玩,所以不要评判我。
我所做的是将函数指针从用户空间传递到内核,使用 copy_from_user 将函数体复制到内核中的静态数组并开始跳转到该数组中执行。
在内核中:
static char handler_text[PAGE_SIZE] __page_aligned_data;
copy_from_user((void *)handler_text , (const void __user *)my_handler , PAGE_SIZE);
((void (*)())(handler_text))();
在用户空间,这个函数的作用很简单,如下
void my_handler(){
volatile unsigned long * p = (volatile unsigned long *)0xF0000c10;
*p = 0x0000000;
}
10000938 <my_handler>:
10000938: 3d 20 f0 00 lis r9,-4096
1000093c: 39 40 00 00 li r10,0
10000940: 61 29 0c 10 ori r9,r9,3088
10000944: 91 49 00 00 stw r10,0(r9)
10000948: 4e 80 00 20 blr
1000094c: 00 01 88 08 .long 0x18808
问题是我第一次这样做总是会产生一个糟糕的问题。但是我第二次这样做之后,问题就消失了,不再出现 Oops。 通过读取内存,我可以清楚地看到该函数是由内核执行的。我正在运行一个 PowerPc 目标,所以糟糕显示异常是 700,这是程序异常。从 Oops 中,我可以看到指令转储,其中 nip(之后)与 my_handler 完全相同。
Instruction dump:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 <3d20f000> 39400000 61290c10 91490000
我想不出任何意义。任何人都可以吗?谢谢
【问题讨论】:
-
如果我可以将图片放入 cmets,我会放入 this。
-
你能提供更多的上下文吗?内核代码是自定义系统调用,即如何从用户空间调用它?你能提供内核oops的完整信息吗?哪种 Powerpc 型号?
标签: c linux linux-kernel