【发布时间】:2016-03-27 14:10:47
【问题描述】:
我目前正在学校学习操作系统课程。
现在,我一直在尝试添加一些新的系统调用,以便在内核空间中建立一个队列。
我在这里尝试做三件事:
1) 建立队列(通过动态分配或仅声明一个数组)
2) 入队
3) 出队
问题在于 1)。
这是系统调用源文件的示例代码:
asmlinkage long sys_allocqueue(unsigned int size){
int *queue = kmalloc(sizeof(int) * size, GFP_KERNEL);
return 0;
}
这只是声明数组:
asmlinkage long sys_allocqueue(unsigned int size){
int queue[size];
return 0;
}
无论哪种方式,我都会返回 -1,这是测试应用程序中系统调用的错误。
我不知道为什么这不起作用。
附言
我还发现了关于使用 kfifo.h 创建队列的方法,但效果也不好。
【问题讨论】:
-
定义
asmlinkage long sys_*不会自动将系统调用添加到内核中,您需要在特定于arch的代码中修改entry.S文件以使内核知道新的系统调用入口。只是谷歌“添加系统调用到 linux 内核”。
标签: linux linux-kernel system-calls