簡體   English   中英

如何使用Linux內核模塊中的Linux系統調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM