好的,所以我成功地向内核空间添加了一些系统调用。目前我的主要意图是注释掉,我想确保数据成功地按照预期从用户空间传递到内核空间。我目前遇到一个问题,即在用户空间中将变量声明为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!
答案 0 :(得分:0)
您需要将功能更改为:
long createQueue_syscall(unsigned long id){
return syscall(__NR_createQueue, id); /* note the additional parameter */
}
我猜id没有传递,因此被分配了一些随机整数。