2011-05-14 34 views
14

我已經下載了內核2.6.38-5並且想要添加系統調用。 我做了以下內容:添加系統調用時的錯誤地址

  1. 我已經加入我的系統調用系統調用表;

    <src folder>/arc/x86/kernel/syscall_table_32.S 
    
    .long sys_mycall 
    
  2. 我已經添加了系統呼叫號碼;

    <src folder>/include/asm-generic/unistd.h 
    
    #define __NR_mycall 244 
    __SYSCALL(__NR_mycall, sys_mycall) 
    
  3. 我已經加入了原型syscalls.h;

    <src follder>/include/linux/syscalls.h 
    
    asmlinkage long sys_mycall(long input); 
    
  4. 而且,這裏是我的系統調用;

    asmlinkage long sys_mycall(long input) { 
        return (input * 2); 
    } 
    
  5. 我也編輯了Makefiles。

現在編譯之後,當我通過syscall()使用它,它給了我BAD ADDRESS並將errno設置爲14

我應該怎麼辦?

+4

+1,祝賀您對問題有一個令人滿意的完整描述和最低限度的知識。你不會想象這些新來的人會問很多關於非常低層次問題的問題。 – zneak 2011-05-14 16:32:34

回答

5

在x86上,系統調用號244已經採取get_thread_area(),這需要作爲第一個參數指針struct user_desc

int get_thread_area(struct user_desc *u_info); 

你傳遞一個數字,而不是一個指針,內核試圖將其解釋爲指針,它將確定它指向您的過程之外,並返回-EFAULT

+0

你說得對。根據這個文件'/ usr/include/asm/unistd_32.h',範圍244-259中唯一可用的系統呼叫號碼是251.所以我將我的系統呼叫號碼改爲251.但是這一次它說:'功能沒有實現'用'errno = 38' – 2011-05-14 23:33:10

0

系統調用查詢運行內核。該函數被映射到內核中的地址空間。如果您不安裝此內核並重新啓動機器,該地址將無效。

+1

聽起來不像我的答案 – Dani 2011-05-14 17:50:40

+0

好的,詳細說明。 – Mel 2011-05-14 17:51:55

+0

是的,我已經安裝了新的內核映像和內核頭文件。 但它不起作用! – 2011-05-14 18:02:11

相關問題