添加系统调用实验报告Word格式文档下载.docx
《添加系统调用实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《添加系统调用实验报告Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
tar-zxf
、解压后如下
、拷贝linux,命名为-rlinux
、移动到根目录,替换掉.config
、进入目录,配置和编译内核模块
makeoldconfig
{
makedep
makeclean
makebzImage
makemodules
内核安装与测试
安装内核映像文件
cparch/i386/boot/bzImage/boot/
拷贝和安装Linux系统映射文件,并创建其与系统映射文件之间的符号链接
执行命令makemodules_install以安装可动态加载的内核模块
添加启动项的配置
利用vi编辑器,vi
查看/所在的位置,为/dev/sda3
重新启动系统,从自己创建的内核启动系统
启动后查看内核
:
分别用uname–r,和dmesg查看
三、Linux系统调用添加与实现
在内核增加系统调用
结构体structsrz_rusage可声明如下:
.
structsrz_rusage{
structtimevalru_utime;
/*usertimeused*/
structtimevalru_stime;
/*systemtimeused*/
longru_majflt;
/*majorpagefaults*/
longru_minflt;
/*minorpagefaults*/
longru_nswap;
/*swaps*/
…
};
添加到下的中
添加的系统调用名称为:
intget_process_usage(pid_t,structsrz_rusage*);
参考的getrusage和sys_getrusage的代码在下面
分析getrusage()和sys_getrusage()的源代码
1)数据结构rusage在头文件中定义。
structrusage{
structtimevalru_utime;
》
structtimevalru_stime;
longru_maxrss;
/*maximumresidentsetsize*/
longru_ixrss;
/*integralsharedmemorysize*/
longru_idrss;
/*integralunshareddatasize*/
longru_isrss;
/*integralunsharedstacksize*/
longru_minflt;
/*pagereclaims*/
longru_majflt;
/*pagefaults*/
longru_nswap;
/*swaps*/
longru_inblock;
/*blockinputoperations*/
longru_oublock;
/*blockoutputoperations*/
longru_msgsnd;
/*messagessent*/
,
longru_msgrcv;
/*messagesreceived*/
longru_nsignals;
/*signalsreceived*/
longru_nvcsw;
/*voluntarycontextswitches*/
longru_nivcsw;
/*involuntary"
*/
2)函数getrusage()的作用是获取系统资源使用情况。
/*
*Itwouldmakesensetoputstructrusageinthetask_struct,
*exceptthatwouldmakethetask_structbe*reallybig*.After
*task_structgetsmovedintomalloc'
edmemory,itwould
*makesensetodothis.Itwillmakemovingtherestoftheinformation
'
*alotsimpler!
(Whichwe'
renotdoingrightnowbecausewe'
renot
*measuringthemyet).
*
*ThisisSMPsafe.Eitherwearecalledfromsys_getrusageonourselves
*below(weknowwearen'
tgoingtoexit/disappearandonlywechangeour
*rusagecounters),orwearecalledfromwait4()onaprocesswhichis
*eitherstoppedorzombied.Inthezombiedcasethetaskwon'
tget
*reapedtillshortlyafterthecalltogetrusage(),inbothcasesthe
*taskbeingexaminedisinafrozenstatesothecounterswon'
tchange.
*FIXME!
Getthefaultcountsproperly!
intgetrusage(structtask_struct*p,intwho,structrusage*ru)
structrusager;
memset((char*)&
r,0,sizeof(r));
switch(who){
caseRUSAGE_SELF:
=CT_TO_SECS(p->
;
=CT_TO_USECS(p->
:
=p->
min_flt;
maj_flt;
nswap;
break;
caseRUSAGE_CHILDREN:
cmin_flt;
cmaj_flt;
cnswap;
default:
+p->
min_flt+p->
maj_flt+p->
nswap+p->
<
returncopy_to_user(ru,&
r,sizeof(r))-EFAULT:
0;
}
3)sys_getrusage()只是调用了内核函数getrusage(),是内核提供给用户的接口。
asmlinkagelongsys_getrusage(intwho,structrusage*ru)
if(who!
=RUSAGE_SELF&
&
who!
=RUSAGE_CHILDREN)
return-EINVAL;
returngetrusage(current,who,ru);
[
编写应用程序调用该系统(调用)过程
在中添加函数get_process_usage()和系统调用函数sys_get_process_usage()的代码;
int
get_process_usage(struct
task_struct
*p,struct
srz_rusage
*ru)
{
struct
r;
memset((char
*)
r,
0,
sizeof(r));
ongSYMBOL_NAME()]的清单,该清单用来对sys_call_table[]数组进行初始化,该数组包含指向内核中每个系统调用的指针。
我们在清单最后添加一行:
.longSYMBOL_NAME(sys_get_process_usage)
)
编译安装内核以后的启动界面
四、编写程序调用新的系统调用
程序一
头文件
testsyscallpid_no
执行结果
Dmesg查看信息
程序二
dmesg查看
附件:
。
源程序一
第一种实现方法
//
#include<
/root/<
/root/源程序
//
#include"
"
>
intget(pid_tpid);
—
intmain(intargc,char*argv[])
pid_tpid;
pid=atoi(argv[1]);
get(pid);
intget(pid_tpid)
structsrz_rusageru;
longr=0;
if(pid<
=0){
printf("
\nerror:
Pidmustint!
\n\n"
);
return0;
r=syscall(238,pid,&
ru);
if(!
r)
{
ShangRongZhusuccess!
printf("
User_time:
\t%dseconds:
%dmseconds\n"
System_time:
%dmseconds\n"
printf("
Minlostpage:
\t%d\n"
;
Maxlostpage:
?
Changepagetimes:
\t%d\n"
else
Error,cheakthepid:
\n"
r);
第二种实现方法
#define__NR_get_process_usage238
_syscall2(long,get_process_usage,pid_t,pid,structsrz_rusage*,ru)
r=get_process_usage(pid,&