好的,所以我已经成功地向内核空间添加了一些系统调用。目前我已经将他们的主要意图注释掉了,我想确保数据成功地从用户空间传递到内核空间并按预期进行。我目前遇到一个问题,将用户空间中的变量声明为 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!