欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    添加系统调用实验报告.docx

    • 资源ID:1629164       资源大小:1.51MB        全文页数:23页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    添加系统调用实验报告.docx

    1、添加系统调用实验报告一、构建基本的实验环境1.1基本实验环境与前提条件Windows7 、Word 2010、Vmware WorkStation 8.5、AdobeReaderReadHatLinux 9.0,gcc,viLinux内核V2.4.181.2虚拟机的安装及使用1.3将Linux 内核源代码及配置文件传送给虚拟机上的Red Hat Linux V9.0 系统配置网络时遇到这个问题,Determining IP information for eth0. failed; no link present. Check cable? 通过查找资料发现是系统的Bug,解决方法如下:到/e

    2、tc/sysconfig/network-scripts/ifcfg-eth0在文件最后一行中加入check_link_down () return 1; 另外如果存在/etc/sysconfig/networking/profiles/default/ifcfg-eth0 文件,则同样在其中加入这一段东西即可,然后重启系统。设置网络为DHCP,重新启动就可以,啦,直接上图最后将内核代码下载到/root目录下二、Linux 内核编译、配置与调试2.1 内核配置与编译2.1.1、解压内核源代码文件tar -zxf linux-2.4.18.tar.gz2.1.2、解压后如下 2.1.3、拷贝li

    3、nux,命名为linux-2.4.18cp -r linux linux-2.4.18 2.1.4、移动config-2.4.18forMP.txt到linux-2.4.18根目录,替换掉.config 2.1.5、进入linux-2.4.18目录,配置和编译内核模块 make oldconfig make dep make clean make bzImage make modules2.2 内核安装与测试 2.2.1安装内核映像文件 cp arch/i386/boot/bzImage /boot/vmlinux-2.4.18 2.2.2拷贝和安装Linux系统映射文件System.map,

    4、并创建其与系统映射文件System.map之间的符号链接2.2.3执行命令make modules_install 以安装可动态加载的内核模块 2.2.4添加启动项的配置 利用vi编辑器,vi grub.conf查看/ 所在的位置,为/dev/sda3 2.2.5reboot重新启动系统,从自己创建的内核启动系统启动后查看内核分别用uname r,和dmesg查看三、Linux 系统调用添加与实现3.1 在内核增加系统调用3.1.1结构体struct srz_rusage可声明如下:.struct srz_rusage struct timeval ru_utime; /* user time

    5、 used */struct timeval ru_stime; /* system time used */long ru_majflt; /* major page faults */long ru_minflt; /* minor page faults */long ru_nswap; /* swaps */;3.1.2添加到linux-2.4.18/include/linux下的resource.h中3.1.3添加的系统调用名称为:int get_process_usage(pid_t, struct srz_rusage*);参考的getrusage和sys_getrusage的代

    6、码在linux-2.4.18/linux/kernel/sys.c下面3.1.4分析getrusage()和sys_getrusage()的源代码1)数据结构rusage 在头文件 resource.h中定义。struct rusage struct timeval ru_utime; /* user time used */ struct timeval ru_stime; /* system time used */ long ru_maxrss; /* maximum resident set size */ long ru_ixrss; /* integral shared memor

    7、y size */ long ru_idrss; /* integral unshared data size */ long ru_isrss; /* integral unshared stack size */ long ru_minflt; /* page reclaims */ long ru_majflt; /* page faults */ long ru_nswap; /* swaps */ long ru_inblock; /* block input operations */ long ru_oublock; /* block output operations */ l

    8、ong ru_msgsnd; /* messages sent */ long ru_msgrcv; /* messages received */ long ru_nsignals; /* signals received */ long ru_nvcsw; /* voluntary context switches */ long ru_nivcsw; /* involuntary */;2)函数getrusage()的作用是获取系统资源使用情况。 /* * It would make sense to put struct rusage in the task_struct, * exc

    9、ept that would make the task_struct be *really big*. After * task_struct gets moved into malloced memory, it would * make sense to do this. It will make moving the rest of the information * a lot simpler! (Which were not doing right now because were not * measuring them yet). * * This is SMP safe. E

    10、ither we are called from sys_getrusage on ourselves * below (we know we arent going to exit/disappear and only we change our * rusage counters), or we are called from wait4() on a process which is * either stopped or zombied. In the zombied case the task wont get * reaped till shortly after the call

    11、 to getrusage(), in both cases the * task being examined is in a frozen state so the counters wont change. * * FIXME! Get the fault counts properly! */int getrusage(struct task_struct *p, int who, struct rusage *ru) struct rusage r; memset(char *) &r, 0, sizeof(r); switch (who) case RUSAGE_SELF: r.r

    12、u_utime.tv_sec = CT_TO_SECS(p-times.tms_utime); r.ru_utime.tv_usec = CT_TO_USECS(p-times.tms_utime); r.ru_stime.tv_sec = CT_TO_SECS(p-times.tms_stime); r.ru_stime.tv_usec = CT_TO_USECS(p-times.tms_stime); r.ru_minflt = p-min_flt; r.ru_majflt = p-maj_flt; r.ru_nswap = p-nswap; break; case RUSAGE_CHIL

    13、DREN: r.ru_utime.tv_sec = CT_TO_SECS(p-times.tms_cutime); r.ru_utime.tv_usec = CT_TO_USECS(p-times.tms_cutime); r.ru_stime.tv_sec = CT_TO_SECS(p-times.tms_cstime); r.ru_stime.tv_usec = CT_TO_USECS(p-times.tms_cstime); r.ru_minflt = p-cmin_flt; r.ru_majflt = p-cmaj_flt; r.ru_nswap = p-cnswap; break;

    14、default: r.ru_utime.tv_sec = CT_TO_SECS(p-times.tms_utime + p-times.tms_cutime); r.ru_utime.tv_usec = CT_TO_USECS(p-times.tms_utime + p-times.tms_cutime); r.ru_stime.tv_sec = CT_TO_SECS(p-times.tms_stime + p-times.tms_cstime); r.ru_stime.tv_usec = CT_TO_USECS(p-times.tms_stime + p-times.tms_cstime);

    15、 r.ru_minflt = p-min_flt + p-cmin_flt; r.ru_majflt = p-maj_flt + p-cmaj_flt; r.ru_nswap = p-nswap + p-cnswap; break; return copy_to_user(ru, &r, sizeof(r) ? -EFAULT : 0;3)sys_getrusage()只是调用了内核函数getrusage(),是内核提供给用户的接口。asmlinkage long sys_getrusage(int who, struct rusage *ru) if (who != RUSAGE_SELF

    16、& who != RUSAGE_CHILDREN) return -EINVAL; return getrusage(current, who, ru);3.2 编写应用程序调用该系统(调用)过程 3.2.1在sys.c中添加函数get_process_usage()和系统调用函数sys_get_process_usage()的代码; 目录linux-2.4.18/kernel/sys.c intget_process_usage(structtask_struct*p,structsrz_rusage*ru)structsrz_rusager;memset(char*)&r,0,sizeof

    17、(r); /比上次的实验报告里,更新的内容 printk(“The program(get_process_usage) is successful !n”);r.ru_utime.tv_sec=CT_TO_SECS(p-times.tms_utime);r.ru_utime.tv_usec=CT_TO_USECS(p-times.tms_utime);r.ru_stime.tv_sec=CT_TO_SECS(p-times.tms_stime); r.ru_stime.tv_usec=CT_TO_USECS(p-times.tms_stime); r.ru_minflt=p-min_flt;

    18、 r.ru_majflt=p-maj_flt;r.ru_nswap=p-nswap;returncopy_to_user(ru,&r,sizeof(r)?-EFAULT:0; asmlinkagelongsys_get_process_usage(pid_tpid,structsrz_rusage*ru)structtask_struct*p;p=find_task_by_pid(pid);if(p)returnget_process_usage(p,ru);return-EINVAL;3)修改完源程序以后,下一个任务是使Linux内核知道该程序的存在。为了从已有的内核程序中增加到新的函数的连

    19、接,需要编辑两个文件。第一个要修改的文件是/root/linux-2.4.18/ include/asm-i386/unistd.h,该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。#define _NR_get_process_usage 238根据上图已知系统调用已经用到了237,我们用238 第二个要修改的文件是:/root/linux-2.4.18/arch/i386/kernel/entry.S,该文件中有类似.long SYMBOL_NAME()的清单, 该清单用来对sys_call

    20、_table数组进行初始化,该数组包含指向内核中每个系统调用的指针。我们在清单最后添加一行:.long SYMBOL_NAME(sys_get_process_usage)编译安装内核以后的启动界面四、编写程序调用新的系统调用 4.1.1 程序一头文件/get_process_usag.h#include #include 源程序/ get_process_usag.c#include get_process_usag.h#include int get (pid_t pid);int main(int argc,char *argv) pid_t pid; pid=atoi(argv1);

    21、get (pid); return 1;int get (pid_t pid) struct srz_rusage ru; long r=0; if(pid=0) printf(n error: Pid must int!nn); return 0; r=syscall(238,pid,&ru); if(!r) printf(ShangRongZhu success!nn); printf(User_time :t%d seconds: %d msecondsn,ru.ru_utime.tv_sec,ru.ru_utime.tv_usec); printf(System_time :t%d s

    22、econds: %d mseconds n,ru.ru_stime.tv_sec,ru.ru_stime.tv_usec); printf(Min lost page:t%dn,ru.ru_minflt); printf(Max lost page:t%dn,ru.ru_majflt); printf(Change page times: t%dn,ru.ru_nswap); else printf(Error,cheak the pid: n,r);编译Gcc o testsyscall getpu_syscall.c执行./testsyscall pid_no执行结果Dmesg查看信息 4

    23、.1.2程序二/ get_process_syscall2.c#include get_process_usag.h#include #define _NR_get_process_usage 238_syscall2(long,get_process_usage,pid_t,pid,struct srz_rusage *,ru)int get (pid_t pid);int main(int argc,char *argv) pid_t pid; pid=atoi(argv1); get (pid); return 1;int get (pid_t pid) struct srz_rusag

    24、e ru; long r=0; if(pid=0) printf(n error: Pid must int!nn); return 0; r=get_process_usage(pid,&ru); if(!r) printf(ShangRongZhu success!nn); printf(User_time :t%d seconds: %d msecondsn,ru.ru_utime.tv_sec,ru.ru_utime.tv_usec); printf(System_time :t%d seconds: %d mseconds n,ru.ru_stime.tv_sec,ru.ru_sti

    25、me.tv_usec); printf(Min lost page:t%dn,ru.ru_minflt); printf(Max lost page:t%dn,ru.ru_majflt); printf(Change page times: t%dn,ru.ru_nswap); else printf(Error,cheak the pid: n,r);执行结果如下编译Gcc -o testsyscall2 getpu_syscall2.c./testsyscall pid_nodmesg查看附件:源程序一:第一种实现方法/get_process_usag.h#include #include

    26、 源程序/ get_process_usag.c#include get_process_usag.h#include int get (pid_t pid);int main(int argc,char *argv) pid_t pid; pid=atoi(argv1); get (pid); return 1;int get (pid_t pid) struct srz_rusage ru; long r=0; if(pid=0) printf(n error: Pid must int!nn); return 0; r=syscall(238,pid,&ru); if(!r) print

    27、f(ShangRongZhu success!nn); printf(User_time :t%d seconds: %d msecondsn,ru.ru_utime.tv_sec,ru.ru_utime.tv_usec); printf(System_time :t%d seconds: %d mseconds n,ru.ru_stime.tv_sec,ru.ru_stime.tv_usec); printf(Min lost page:t%dn,ru.ru_minflt); printf(Max lost page:t%dn,ru.ru_majflt); printf(Change pag

    28、e times: t%dn,ru.ru_nswap); else printf(Error,cheak the pid: n,r);第二种实现方法/get_process_usag.h#include #include 源程序/ get_process_syscall2.c#include get_process_usag.h#include #define _NR_get_process_usage 238_syscall2(long,get_process_usage,pid_t,pid,struct srz_rusage *,ru)int get (pid_t pid);int main(int argc,char *argv) pid_t pid; pid=atoi(argv1); get (pid); return 1;int get (pid_t


    注意事项

    本文(添加系统调用实验报告.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开