2011-11-09 35 views
0

我在linux內核的sched_setschedule()函數中做了一些修改。我成功地重新編譯並構建它。現在,當我嘗試在我的C程序中使用sched_setschedule()(使用gcc)時,我注意到gcc頭文件的挑選與我修改以編譯內核的頭文件完全不同。內核級函數原型和用戶級函數原型的區別

在這種情況下

GCC從/usr/include/sched.h

其中FUNC原型定義如下

的extern INT sched_setparam拾取sched.h中文件( __pid_t __pid,__const struct sched_pa​​ram * __ param) __THROW;

而內核版本有 我使用2.6.35.23內核

/usr/src/linux-headers-2.6.35-23

的extern INT sched_setscheduler(結構的task_struct *,INT, struct sched_pa​​ram *);

這兩個標題如何相互關聯或映射到對方?換句話說,內核函數原型中的更改如何級聯回gcc庫(頭文件)

回答

3

內核函數不直接適用於用戶空間代碼。相反,有一個穿過系統調用接口的厚層。這由glibc完成。 /usr/include中的頭文件屬於glibc頭文件。看起來你試圖擴展官方的調度程序界面,但是這也需要你修改和/或擴展glibc本身,我猜這不是你的初衷。另外,如果你想把這個內核模塊交給其他人,另一個人也需要替換他的包含運行時二進制文件和/或編譯器時間頭文件的glibc版本。

您可以編寫自己的sched_setparam系統調用版本,而不必依賴於sched.h,請參閱man 2 syscall

另一種方法是在不修改現有接口的情況下擴展內核,而是創建新的接口。如何添加新的/proc/sys文件並將其包裝在新的單獨庫中的資源極少。

+0

嗨Dan,謝謝你的回覆。請你詳細說明一下:「你可以編寫自己的sched_setparam系統調用版本,而不需要依賴於sched.h,參見man 2 syscall」我檢查了系統調用手冊。沒有找到一種方法,我怎麼能不使用修改glibc – David

+0

而使用sched_setparam()我的意思是在系統調用的手冊頁上sched_setscheduler()的列表顯示類似於包裝函數「http:// linux」的原型。 die.net/man/2/sched_setscheduler「int sched_setscheduler(pid_t pid,int policy, const struct sched_pa​​ram * param); – David

+0

請參閱'使用系統調用'[here](http://www.ibm.com/developerworks/linux/library/l-system-calls/) –