?? ipage3.htm
字號:
<HTML><HEAD><TITLE>實(shí)驗(yàn)二 增加系統(tǒng)調(diào)用 </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">
實(shí)驗(yàn)二增加系統(tǒng)調(diào)用 </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">
題目:
掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過程,通過編譯內(nèi)核方法,增加一個新的系統(tǒng)調(diào)用。另編寫一個應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用。</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">實(shí)現(xiàn)的功能是:文件拷貝;</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">實(shí)現(xiàn)的功能是:<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">設(shè)計分析<span lang="EN-US">:</span>題目要求增加一個新的系統(tǒng)調(diào)用,其實(shí)現(xiàn)要用編譯內(nèi)核的方式。</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">編譯內(nèi)核需要遵循以下的步驟:</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">配置內(nèi)核<span lang="EN-US">—--</span>進(jìn)入<span lang="EN-US">/usr/src/linux-2.4.20-8/</span>目錄下使用<span lang="EN-US">make
xconfig</span>命令進(jìn)行配置,完成后保存并退出,此時應(yīng)在<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">創(chuàng)建內(nèi)核<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">命令編譯生成內(nèi)核<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">修改引導(dǎo)軟件</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">隨機(jī)子不同而變化
</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">應(yīng)為老內(nèi)核的啟動盤</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">重新啟動,進(jìn)入新內(nèi)核進(jìn)行測試。</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">修改系統(tǒng)調(diào)用的步驟:</font></span></font></p>
<p class="MsoNormal"><font color="#3D5063"><span style="font-family:宋體">
<font size="2"> <span lang="EN-US">(1)</span>修改系統(tǒng)調(diào)用表,在文件<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">定義系統(tǒng)調(diào)用號,在文件<span lang="EN-US">/usr/include/asm-i386/unistd.h</span>以及<span lang="EN-US">/usr/src/linux/include/asm-i386/unisd.h</span>中添加系統(tǒng)調(diào)用號</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">取現(xiàn)態(tài)</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">設(shè)核態(tài)</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">開辟內(nèi)核空間</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:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -