小编use*_*547的帖子

将功能从用户空间复制到内核并执行

首先,我这样做是为了好玩,所以不要评判我.

我所做的是将一个函数指针从用户空间传递给内核,使用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完全相同. …

c linux linux-kernel

5
推荐指数
1
解决办法
329
查看次数

标签 统计

c ×1

linux ×1

linux-kernel ×1