首先,我这样做是为了好玩,所以不要评判我.
我所做的是将一个函数指针从用户空间传递给内核,使用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))();
Run Code Online (Sandbox Code Playgroud)
在用户空间中,这个功能的作用非常简单,如下所示
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
Run Code Online (Sandbox Code Playgroud)
问题是我第一次这样做总是生成一个糟糕的.但是第二次我做这个以及之后,问题就消失了,再也没有哎呀了.我可以清楚地看到该函数是由内核通过读取内存来执行的.我正在运行PowerPc目标,因此Oops显示异常为700,这是程序异常.从Oops中,我可以看到指令转储,其中nip(after)与my_handler完全相同. …