[英]Linux Kernel should I use asmlinkage for a function that implements a system call?
[英]How do I use a Linux System call from a Linux Kernel Module
我在Linux內核模塊內調用系統調用時遇到一些困難。 系統調用已經過測試,並且可以從標准的c用戶空間程序中正常工作,但我似乎無法獲得內核模塊來編譯和運行它們。
在我的用戶程序中,我包含以下代碼,系統調用有效:
#include <linux/unistd.h>
#define __NR_sys_mycall 343
extern long int _syscall(long int_sysno,...)__THROW;
//and then a simple call is done as such
long value = syscall(__NR_sys_mycall);
printf("The value is %ld\n",value);
但是當我在我的Linux內核模塊中嘗試相同的事情時,我得到一堆錯誤,或者說錯誤:隱式聲明函數'syscall'(如果我不包括_syscall定義)或者一長串關於語法的錯誤if我...所以我的假設是我需要內核空間版本來調用系統調用。 我是對還是錯?
//My LKM code
#include <linux/module.h>
#include <linux/unistd.h>
#define __NR_sys_mycall 343
static int start_init(void)
{
long value = syscall(__NR_sys_mycall);
printk("The value is %ld\n",value);
return 0;
}
static void finish_exit(void)
{
printk("Done!\n");
}
module_init(start_init);
module_exit(finish_exit);
您可以直接調用sys_mycall 。
#include <linux/module.h>
#include <linux/unistd.h>
static int start_init(void)
{
long value = sys_mycall (pass_arguments)
printk("The value is %ld\n",value);
return 0;
}
static void finish_exit(void)
{
printk("Done!\n");
}
module_init(start_init);
module_exit(finish_exit);
大多數系統調用都使用asmlinkage,這意味着在堆棧上查找參數而不是寄存器。 確保在調用系統調用時,在堆棧上傳遞參數。
許多系統調用也只使用copy_from_user。 如果將內核地址傳遞給此類系統調用,則它們會失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.