我在擺弄系統調用。我添加了兩個新的並驗證他們使用呼叫syscall
。在執行系統調用時,您如何將系統調用號碼公開給userland?
我想將系統調用號碼放在頭文件中,以便用戶空間不必明確地知道系統調用號碼。
在arch/x86/syscalls/syscall_64.tbl
我:
317 64 krun_read_msrs sys_krun_read_msrs
318 64 krun_reset_msrs sys_krun_reset_msrs
有些grepping暗示的kbuild已經自動生成宏爲新的系統調用:
$ ag __NR_krun *
arch/x86/include/generated/uapi/asm/unistd_64.h
321:#define __NR_krun_read_msrs 317
322:#define __NR_krun_reset_msrs 318
的文件名顯示,我不需要手動添加條目,但這與Linux Kernel文檔不得不說的相反:
Some architectures (e.g. x86) have their own architecture-specific syscall tables, but several other architectures share a generic syscall table. Add your new system call to the generic list by adding an entry to the list in include/uapi/asm-generic/unistd.h:
#define __NR_xyzzy 292
__SYSCALL(__NR_xyzzy, sys_xyzzy)
那麼,我的系統調用是x86_64特定的,因爲他們讀取和寫入僅在英特爾芯片中找到的MSR。所以在此之後,我開始研究是否可以找到我的amd64系統的arch-specific header。
你會期望它在arch/x86_64
之下,但是在那裏根本沒有包含。所以我認爲x86_64繼承自x86
。既然如此,具體拱頭應該是:
arch/x86/include/uapi/asm/unistd.h
如果打開了,它只是一個小包裝派遣基礎上拱:
# ifdef __i386__
# include <asm/unistd_32.h>
# elif defined(__ILP32__)
# include <asm/unistd_x32.h>
# else
# include <asm/unistd_64.h>
# endif
所以這大概是設計來接up /usr/include/x86_64-linux-gnu/asm/unistd.h
,但這還不包括我的新系統調用號碼。
我希望headers_install
目標安裝新的標題(也許),但可惜它沒有。
我很困惑。我應該手動添加我的新系統調用到文件嗎?如果是這樣的文件?如果不是,我如何將自動生成的__NR_*
宏暴露給標準位置的用戶空間?
謝謝
如果您在庫中實現包裝函數以調用系統調用,則不一定需要。畢竟,這是C庫在POSIXy系統上所做的大部分工作。您可以讓庫頭文件公開系統調用號(適用於當前體系結構)。要爲所有Linux用戶提供新的系統調用,您需要將補丁上傳到Linux內核(通過LKML)以及GNU C庫或特定的發行版,以便將更改添加到他們的系統頭文件中。 –
是的,這不是真的可行,因爲系統調用不適合一般用途。 –
什麼(不可行),將系統調用封裝到函數中? (如果你的意思是把它推到上游,我同意)。但你真的應該考慮把系統調用包裝到函數中去;即使像頭文件中的靜態內聯函數一樣,根據拱和字大小(使用預處理器宏)選擇適當的系統調用號。提供* extra *頭文件以及修改後的內核(或內核修改)要比在標準頭文件中包含額外的項目容易得多。 –