簡體   English   中英

向Linux內核添加新的系統調用似乎無效

[英]Adding a new system call to linux kernel doesn't seem to work

我正在上一門操作系統課程,第一個任務是向內核(Redhat,內核版本2.4)添加一些系統調用。

我添加了我認為需要添加的所有內容,但仍然無法正常工作。

我試圖運行測試,但我注意到包裝器(我在下面添加了一個示例,並為其添加了sys_call代碼)未鏈接系統調用。 我知道這一點是因為我在系統調用中放入了一個printk,但它們從未出現(並且測試本身沒有給出我期望的結果)。

現在,據我了解,添加系統調用的開發過程是:

  1. 在指令中創建一個類似於示例包裝器函數的包裝器(將其稱為aservice״)。
  2. 將sys_aservice寫入.c文件,該文件將進入linux-2.4.18-14custom文件夾中的許多文件之一。 轉到的文件取決於我要添加的服務類型(例如,如果它是文件系統服務,我將其放在fs中)。
  3. /usr/src/linuxlinux-2.4.18-14custom/arch/i386/kernel/ entry.S的表中添加系統調用的條目。

這是我剛開始所做的,但似乎還不夠(因為它似乎無法正常工作)。

我在網上查找了該書(並閱讀: 如何添加系統調用 ),並閱讀到我需要添加/更改以下內容才能使鏈接正常工作。

  1. 在unistd.h中為系統調用添加一行。 看起來像

    定義__NR_aservice

  2. 將aservice添加到makefile中。 因此,例如,如果將aservice.c放在fs文件夾中,則將aservice.c添加到fs的makefile中。

  3. 創建一個aservice.h文件,該文件將轉到linux-2.4.18-14custom / include / linux(所有h文件顯然都存放在哪里?)。 該.h文件將包含一個稱為“存根”的東西,該存根是從unistd.h中的宏自動生成的(.h文件必須包含),以便用戶程序可以使用您的系統調用。 存根的聲明如下所示:_syscallN(返回類型,函數名稱,arg1類型,arg1名稱...)“,其中” N“是參數的數量。

  4. 在aservice.c中的每個sys_X函數前面都添加關鍵字“ asmlinkage”(需要包含linkage.h)。 因此,函數聲明如下所示:asmlinkage int sys_aservice(...){..}之后,將.h文件包含在.c文件中。

這一切正確嗎? 因為即使執行以下操作,仍然好像沒有調用系統調用。

這是包裝器和系統調用實現的示例:

 int stop_monitor(int pid){
        long __res;
        __asm__ volatile (
                "movl $244, %%eax;" << 244 is the entry in the sys_call table in entry.S 
                "movl %1, %%ebx;"
                "int $0x80;"
                "movl %%eax, %0"
                : "=m" (__res)
                : "m" (pid)
                : "%eax", "%ebx"
        );
        if((unsigned long)(__res) >= (unsigned long)(-125)) {
            errno = -(__res);
            __res = -1;
        }
        return (int)(__res);
    }


asmlinkage int sys_stop_monitor(int pid){
    task_t* task = find_task_by_pid(pid);
    if(!task)
        return -ESRCH;
    if(task->flagMonitor == 0)
        return -EPERM;
    task->flagMonitor = 0;
    return 0;
}

我想念什么?

我已經測試了為我的微型libc編寫的這些syscall幫助器:

#define MKFNS(fn,...) MKFN_N(fn,##__VA_ARGS__,9,8,7,6,5,4,3,2,1,0)(__VA_ARGS__)
#define MKFN_N(fn, n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n, ...) fn##n
#define syscall(...) MKFNS(syscall,##__VA_ARGS__)

static inline long syscall0(long n){
    unsigned long r;
    asm volatile("int $128":"=a"(r):"a"(n):"memory");
    return r;
}

#define syscall1(n,a) _syscall1(n,(long)a)
static inline long _syscall1(long n, long a){
    unsigned long r;
    asm volatile("int $128":"=a"(r):"a"(n),"b"(a):"memory");
    return r;
}

#define syscall2(n,a,b) _syscall2(n,(long)a,(long)b)
static inline long _syscall2(long n, long a, long b){
    unsigned long r;
    asm volatile("int $128":"=a"(r):"a"(n),"b"(a),"c"(b):"memory");
    return r;
}

#define syscall3(n,a,b,c) _syscall3(n,(long)a,(long)b,(long)c)
static inline long _syscall3(long n, long a, long b, long c){
    unsigned long r;
    asm volatile("int $128" : "=a"(r):"a"(n),"b"(a),"c"(b),"d"(c):"memory");
    return r;
}

#define syscall4(n,a,b,c,d) _syscall4(n,(long)a,(long)b,(long)c,(long)d)
static inline long _syscall4(long n, long a, long b, long c, long d){
    unsigned long r;
    asm volatile("int $128":"=a"(r):"a"(n),"b"(a),"c"(b),"d"(c),"S"(d):"memory");
    return r;
}

#define syscall5(n,a,b,c,d,e) _syscall5(n,(long)a,(long)b,(long)c,(long)d,(long)e)
static inline long _syscall5(long n, long a, long b, long c, long d, long e){
    unsigned long __ret;
    __asm__ __volatile__ ("int $128" : "=a"(__ret) : "a"(n), "b"(a), "c"(b), "d"(c), "S"(d), "D"(e) : "memory");
    return __ret;
}

void exit(long a){asm volatile("int $128":"=a"(a):"a"(1),"b"(a):"memory");}
extern char **environ;

asm(".text\n"
".global _start\n"
"_start:\n"
"popl %ecx\n"
"movl %esp,%esi\n"
"pushl %ecx\n"
"leal 4(%esi,%ecx,4),%eax\n"
"pushl %eax\n"
"pushl %esi\n"
"pushl %ecx\n"
"movl %eax,environ\n"
"call main\n"
"pushl %eax\n"
"call exit\n"
"hlt\n"
".Lstart:\n"
".size _start,.Lstart-._start\n"
);

#define aservice(...) syscall(__NR_aservice,__VA_ARGS__)
#define write(...) syscall(__NR_write,__VA_ARGS__) //#define __NR_write 4

然后您可以運行一個簡單的測試程序以確保可以處理系統調用

int main(void){write(1,"hello world!\n",13);}

gcc -nostdlib -fno-builtin編譯

這將使您測試是否可以訪問系統調用,從而知道問題出在系統調用還是訪問系統調用的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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