📄 ipage3.htm
字号:
<HTML><HEAD><TITLE>实验二 增加系统调用 </TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="Microsoft FrontPage 6.0" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY background=images/back.gif>
<DIV align=center>
<CENTER>
<TABLE border=0 cellPadding=0 cellSpacing=0 height=382 width=846>
<TBODY>
<TR>
<TD colSpan=2 height=46 vAlign=bottom width=909><font color="#3D5063" size="5">
实验二增加系统调用 </font><FONT color=#3d5063 size=5 style="CURSOR: hand"> </FONT></TD></TR>
<TR>
<TD colSpan=2 height=305 width=909>
<p class="MsoNormal"><span style="font-family:宋体">
<font color="#3D5063">
题目:
掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用。</font></span></p>
<p class="MsoNormal" style="text-indent: -21.0pt; margin-left: 57.0pt">
<font color="#3D5063"><span lang="EN-US" style="font-family: Symbol">
<font size="2">¨</font><span style="font-style: normal; font-variant: normal; font-weight: normal; font-family: Times New Roman"><font size="2">
</font></span></span><span style="font-family:宋体"><font size="2">实现的功能是:文件拷贝;</font></span></font></p>
<p class="MsoNormal" style="text-indent: -21.0pt; margin-left: 57.0pt">
<font color="#3D5063"><span lang="EN-US" style="font-family: Symbol">
<font size="2">¨</font><span style="font-style: normal; font-variant: normal; font-weight: normal; font-family: Times New Roman"><font size="2">
</font></span></span><span style="font-family:宋体"><font size="2">实现的功能是:<span lang="EN-US">P</span>、<span lang="EN-US">V</span>操作。</font></span></font></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> </font></span><span style="font-family:宋体"><font size="2">设计分析<span lang="EN-US">:</span>题目要求增加一个新的系统调用,其实现要用编译内核的方式。</font></span></font></p>
<p class="MsoNormal"><span style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal" style="text-indent: 31.5pt"><span style="font-family:宋体">
<font size="2" color="#3D5063">编译内核需要遵循以下的步骤:</font></span></p>
<p class="MsoNormal" style="text-indent: 42.0pt"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2">(1)</font></span><span style="font-family:宋体"><font size="2">配置内核<span lang="EN-US">—--</span>进入<span lang="EN-US">/usr/src/linux-2.4.20-8/</span>目录下使用<span lang="EN-US">make
xconfig</span>命令进行配置,完成后保存并退出,此时应在<span lang="EN-US">/usr/src/linux-2.4.20-8/</span>下生成<span lang="EN-US">.config</span>文件。</font></span></font></p>
<p class="MsoNormal" style="text-indent: 42.0pt"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2">(2)</font></span><span style="font-family:宋体"><font size="2">创建内核<span lang="EN-US">----</span>在<span lang="EN-US">/usr/src/linux-2.4.20-8/</span>目录下按顺序使用</font><span lang="EN-US"><font size="2">make
dep ,</font></span></span></font></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2">make clean,make bzImage</font></span><span style="font-family:宋体"><font size="2">命令编译生成内核<span lang="EN-US">bzImage</span>。接着把<span lang="EN-US">bzImage</span>从<span lang="EN-US">/usr/src/linux-2.4.20-8/arch/i386/boot/</span>目录下拷贝至<span lang="EN-US">/boot/</span>目录下。</font></span></font></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> (3)</font></span><span style="font-family:
宋体"><font size="2">修改引导软件</font><span lang="EN-US"><font size="2">grub:</font></span></span></font></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> </font>
</span><span style="font-family:
宋体"><font size="2">增加几行:</font><span lang="EN-US"><font size="2">title Red Hat
Linux(2.4.20-8 new)</font></span></span></font></p>
<p class="MsoNormal" style="text-indent: 115.5pt"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2">
root(hd0,7) --</font></span><span style="font-family:宋体"><font size="2">随机子不同而变化
</font></span></font></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2">
kernel/boot/bzImage ro root=hd7 --hd?</font></span><span style="font-family:宋体"><font size="2">应为老内核的启动盘</font></span></font></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> (4)</font></span><span style="font-family:
宋体"><font size="2">重新启动,进入新内核进行测试。</font><span lang="EN-US"><font size="2">
</font></span></span></font></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> </font></span>
<span style="font-family:宋体"><font size="2">修改系统调用的步骤:</font></span></font></p>
<p class="MsoNormal"><font color="#3D5063"><span style="font-family:宋体">
<font size="2"> <span lang="EN-US">(1)</span>修改系统调用表,在文件<span lang="EN-US">arch/i386/kernel/entry.S</span>中添加</font><span lang="EN-US"><font size="2">:</font></span></span></font></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> . long SYMBOL_NAME(sys_myCopy)()
</font></span></p>
<p class="MsoNormal" style="text-indent: -63.0pt; margin-left: 63.0pt">
<font color="#3D5063"><span lang="EN-US" style="font-family:宋体"><font size="2">
(2)</font></span><span style="font-family:
宋体"><font size="2">定义系统调用号,在文件<span lang="EN-US">/usr/include/asm-i386/unistd.h</span>以及<span lang="EN-US">/usr/src/linux/include/asm-i386/unisd.h</span>中添加系统调用号</font><span lang="EN-US"><font size="2">:</font></span></span></font></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> #define __NR_myCopy 259 </font>
</span></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> (3)</font></span><span style="font-family:
宋体"><font size="2">添加自己的代码,修改<span lang="EN-US">/kernel/sys.c</span>。添加的源代码如下:</font></span></font></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">/*myCopy*/</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">asmlinkage int sys_myCopy( char *in,char *out){</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> int infile,outfile;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> char *buf;
</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> int count,n;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> mm_segment_t fs;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> count=32;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> fs = get_fs();
/*</font></span><span style="font-family:
宋体"><font size="2">取现态</font><span lang="EN-US"><font size="2">*/</font></span></span></font></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> set_fs(get_ds());
/*</font></span><span style="font-family:宋体"><font size="2">设核态</font><span lang="EN-US"><font size="2">*/</font></span></span></font></p>
<p class="MsoNormal"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2"> buf=(char*)
kmalloc(count,GFP_KERNEL); /*</font></span><span style="font-family:宋体"><font size="2">开辟内核空间</font><span lang="EN-US"><font size="2">*/
</font></span></span></font></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> if(buf==NULL){</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> printk("Not enough memory !");</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> return (2);</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> }</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt"><font color="#3D5063">
<span lang="EN-US" style="font-family:宋体"><font size="2">if((infile=sys_open(in,O_RDONLY,S_IRWXU))==NULL){
/*</font></span><span style="font-family:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -