2010-08-23 181 views
4

我正在linux內核中編寫一個新的系統調用。我想實現一個錯誤處理系統,以返回給使用sycall的用戶描述錯誤類型的代碼。我想知道這是如何在內核中完成的,因爲我想遵循標準。我想讓用戶閱讀errno變量或其他等價物來理解發生的錯誤。 謝謝。Linux內核中的系統調用錯誤處理

P.S.我正在使用最新的linux版本。

回答

2

我發現我可以簡單地通過在sycall中返回代碼本身來返回我想要設置的代碼的數量。其餘的都是由linux內核自動完成的。

1

您有兩種選擇:使用現有的錯誤代碼或定義您自己的錯誤代碼。大部分時間我發現現有的錯誤代碼已經足夠接近我想要的含義。

include/asm-generic/errno-base.h

include/asm-generic/errno.h

基本誤差號碼中發現的。

在您的系統調用中,您可以向用戶返回現有errno值的負值。例如:

return -ENOMEM; 
11

很多你的任務是由libc和低級別的內核系統調用句柄(彙編語言編寫的一部分)會自動照顧。處理錯誤代碼的內核約定是返回一個負的錯誤常量,如-ENOMEM。零或正數表示成功。這貫穿整個內核。

如果你已經定義了新的sycall入口點static asmlinkage long my_new_syscall (int param) {...},它只需要返回-ENOMEM(或類似的東西)。如果您使用libc的syscall(nr, param)調用了系統調用,那麼在發生錯誤時將返回-1,ENOMEM(正數中)將出現在errno中。

include/asm-generic/{errno,errno-base}.h中定義了很多可以使用的錯誤代碼(如ENOMEM)。如果這些都不符合您的目的,您可以將自己的錯誤編號添加到這些文件中,但請注意,您還需要修改用戶空間可見的內核標題以顯示相同的編號,因此它將更加困難設置一個系統來使用你的修改。如果你不需要,不要這樣做。