日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 內(nèi)核解讀入門( 三 )


 和arch/i386/kernel/entry.S兩個(gè);

【三】 對(duì)內(nèi)核源碼的修改:
1.在kernel/sys.c中增加系統(tǒng)服務(wù)例程如下:
asmlinkage int sys_addtotal(int numdata)
{
int i=0,enddata=https://www.rkxy.com.cn/dnjc/0;
while(i<=numdata)
enddata =https://www.rkxy.com.cn/dnjc/i;
return enddata;
}
該函數(shù)有一個(gè) int 型入口參數(shù) numdata , 并返回從 0 到 numdata 的累加值;當(dāng)然也可以把系統(tǒng)服務(wù)例程放
在一個(gè)自己定義的文件或其他文件中,只是要在相應(yīng)文件中作必要的說(shuō)明;
2.把 asmlinkage int sys_addtotal( int) 的入口地址加到sys_call_table表中:
arch/i386/kernel/entry.S 中的最后幾行源代碼修改前為:
... ...
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork)/* 190 */
.rept NR_syscalls-190
.long SYMBOL_NAME(sys_ni_syscall)
.endr
修改后為:... ...
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork)/* 190 */
/* add by I */
.long SYMBOL_NAME(sys_addtotal)
.rept NR_syscalls-191
.long SYMBOL_NAME(sys_ni_syscall)
.endr
3. 把增加的 sys_call_table 表項(xiàng)所對(duì)應(yīng)的向量,在include/asm-386/unistd.h 中進(jìn)行必要申明,以供
 用戶進(jìn)程和其他系統(tǒng)進(jìn)程查詢或調(diào)用:
增加后的部分 /usr/src/linux/include/asm-386/unistd.h 文件如下:
... ...
#define __NR_sendfile 187
#define __NR_getpmsg188
#define __NR_putpmsg 189
#define __NR_vfork 190
/* add by I */
#define __NR_addtotal 191
4.測(cè)試程序(test.c)如下:
#include
#include

_syscall1(int,addtotal,int, num)

main()
{
int i,j;

do
 printf("Please input a numbern");
while(scanf("%d",&i)==EOF);
if((j=addtotal(i))==-1)
 printf("Error occurred in syscall-addtotal();n");
printf("Total from 0 to %d is %d n",i,j);
}
對(duì)修改后的新的內(nèi)核進(jìn)行編譯,并引導(dǎo)它作為新的操作系統(tǒng),運(yùn)行幾個(gè)程序后可以發(fā)現(xiàn)一切正常;在新的系統(tǒng)下
對(duì)測(cè)試程序進(jìn)行編譯(*注:由于原內(nèi)核并未提供此系統(tǒng)調(diào)用,所以只有在編譯后的新內(nèi)核下,此測(cè)試程序才能
可能被編譯通過(guò)),運(yùn)行情況如下:
$gcc -o test test.c
$./test
Please input a number
36
Total from 0 to 36 is 666
可見(jiàn),修改成功;
而且,對(duì)相關(guān)源碼的進(jìn)一步分析可知,在此版本的內(nèi)核中,從/usr/src/linux/arch/i386/kernel/entry.S
文件中對(duì) sys_call_table 表的設(shè)置可以看出,有好幾個(gè)系統(tǒng)調(diào)用的服務(wù)例程都是定義在
/usr/src/linux/kernel/sys.c 中的同一個(gè)函數(shù):
asmlinkage int sys_ni_syscall(void)
{
return -ENOSYS;
}
例如第188項(xiàng)和第189項(xiàng)就是如此:
... ...
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork)/* 190 */
... ...
而這兩項(xiàng)在文件 /usr/src/linux/include/asm-386/unistd.h 中卻申明如下:
... ...
#define __NR_sendfile 187
#define __NR_getpmsg 188 /* some people actually want streams */
#define __NR_putpmsg 189 /* some people actually want streams */
#define __NR_vfork 190
由此可見(jiàn),在此版本的內(nèi)核源代碼中,由于asmlinkage int sys_ni_syscall(void) 函數(shù)并不進(jìn)行任何操作,
所以包括 getpmsg, putpmsg在內(nèi)的好幾個(gè)系統(tǒng)調(diào)用都是不進(jìn)行任何操作的,即有待擴(kuò)充的空調(diào)用; 但它們
卻仍然占用著sys_call_table表項(xiàng),估計(jì)這是設(shè)計(jì)者們?yōu)榱朔奖銛U(kuò)充系統(tǒng)調(diào)用而安排的; 所以只需增加相應(yīng)

推薦閱讀