linux-kernel {{ adding sys-calls : testing from user space :



好的,我已经成功地向内核空间添加了一些系统调用。目前我已经把它们的主要意图注释掉了,我想确保数据成功地按照预期从用户空间传递到内核空间。我目前有一个问题,在用户空间声明一个变量为unsigned long,当它通过printk打印时,值是不一样的。我看过关于这个话题的其他问题,似乎是相关的,他们没有帮助,我认为人们只是错误地使用了printk。我以前用内核空间只打印字符串测试过这个,一切都很好,所以我添加了从用户空间传递的数据,并遇到了这个问题,所以…

用户空间:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#define __NR_createQueue 350
long createQueue_syscall(unsigned long id){
     return syscall(__NR_createQueue);
}
int main(int argc, char *argv[]){
     unsigned long qid = 47;  // ID for a queue
     createQueue_syscall(qid);
     return 0;
}

内核空间:

#include linux/kernel.h  
asmlinkage long createQueue(unsigned long id){
  printk("  The queue ID is: %lu n", id);
  return 0;
}

所有编译都很好,没有警告或错误。但是当我运行:dmesg | tail -20时,我得到一个类似1334886164的值,而不是我期待的47。(是的,我做了所有的make, make module_install install, reboot等要求)。这就好像它正在抓取垃圾/超过运行内存或其他东西。但是我很茫然。任何思想/想法吗?

Many Thanks!

您需要将函数更改为:

long createQueue_syscall(unsigned long id){
    return syscall(__NR_createQueue, id); /* note the additional parameter */
}

我猜id没有传递,因此分配了一些随机整数。