大家好,想请问kernel module的function中array of struct与struct的内存配置方式
是不是不一样(变量为函数中直接宣告,未使用kmalloc)?会这样问是因为最近在写作业时
遇到使用copy_to_user复制一段内存内容到userspace时只要复制的内容是array of
struct就会panic,log如下:
usercopy: kernel memory exposure attempt detected from 00000000e7ee16e5
(<process stack>) (16 bytes)
但只要把原本要复制的内容放到同个资料结构的struct中就可以正常copy...,以下是复
时用到的资料结构:
struct U64 {
unsigned long long msl;
unsigned long long lsl;
};
然后喂给copy_to_user的arg(size)都一样是16 bytes。目前推测array of struct配置的
成员内存是不连续的,可是kernelspace的virtual address让我在debug时看到的记忆
体都是不连续的(array of struct与struct),所以不确定这样推测是否正确。
不知道各位前辈有什么看法,谢谢大家!
**更新**(补上程式码),以下为可以正常运作的程式码,原本有问题的版本是使用fib(ar
ra
of struct)做复制(copy_to_user(buf, &fib[g - 1], size)),另外,size一直都是16
bytes:
static long long fib_sequence(long long g, char *buf, size_t size)
{
unsigned long long a;
a = 10000000000000000000;
struct U64 fib[g + 1], tmp = {0};
memset(fib, 0, sizeof(struct U64) * (g + 1));
int k;
fib[0].lsl = 1;
fib[1].lsl = 1;
for (k = 2; k <= g; k++) {
fib[k].lsl = fib[k - 1].lsl + fib[k - 2].lsl;
fib[k].msl = fib[k - 1].msl + fib[k - 2].msl;
if (fib[k].lsl > a) {
fib[k].lsl = fib[k].lsl - a;
fib[k].msl = fib[k].msl + 1;
}
}
tmp = fib[g - 1];
copy_to_user(buf, &tmp, size);
return 1;
}