커널 수준에서 linux/list.h를 사용하여 링크 된 목록을 만들려고합니다. 내 코드가 컴파일되지만 링크 된 목록에 둘 이상의 노드를 추가하려고하면 커널 웁스가 발생합니다. 여기 내 커널 레벨 코드입니다 :커널 연결된 목록 커널 귀찮음
//global defs
struct Node {
char *data;
struct list_head list;
};
LIST_HEAD(mylinkedlist);
DEFINE_MUTEX(mut);
asmlinkage long write(const void __user *data, long len){
//create new space in memory enough to fit data
void *ptr = kmalloc(len, GFP_KERNEL);
//create the user space pointer to kernel space pointer
int verif = copy_from_user(ptr, data, len);
if(verif != 0){
return -EFAULT;
}
struct Node first = {ptr, LIST_HEAD_INIT(first.list)};
//wait for mutex to be available
mutex_lock_interruptible(&mut);
list_add_tail(&first.list, &mylinkedlist);
//release the mutex
mutex_unlock(&mut);
return 0;
내 유저 랜드 프로그램은 다음과 같습니다
long hello_syscall(void) {
char *arg = "Hello";
return syscall(351, "Hello", sizeof(arg));
}
그것은 모든 컴파일하지만 난 시도하고 나는이 쇼를 제공 번 이상 유저 랜드 프로그램 이상을 실행할 때 커널 오작동. https://gist.github.com/anonymous/7217210
INIT_LIST_HEAD (목록)를 사용해보십시오. list_head 구조체가 어떻게 사용되는지 커널 소스에서 살펴보십시오. –
또한 kmalloc에서 오류가 반환되는지 확인하십시오. 실패하면 다음 코드 행이 충돌합니다. – z242