﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Snowdream-随笔分类-Linux</title><link>http://www.blogjava.net/zellux/category/21871.html</link><description>迷茫的大二：读书 思考 等待</description><language>zh-cn</language><lastBuildDate>Sat, 17 May 2008 17:20:58 GMT</lastBuildDate><pubDate>Sat, 17 May 2008 17:20:58 GMT</pubDate><ttl>60</ttl><item><title>ICS Lab 6</title><link>http://www.blogjava.net/zellux/archive/2008/05/17/201170.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 17 May 2008 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/05/17/201170.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/201170.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/05/17/201170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/201170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/201170.html</trackback:ping><description><![CDATA[重定向：<br /><br />主要用到open, close, read和write这几个函数，关于它们的使用方法可以使用<br />man 2 &lt;函数名&gt;<br />查看。<br /><br />这里简单介绍下：<br />Linux内核为每个进程维护了一张已打开的文件的表格，用File Descriptor（整型，以下简写成fd）可以访问到这些文件。所以很容易理解tsh.c中的函数listjobs为什么需要<br />一个output_fd的整型参数，注意它的后面有这么一行：<br />    if (writer(output_fd, buf, strlen(buf)) &lt; 0) …<br /><br />这一行就把前面构造好的buf字符串（包括当前进程的信息）输出到这个output_fd对应的文件中了。<br /><br />每个进程的值为0, 1, 2的fd都指向相同的文件，0对应标准输入（通常是键盘输入），1对应标准输出（通常为屏幕），2对应标准错误输出。<br /><br />可以看到在main方法的开头，有这么一句<br />    dup2(1, 2);<br /><br />dup2的作用是把参数二指向的文件改成和参数一一样（如果之前打开了文件，则先关闭），这句话的作用就是把原来要输出到标准错误端(stderr)的内容<br />输出到标准输出端(stdout)，便于调试。<br /><br />理解了fd和dup2的作用后，重定向也就很容易实现了，一种最简单的方法就是先用open函数打开输出文件并得到对应的fd，然后用dup2把标准输出/输入端的指向改成文件的fd<br />。<br /><br />另外注意用open创建输出重定向的文件的时候要加上S_IRUSR和S_IWUSR选项，否则创建后的文件没有读写权限。（不过好像这个lab的测试数据比较厚道，会事先touch一下，不加这两个选项应该也能通过测试）<br /><br />一些文档中未定义的行为：<br />argv<br />假如我输入的命令是/bin/ls -l &gt; ls.txt，对应的argv应该包括哪些内容呢？<br />一般的情况argv的内容应该是['/bin/ls', '-l']，后面的重定向符是不包括的不过在这个lab中似乎没有这个限制，不去掉重定向和管道部分应该还是能通过测试的。<br /><br />Job ID的分配<br />如果现在1, 2, 4号子任务在后台运行，再新增一个进程的话应该给它分配多少呢？<br />这个问题不需要处理，只要所有的jobs队列操作统一使用tsh.c中给出的几个函数就行。<br /><br />其他：<br />关于信号的转发、后台前台的转换等内容，文档和书上都说得很清楚了，这里不再赘述。<br /><br /><br />P.S. 多进程程序的调试大家之前应该接触的比较少，其实这个lab大致的代码不难写，难点在于细节上的debug比较困难，调试过程对第八章的理解很有帮助。<br /><img src ="http://www.blogjava.net/zellux/aggbug/201170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-05-17 22:28 <a href="http://www.blogjava.net/zellux/archive/2008/05/17/201170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vim中.cpp的配置和c.vim中指定的一样</title><link>http://www.blogjava.net/zellux/archive/2008/04/17/193610.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 16 Apr 2008 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/17/193610.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/193610.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/17/193610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/193610.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/193610.html</trackback:ping><description><![CDATA[~/.vim/ftplugin/ 下有c.vim和cpp.vim<br />但是vim打开cpp和c文件时使用的配置都是c.vim中指定的<br /><br />使用vim xxx.cpp -V跟踪了打开的配置列表，发现有这么一段<br /><br />line 17: sourcing "/usr/share/vim/ftplugin/cpp.vim"<br />Searching for "ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim" in "/home/wyx/.vim,/usr/share/vim,/usr/share/vim,<br />/usr/share/vim/after,/home/wyx/.vim/after"<br />Searching for "/home/wyx/.vim/ftplugin/c.vim"<br />line 12: sourcing "/home/wyx/.vim/ftplugin/c.vim"<br /><br />原来/usr/share/vim/ftplugin/cpp.vim中直接调用了c.vim<br />runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim<br />把这行注释掉，问题解决<img src ="http://www.blogjava.net/zellux/aggbug/193610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-17 00:48 <a href="http://www.blogjava.net/zellux/archive/2008/04/17/193610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读核笔记(6) - 虚拟存储</title><link>http://www.blogjava.net/zellux/archive/2008/02/27/182436.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 27 Feb 2008 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/27/182436.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/182436.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/27/182436.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/182436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/182436.html</trackback:ping><description><![CDATA[
		<p>本来想看完pagefault的处理的，不过实验室有事情了，只能先把这一半放上来了。</p>
		<p>页面的分配与回收使用了一个叫做buddy allocator的机制，kernelnewbies上的解释<br />The memory allocation scheme used in the kernel. A vector of lists of free pages is kept, ordered by the size of the chunk (in powers of two). When a chunk is allocated, it is removed from the relevant list. When a chunk is freed back to the free pages pool, it is placed in the relevant list, starting from the top. If it is physically contiguous with a present chunk, they are merged and placed in the list above (i.e. where the chunks are twice the size), and this operation percolates up the vector. As regions are merged whenever possible, this design helps to reduce memory fragmentation.<br /><br />首先在zone_struct{} 中保存了一个free_area_t数组，这个数组记录了各种大小的空闲内存块的信息。<br />include/linux/mmzone.h:<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Code_Closed_Image_105742" onclick="this.style.display='none'; Code_Closed_Text_105742.style.display='none'; Code_Open_Image_105742.style.display='inline'; Code_Open_Text_105742.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" />
				<img id="Code_Open_Image_105742" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_105742.style.display='none'; Code_Closed_Image_105742.style.display='inline'; Code_Closed_Text_105742.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" />
				<span id="Code_Closed_Text_105742" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
				</span>
				<span id="Code_Open_Text_105742" style="DISPLAY: none">
						<br />
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<img id="Codehighlighter1_0_294_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_294_Open_Text.style.display='none'; Codehighlighter1_0_294_Closed_Image.style.display='inline'; Codehighlighter1_0_294_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_0_294_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_294_Closed_Text.style.display='none'; Codehighlighter1_0_294_Open_Image.style.display='inline'; Codehighlighter1_0_294_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						<span id="Codehighlighter1_0_294_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
						<span id="Codehighlighter1_0_294_Open_Text">
								<span style="COLOR: #008000">/*</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * On machines where it is needed (eg PCs) we divide physical memory<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * into multiple physical zones. On a PC we have 3 zones:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> *<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * ZONE_DMA      &lt; 16 MB    ISA DMA capable memory<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * ZONE_NORMAL    16-896 MB    direct mapped by the kernel<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * ZONE_HIGHMEM     &gt; 896 MB    only page cache and user processes<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span>
								<span style="COLOR: #008000">*/</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_323_872_Open_Image" onclick="this.style.display='none'; Codehighlighter1_323_872_Open_Text.style.display='none'; Codehighlighter1_323_872_Closed_Image.style.display='inline'; Codehighlighter1_323_872_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
								<img id="Codehighlighter1_323_872_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_323_872_Closed_Text.style.display='none'; Codehighlighter1_323_872_Open_Image.style.display='inline'; Codehighlighter1_323_872_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />typedef </span>
						<span style="COLOR: #0000ff">struct</span>
						<span style="COLOR: #000000"> zone_struct </span>
						<span id="Codehighlighter1_323_872_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_323_872_Open_Text">
								<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_326_362_Open_Image" onclick="this.style.display='none'; Codehighlighter1_326_362_Open_Text.style.display='none'; Codehighlighter1_326_362_Closed_Image.style.display='inline'; Codehighlighter1_326_362_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_326_362_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_326_362_Closed_Text.style.display='none'; Codehighlighter1_326_362_Open_Image.style.display='inline'; Codehighlighter1_326_362_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_326_362_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
								<span id="Codehighlighter1_326_362_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * Commonly accessed fields:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    spinlock_t        </span>
								<span style="COLOR: #0000ff">lock</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span>
								<span style="COLOR: #0000ff">long</span>
								<span style="COLOR: #000000">        free_pages;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span>
								<span style="COLOR: #0000ff">long</span>
								<span style="COLOR: #000000">        pages_min, pages_low, pages_high;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">            need_balance;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_484_524_Open_Image" onclick="this.style.display='none'; Codehighlighter1_484_524_Open_Text.style.display='none'; Codehighlighter1_484_524_Closed_Image.style.display='inline'; Codehighlighter1_484_524_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_484_524_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_484_524_Closed_Text.style.display='none'; Codehighlighter1_484_524_Open_Image.style.display='inline'; Codehighlighter1_484_524_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_484_524_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
								<span id="Codehighlighter1_484_524_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * free areas of different sizes<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 数组中每个元素依次维护1个pagesize，2个pagesize，4个pagesize……的空闲块的链表</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    free_area_t        free_area[MAX_ORDER];  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_626_669_Open_Image" onclick="this.style.display='none'; Codehighlighter1_626_669_Open_Text.style.display='none'; Codehighlighter1_626_669_Closed_Image.style.display='inline'; Codehighlighter1_626_669_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_626_669_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_626_669_Closed_Text.style.display='none'; Codehighlighter1_626_669_Open_Image.style.display='inline'; Codehighlighter1_626_669_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_626_669_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
								<span id="Codehighlighter1_626_669_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * Discontig memory support fields.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">struct</span>
								<span style="COLOR: #000000"> pglist_data    </span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">zone_pgdat;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">struct</span>
								<span style="COLOR: #000000"> page        </span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">zone_mem_map;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span>
								<span style="COLOR: #0000ff">long</span>
								<span style="COLOR: #000000">        zone_start_paddr;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span>
								<span style="COLOR: #0000ff">long</span>
								<span style="COLOR: #000000">        zone_start_mapnr;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_803_833_Open_Image" onclick="this.style.display='none'; Codehighlighter1_803_833_Open_Text.style.display='none'; Codehighlighter1_803_833_Closed_Image.style.display='inline'; Codehighlighter1_803_833_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_803_833_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_803_833_Closed_Text.style.display='none'; Codehighlighter1_803_833_Open_Image.style.display='inline'; Codehighlighter1_803_833_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_803_833_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
								<span id="Codehighlighter1_803_833_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * rarely used fields:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">char</span>
								<span style="COLOR: #000000">            </span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">name;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span>
								<span style="COLOR: #0000ff">long</span>
								<span style="COLOR: #000000">        size;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> zone_t;</span>
				</span>
		</div>
		<br />free_area_struct {}<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_110231" onclick="this.style.display='none'; Code_Closed_Text_110231.style.display='none'; Code_Open_Image_110231.style.display='inline'; Code_Open_Text_110231.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_110231" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_110231.style.display='none'; Code_Closed_Image_110231.style.display='inline'; Code_Closed_Text_110231.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_110231" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_110231" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img id="Codehighlighter1_32_112_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_112_Open_Text.style.display='none'; Codehighlighter1_32_112_Closed_Image.style.display='inline'; Codehighlighter1_32_112_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_112_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_112_Closed_Text.style.display='none'; Codehighlighter1_32_112_Open_Image.style.display='inline'; Codehighlighter1_32_112_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000">typedef </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> free_area_struct </span><span id="Codehighlighter1_32_112_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_32_112_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> list_head    free_list;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">        </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">map;       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 某个特定大小的页面块分配情况的位图</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"> free_area_t;</span></span></div><br />页面分配时，找到适合大小的free_area_struct{}，然后从free_list中找有没有空闲的内存块，如果没有就找更大的free_area_struct{}，因为大小都是2^n，很容易把大块内存拆开，一块分配给请求，剩下的保存到对应大小的队列中。<br />页面回收时主要的问题是如何解决过多的内存碎片。当页面块被释放时，先检查是否有相同大小的相邻空闲块存在，如果有的话就结合起来（递归过程）。<img src ="http://www.blogjava.net/zellux/aggbug/182436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-27 23:29 <a href="http://www.blogjava.net/zellux/archive/2008/02/27/182436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Patching CVE-2008-0600, Local Root Exploit</title><link>http://www.blogjava.net/zellux/archive/2008/02/27/182572.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 27 Feb 2008 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/27/182572.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/182572.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/27/182572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/182572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/182572.html</trackback:ping><description><![CDATA[几天前的bug了，突然有兴趣想再试试<br /><a href="http://kerneltrap.org/Linux/Patching_CVE-2008-0600_Local_Root_Exploit"><br />http://kerneltrap.org/Linux/Patching_CVE-2008-0600_Local_Root_Exploit</a><img src ="http://www.blogjava.net/zellux/aggbug/182572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-27 23:15 <a href="http://www.blogjava.net/zellux/archive/2008/02/27/182572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]LKM Rootkits on Linux x86 v2.6</title><link>http://www.blogjava.net/zellux/archive/2008/02/26/182289.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 26 Feb 2008 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/26/182289.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/182289.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/26/182289.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/182289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/182289.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自水木KernelTech版。关于hack系统调用表的一篇文章，里面还涉及了上学期ICS Lab中的二进制代码注入，很好很强大。略作整理（为什么技术博客默认的字体不是等宽的 T.T）=-|================================================-{ www.enye-sec.org }-====|=-[ LKM Rootkits on Linux x86...&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2008/02/26/182289.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/182289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-26 19:36 <a href="http://www.blogjava.net/zellux/archive/2008/02/26/182289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>信号量使用例程 </title><link>http://www.blogjava.net/zellux/archive/2008/02/21/181074.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 21 Feb 2008 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/21/181074.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/181074.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/21/181074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/181074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/181074.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Unix - semaphore examplehttp://docs.linux.cz/programming/c/unix_examples/semab.htmlCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/**//* semabinit.c ...&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2008/02/21/181074.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/181074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-21 15:13 <a href="http://www.blogjava.net/zellux/archive/2008/02/21/181074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读核笔记(5) - 共享内存</title><link>http://www.blogjava.net/zellux/archive/2008/02/21/181046.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 21 Feb 2008 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/21/181046.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/181046.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/21/181046.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/181046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/181046.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ipc/shm.c:				sys_shmat 连接共享内存																																		Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->														...&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2008/02/21/181046.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/181046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-21 14:10 <a href="http://www.blogjava.net/zellux/archive/2008/02/21/181046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hacking the Kernel - 修改系统调用表</title><link>http://www.blogjava.net/zellux/archive/2008/02/19/180686.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 19 Feb 2008 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/19/180686.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/180686.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/19/180686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/180686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/180686.html</trackback:ping><description><![CDATA[昨天硬是没找到正确的sys_call_table的地址，原来我之前在虚拟机上装的ArchLinux是64位的。。<br />今天在真机上成功地修改了系统调用表。<br />测试环境：ArchLinux 2.6.24<br /><br />1. 2.4.20以后的内核出于安全考虑，没有导出sys_call_table符号，所以要先通过System.map找到sys_call_table的地址<br /><u>$ cat /boot/System.map26 | grep sys_call_table</u><br />c0375680 R sys_call_table<br />另外也可以用nm工具获得vmlinux中的所有符号<br /><u>$ nm /usr/src/linux-2.6.24-ARCH/vmlinux | grep sys_call_table</u><br />结果一样<br /><br />2. 以添加一个把uid改成root(0)为例，写一个内核模块：<br />addcall.c<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_145101" onclick="this.style.display='none'; Code_Closed_Text_145101.style.display='none'; Code_Open_Image_145101.style.display='inline'; Code_Open_Text_145101.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_145101" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_145101.style.display='none'; Code_Closed_Image_145101.style.display='inline'; Code_Closed_Text_145101.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_145101" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_145101" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">kernel.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">module.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">init.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">time.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">asm</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">uaccess.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sched.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> __NR_changeuid 238</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MODULE_DESCRIPTION(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Change uid to 0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />MODULE_AUTHOR(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ZelluX</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">saved) (</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">**</span><span style="COLOR: #000000"> sys_call_table </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0xc0375680</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />asmlinkage </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> sys_changeuid(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_372_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_372_507_Open_Text.style.display='none'; Codehighlighter1_372_507_Closed_Image.style.display='inline'; Codehighlighter1_372_507_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_372_507_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_372_507_Closed_Text.style.display='none'; Codehighlighter1_372_507_Open_Image.style.display='inline'; Codehighlighter1_372_507_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_372_507_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_372_507_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">uid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">euid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">suid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">fsuid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    printk(KERN_ALERT </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">uid has been changed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> __init init_addsyscall(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_543_741_Open_Image" onclick="this.style.display='none'; Codehighlighter1_543_741_Open_Text.style.display='none'; Codehighlighter1_543_741_Closed_Image.style.display='inline'; Codehighlighter1_543_741_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_543_741_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_543_741_Closed_Text.style.display='none'; Codehighlighter1_543_741_Open_Image.style.display='inline'; Codehighlighter1_543_741_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_543_741_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_543_741_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    saved </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) (</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)) (sys_call_table[__NR_changeuid]);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    sys_call_table[__NR_changeuid] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (unsigned </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">) sys_changeuid;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    printk(KERN_ALERT </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">the call has been added.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> __exit exit_addsyscall(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_778_892_Open_Image" onclick="this.style.display='none'; Codehighlighter1_778_892_Open_Text.style.display='none'; Codehighlighter1_778_892_Closed_Image.style.display='inline'; Codehighlighter1_778_892_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_778_892_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_778_892_Closed_Text.style.display='none'; Codehighlighter1_778_892_Open_Image.style.display='inline'; Codehighlighter1_778_892_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_778_892_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_778_892_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    sys_call_table[__NR_changeuid] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (unsigned </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">) saved;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    printk(KERN_ALERT </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">the call has been removed</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />module_init(init_addsyscall);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />module_exit(exit_addsyscall);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div><br />对应的Makefile：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_145203" onclick="this.style.display='none'; Code_Closed_Text_145203.style.display='none'; Code_Open_Image_145203.style.display='inline'; Code_Open_Text_145203.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_145203" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_145203.style.display='none'; Code_Closed_Image_145203.style.display='inline'; Code_Closed_Text_145203.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_145203" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_145203" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">ifneq ($(KERNELRELEASE)</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    obj-m :</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> addcall.o<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />else<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    KERNELDIR ?</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> /lib/modules/$(shell uname -r)/build<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    PWD  :</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> $(shell pwd)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />default:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        $(MAKE) -C $(KERNELDIR) M</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">$(PWD) modules<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />endif<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div><br />3. 使用insmod addcall.ko载入模块后，用dmesg可以看到the call has been added.<br />4. 测试程序<br />test.c<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_145325" onclick="this.style.display='none'; Code_Closed_Text_145325.style.display='none'; Code_Open_Image_145325.style.display='inline'; Code_Open_Text_145325.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_145325" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_145325.style.display='none'; Code_Closed_Image_145325.style.display='inline'; Code_Closed_Text_145325.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_145325" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_145325" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> __NR_changeuid 238</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br /><img id="Codehighlighter1_85_245_Open_Image" onclick="this.style.display='none'; Codehighlighter1_85_245_Open_Text.style.display='none'; Codehighlighter1_85_245_Closed_Image.style.display='inline'; Codehighlighter1_85_245_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_85_245_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_85_245_Closed_Text.style.display='none'; Codehighlighter1_85_245_Open_Image.style.display='inline'; Codehighlighter1_85_245_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_85_245_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_85_245_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Previous uid = %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, syscall(__NR_getuid));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    syscall(__NR_changeuid);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Current uid = %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, syscall(__NR_getuid));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span></span></div><br />使用gcc -o test test.c编译<br /><br />5. 运行./test，即可看到类似的成功信息：<br />Previous uid = 1002<br />Current uid = 0<br /><br />6. 卸载模块rmmod addcall，此时再次运行./test就会失败<img src ="http://www.blogjava.net/zellux/aggbug/180686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-19 14:55 <a href="http://www.blogjava.net/zellux/archive/2008/02/19/180686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读核笔记(4) - 共享内存</title><link>http://www.blogjava.net/zellux/archive/2008/02/19/180612.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 19 Feb 2008 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/19/180612.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/180612.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/19/180612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/180612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/180612.html</trackback:ping><description><![CDATA[《边干边学》上一个简单的共享内存的例程：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_110509" onclick="this.style.display='none'; Code_Closed_Text_110509.style.display='none'; Code_Open_Image_110509.style.display='inline'; Code_Open_Text_110509.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_110509" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_110509.style.display='none'; Code_Closed_Image_110509.style.display='inline'; Code_Closed_Text_110509.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_110509" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_110509" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ipc.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">shm.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">errno.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> KEY 1234</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> SIZE 1024</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br /><img id="Codehighlighter1_168_1479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_1479_Open_Text.style.display='none'; Codehighlighter1_168_1479_Closed_Image.style.display='inline'; Codehighlighter1_168_1479_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_168_1479_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_168_1479_Closed_Text.style.display='none'; Codehighlighter1_168_1479_Open_Image.style.display='inline'; Codehighlighter1_168_1479_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_168_1479_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_168_1479_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> shmid;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">shmaddr;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> shmid_ds buf;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    shmid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> shmget(KEY, SIZE, IPC_CREAT </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0600</span><span style="COLOR: #000000">);<br /><img id="Codehighlighter1_300_400_Open_Image" onclick="this.style.display='none'; Codehighlighter1_300_400_Open_Text.style.display='none'; Codehighlighter1_300_400_Closed_Image.style.display='inline'; Codehighlighter1_300_400_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_300_400_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_300_400_Closed_Text.style.display='none'; Codehighlighter1_300_400_Open_Image.style.display='inline'; Codehighlighter1_300_400_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (shmid </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_300_400_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_300_400_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed in creating shared memory: %s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, strerror(errno));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_424_752_Open_Image" onclick="this.style.display='none'; Codehighlighter1_424_752_Open_Text.style.display='none'; Codehighlighter1_424_752_Closed_Image.style.display='inline'; Codehighlighter1_424_752_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_424_752_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_424_752_Closed_Text.style.display='none'; Codehighlighter1_424_752_Open_Image.style.display='inline'; Codehighlighter1_424_752_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (fork() </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_424_752_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_424_752_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        shmaddr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) shmat(shmid, NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_513_634_Open_Image" onclick="this.style.display='none'; Codehighlighter1_513_634_Open_Text.style.display='none'; Codehighlighter1_513_634_Closed_Image.style.display='inline'; Codehighlighter1_513_634_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_513_634_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_513_634_Closed_Text.style.display='none'; Codehighlighter1_513_634_Open_Image.style.display='inline'; Codehighlighter1_513_634_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (shmaddr </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_513_634_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_513_634_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed in connecting to the shared memory: %s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, strerror(errno));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        strcpy(shmaddr, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello, this is child process!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        shmdt(shmaddr);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_759_1477_Open_Image" onclick="this.style.display='none'; Codehighlighter1_759_1477_Open_Text.style.display='none'; Codehighlighter1_759_1477_Closed_Image.style.display='inline'; Codehighlighter1_759_1477_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_759_1477_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_759_1477_Closed_Text.style.display='none'; Codehighlighter1_759_1477_Open_Image.style.display='inline'; Codehighlighter1_759_1477_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_759_1477_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_759_1477_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        sleep(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        shmctl(shmid, IPC_STAT, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">buf);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Size of the shared memory: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">shm_segsz = %d bytes\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, buf.shm_segsz);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Process id of the creator: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">shm_cpid = %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, buf.shm_cpid);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Process id of the last operator: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">shm_lpid = %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, buf.shm_lpid);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        shmaddr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) shmat(shmid, NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1220_1338_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1220_1338_Open_Text.style.display='none'; Codehighlighter1_1220_1338_Closed_Image.style.display='inline'; Codehighlighter1_1220_1338_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1220_1338_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1220_1338_Closed_Text.style.display='none'; Codehighlighter1_1220_1338_Open_Image.style.display='inline'; Codehighlighter1_1220_1338_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (shmaddr </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_1220_1338_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1220_1338_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed in connecting the shared memory: %s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, strerror(errno));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The content of the shared memory: %s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, shmaddr);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        shmdt(shmaddr);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        shmctl(shmid, IPC_RMID, NULL);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div>主要的API：<br />shmget 创建一块共享内存<br />shmat 将一块已经存在的共享内存映射到一个进程的地址空间<br />shmdt 取消一个进程的地址空间中的一块共享块的映射<br />shmctl 管理共享内存，和ioctl的风格很像<br /><br />每一个新创建的共享都由一个shmid_ds{}表示。struct shmid_ds在linux/shm.h中的定义：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_112420" onclick="this.style.display='none'; Code_Closed_Text_112420.style.display='none'; Code_Open_Image_112420.style.display='inline'; Code_Open_Text_112420.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_112420" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_112420.style.display='none'; Code_Closed_Image_112420.style.display='inline'; Code_Closed_Text_112420.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_112420" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_112420" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img id="Codehighlighter1_0_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_71_Open_Text.style.display='none'; Codehighlighter1_0_71_Closed_Image.style.display='inline'; Codehighlighter1_0_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_71_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_71_Closed_Text.style.display='none'; Codehighlighter1_0_71_Open_Image.style.display='inline'; Codehighlighter1_0_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_71_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_71_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Obsolete, used only for backwards compatibility and libc5 compiles </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_89_647_Open_Image" onclick="this.style.display='none'; Codehighlighter1_89_647_Open_Text.style.display='none'; Codehighlighter1_89_647_Closed_Image.style.display='inline'; Codehighlighter1_89_647_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_89_647_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_647_Closed_Text.style.display='none'; Codehighlighter1_89_647_Open_Image.style.display='inline'; Codehighlighter1_89_647_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> shmid_ds </span><span id="Codehighlighter1_89_647_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_89_647_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_119_139_Open_Image" onclick="this.style.display='none'; Codehighlighter1_119_139_Open_Text.style.display='none'; Codehighlighter1_119_139_Closed_Image.style.display='inline'; Codehighlighter1_119_139_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_119_139_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_119_139_Closed_Text.style.display='none'; Codehighlighter1_119_139_Open_Image.style.display='inline'; Codehighlighter1_119_139_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> ipc_perm        shm_perm;    </span><span id="Codehighlighter1_119_139_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_119_139_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> operation perms </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_159_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_159_187_Open_Text.style.display='none'; Codehighlighter1_159_187_Closed_Image.style.display='inline'; Codehighlighter1_159_187_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_159_187_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_159_187_Closed_Text.style.display='none'; Codehighlighter1_159_187_Open_Image.style.display='inline'; Codehighlighter1_159_187_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">            shm_segsz;    </span><span id="Codehighlighter1_159_187_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_159_187_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> size of segment (bytes) </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_218_239_Open_Image" onclick="this.style.display='none'; Codehighlighter1_218_239_Open_Text.style.display='none'; Codehighlighter1_218_239_Closed_Image.style.display='inline'; Codehighlighter1_218_239_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_218_239_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_218_239_Closed_Text.style.display='none'; Codehighlighter1_218_239_Open_Image.style.display='inline'; Codehighlighter1_218_239_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    __kernel_time_t        shm_atime;    </span><span id="Codehighlighter1_218_239_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_218_239_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> last attach time </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_270_291_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_291_Open_Text.style.display='none'; Codehighlighter1_270_291_Closed_Image.style.display='inline'; Codehighlighter1_270_291_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_270_291_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_270_291_Closed_Text.style.display='none'; Codehighlighter1_270_291_Open_Image.style.display='inline'; Codehighlighter1_270_291_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    __kernel_time_t        shm_dtime;    </span><span id="Codehighlighter1_270_291_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_270_291_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> last detach time </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_322_343_Open_Image" onclick="this.style.display='none'; Codehighlighter1_322_343_Open_Text.style.display='none'; Codehighlighter1_322_343_Closed_Image.style.display='inline'; Codehighlighter1_322_343_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_322_343_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_322_343_Closed_Text.style.display='none'; Codehighlighter1_322_343_Open_Image.style.display='inline'; Codehighlighter1_322_343_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    __kernel_time_t        shm_ctime;    </span><span id="Codehighlighter1_322_343_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_322_343_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> last change time </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_375_394_Open_Image" onclick="this.style.display='none'; Codehighlighter1_375_394_Open_Text.style.display='none'; Codehighlighter1_375_394_Closed_Image.style.display='inline'; Codehighlighter1_375_394_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_375_394_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_375_394_Closed_Text.style.display='none'; Codehighlighter1_375_394_Open_Image.style.display='inline'; Codehighlighter1_375_394_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    __kernel_ipc_pid_t    shm_cpid;    </span><span id="Codehighlighter1_375_394_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_375_394_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> pid of creator </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_426_451_Open_Image" onclick="this.style.display='none'; Codehighlighter1_426_451_Open_Text.style.display='none'; Codehighlighter1_426_451_Closed_Image.style.display='inline'; Codehighlighter1_426_451_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_426_451_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_426_451_Closed_Text.style.display='none'; Codehighlighter1_426_451_Open_Image.style.display='inline'; Codehighlighter1_426_451_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    __kernel_ipc_pid_t    shm_lpid;    </span><span id="Codehighlighter1_426_451_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_426_451_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> pid of last operator </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_482_510_Open_Image" onclick="this.style.display='none'; Codehighlighter1_482_510_Open_Text.style.display='none'; Codehighlighter1_482_510_Closed_Image.style.display='inline'; Codehighlighter1_482_510_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_482_510_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_482_510_Closed_Text.style.display='none'; Codehighlighter1_482_510_Open_Image.style.display='inline'; Codehighlighter1_482_510_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">        shm_nattch;    </span><span id="Codehighlighter1_482_510_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_482_510_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> no. of current attaches </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_542_560_Open_Image" onclick="this.style.display='none'; Codehighlighter1_542_560_Open_Text.style.display='none'; Codehighlighter1_542_560_Closed_Image.style.display='inline'; Codehighlighter1_542_560_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_542_560_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_542_560_Closed_Text.style.display='none'; Codehighlighter1_542_560_Open_Image.style.display='inline'; Codehighlighter1_542_560_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">         shm_unused;    </span><span id="Codehighlighter1_542_560_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_542_560_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> compatibility </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_585_610_Open_Image" onclick="this.style.display='none'; Codehighlighter1_585_610_Open_Text.style.display='none'; Codehighlighter1_585_610_Closed_Image.style.display='inline'; Codehighlighter1_585_610_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_585_610_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_585_610_Closed_Text.style.display='none'; Codehighlighter1_585_610_Open_Image.style.display='inline'; Codehighlighter1_585_610_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">             </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">shm_unused2;    </span><span id="Codehighlighter1_585_610_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_585_610_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> ditto - used by DIPC </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_634_645_Open_Image" onclick="this.style.display='none'; Codehighlighter1_634_645_Open_Text.style.display='none'; Codehighlighter1_634_645_Closed_Image.style.display='inline'; Codehighlighter1_634_645_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_634_645_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_634_645_Closed_Text.style.display='none'; Codehighlighter1_634_645_Open_Image.style.display='inline'; Codehighlighter1_634_645_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">            </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">shm_unused3;    </span><span id="Codehighlighter1_634_645_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_634_645_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> unused </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;</span></span></div><br />其中存放权限信息的ipc_perm{}的定义为：<br />include/linux/ipc.h<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_112730" onclick="this.style.display='none'; Code_Closed_Text_112730.style.display='none'; Code_Open_Image_112730.style.display='inline'; Code_Open_Text_112730.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_112730" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_112730.style.display='none'; Code_Closed_Image_112730.style.display='inline'; Code_Closed_Text_112730.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_112730" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_112730" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img id="Codehighlighter1_0_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_71_Open_Text.style.display='none'; Codehighlighter1_0_71_Closed_Image.style.display='inline'; Codehighlighter1_0_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_71_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_71_Closed_Text.style.display='none'; Codehighlighter1_0_71_Open_Image.style.display='inline'; Codehighlighter1_0_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_71_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_71_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> Obsolete, used only for backwards compatibility and libc5 compiles </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> ipc_perm<br /><img id="Codehighlighter1_89_243_Open_Image" onclick="this.style.display='none'; Codehighlighter1_89_243_Open_Text.style.display='none'; Codehighlighter1_89_243_Closed_Image.style.display='inline'; Codehighlighter1_89_243_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_89_243_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_243_Closed_Text.style.display='none'; Codehighlighter1_89_243_Open_Image.style.display='inline'; Codehighlighter1_89_243_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_89_243_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_89_243_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    __kernel_key_t    key;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    __kernel_uid_t    uid;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    __kernel_gid_t    gid;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    __kernel_uid_t    cuid;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    __kernel_gid_t    cgid;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    __kernel_mode_t    mode; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">    seq;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;</span></span></div><p>mode为该共享的内存的读写权限，和chmod的参数有点像。mode低九位定义了访问许可，解释如下：<br />0400 用户可读  0200用户可写  0040 组成员可读  0020 组成员可写  0004 其他用户可读  0002 其他用户可写<br />没有执行位 0100 0010 和 0001</p><p> </p><img src ="http://www.blogjava.net/zellux/aggbug/180612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-19 11:30 <a href="http://www.blogjava.net/zellux/archive/2008/02/19/180612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读核笔记(3) - 系统调用</title><link>http://www.blogjava.net/zellux/archive/2008/02/18/180462.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 18 Feb 2008 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/18/180462.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/180462.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/18/180462.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/180462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/180462.html</trackback:ping><description><![CDATA[
		<strong>_syscall 宏：<br /></strong>最简单的没有参数的系统调用的实现：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_0_67_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_67_Open_Text.style.display='none'; Codehighlighter1_0_67_Closed_Image.style.display='inline'; Codehighlighter1_0_67_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_67_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_67_Closed_Text.style.display='none'; Codehighlighter1_0_67_Open_Image.style.display='inline'; Codehighlighter1_0_67_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_67_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_67_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> _syscall0(type,name) \</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />type name(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">) \<br /><img id="Codehighlighter1_120_251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_120_251_Open_Text.style.display='none'; Codehighlighter1_120_251_Closed_Image.style.display='inline'; Codehighlighter1_120_251_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_120_251_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_120_251_Closed_Text.style.display='none'; Codehighlighter1_120_251_Open_Image.style.display='inline'; Codehighlighter1_120_251_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_120_251_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_120_251_Open_Text"><span style="COLOR: #000000">{ \<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> __res; \<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />__asm__ </span><span style="COLOR: #0000ff">volatile</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">int $0x80</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> \<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    : </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">=a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> (__res) \<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    : </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> (__NR_##name)); \<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />__syscall_return(type,__res); \<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>以getuid()为例，_syscall0(int, getuid)展开后就变成<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> getuid(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_17_178_Open_Image" onclick="this.style.display='none'; Codehighlighter1_17_178_Open_Text.style.display='none'; Codehighlighter1_17_178_Closed_Image.style.display='inline'; Codehighlighter1_17_178_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_17_178_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_17_178_Closed_Text.style.display='none'; Codehighlighter1_17_178_Open_Image.style.display='inline'; Codehighlighter1_17_178_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_17_178_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_17_178_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> __res;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    __asm__ </span><span style="COLOR: #0000ff">volatile</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">int $0x80</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    :</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">=a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> (__res)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    :</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  (__NR_getuid));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    __syscall_return(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">, __res);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>程序把系统调用号__NR_getuid放入eax寄存器，然后调用软中断。<br />include/asm-i386/hw_irq.h中的定义：<br /><u>00025   #define SYSCALL_VECTOR  0x80;<br /><br /></u>arch/i386/kernel/traps.c中把该中断号绑定到system_call函数：<br /><u>00944   set_system_gate(SYSCALL_VECTOR,&amp;system_call);<br /></u><br />system_call函数在arch/i386/kernel/entry.S中：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><strong><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></strong><span style="COLOR: #000000">ENTRY(system_call)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    pushl %eax            # save orig_eax<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    SAVE_ALL<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    GET_CURRENT(%ebx)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    testb $0x02</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">tsk_ptrace(%ebx)    # PT_TRACESYS<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    jne tracesys<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    cmpl $(NR_syscalls)</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">%eax<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    jae badsys<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    call *SYMBOL_NAME(sys_call_table)(</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">%eax</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    movl %eax</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">EAX(%esp)        # save the return value<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ENTRY(ret_from_sys_call)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    cli                # need_resched and signals atomic test<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    cmpl $</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">need_resched(%ebx)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    jne reschedule<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    cmpl $</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">sigpending(%ebx)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    jne signal_return<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />restore_all:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    RESTORE_ALL</span></div>主要步骤：<br />1. 保留一份系统调用号的最初拷贝<br />2. 保存堆栈环境(SAVE_ALL)<br />3. 得到当前task_struct的地址，保存到ebx中<br />4. 检查系统调用号<br />5. 根据%eax调用号计算地址，调用相应函数<br />6. 在entry.S后面可以看到，<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">.data<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ENTRY(sys_call_table)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    .long SYMBOL_NAME(sys_ni_syscall)    /* </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">  -  old </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">setup()</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> system call*/<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    .long SYMBOL_NAME(sys_getuid16)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    .long SYMBOL_NAME(sys_stime)        /* </span><span style="COLOR: #000000">25</span><span style="COLOR: #000000"> */<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    .long SYMBOL_NAME(sys_ptrace)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <img src="http://www.blogjava.net/images/dot.gif" /></span></div>sys_call_table + %eax * 4是sys_getuid16地址，kernel/uid16.c中： 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />asmlinkage </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> sys_getuid16(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_36_73_Open_Image" onclick="this.style.display='none'; Codehighlighter1_36_73_Open_Text.style.display='none'; Codehighlighter1_36_73_Closed_Image.style.display='inline'; Codehighlighter1_36_73_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_36_73_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_73_Closed_Text.style.display='none'; Codehighlighter1_36_73_Open_Image.style.display='inline'; Codehighlighter1_36_73_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_36_73_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_36_73_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> high2lowuid(current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">uid);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>很简单的处理代码，返回当前进程的uid。这里asmlinkage修饰符表示函数必须从堆栈中，而不是从寄存器中拿参数（防止gcc用寄存器传参优化）。<br />7. 保存返回值eax到堆栈中的eax<br />8. RESTORE_ALL<br /><br />另外这里再提一下GET_CURRENT的实现<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#define GET_CURRENT(reg) \<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    movl $-</span><span style="COLOR: #000000">8192</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> reg</span><span style="COLOR: #008000">;</span><span style="COLOR: #008000"> \</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    andl %esp</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> reg</span></div>很巧妙的实现，把栈指针与掩码-8192做与操作，末尾13位清零，就是当前的进程的task_struct地址了。<br /><br /><br />接下来是利用内核模块动态添加一个系统调用的例程，由于2.4.20以后sys_call_table符号不再被导出了，要获得这个地址得手动hack。尚未成功，下次回过头来看看。<img src ="http://www.blogjava.net/zellux/aggbug/180462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-18 14:35 <a href="http://www.blogjava.net/zellux/archive/2008/02/18/180462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读核笔记(2) - 内核模块</title><link>http://www.blogjava.net/zellux/archive/2008/02/10/179568.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 10 Feb 2008 10:53:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/10/179568.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/179568.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/10/179568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/179568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/179568.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: /proc文件系统不是直接从内核的存储区中读写数据，二是通过回调函数实现文件读写的。struct proc_dir_entry有一对读写操作函数指针read_proc_t, write_proc_t。一个编写内核模块操作proc文件系统的例子，书上的源程序是在2.4.18下跑起来的，改了三个地方在2.6.23下成功运行。当然Makefile也按照2.6中make modules的方式写了。...&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2008/02/10/179568.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/179568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-10 18:53 <a href="http://www.blogjava.net/zellux/archive/2008/02/10/179568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux2.6内核驱动与2.4的区别--Linux2.6内核驱动移植参考[zz]</title><link>http://www.blogjava.net/zellux/archive/2008/02/10/179561.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 10 Feb 2008 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/10/179561.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/179561.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/10/179561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/179561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/179561.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>作者：晏渭川 <br />
随着Linux2.6的发布，由于2.6内核做了新的改动，各个设备的驱动程序在不同程度上要进行改写。为了方便各位Linux爱好者我把自己整理的这分 文档share出来。该文当列举了2.6内核同以前版本的绝大多数变化，可惜的是由于时间和精力有限没有详细列出各个函数的用法。</p>
<p>1、 使用新的入口 <br />
必须包含 &lt;linux/init.h&gt; <br />
module_init(your_init_func); <br />
module_exit(your_exit_func); <br />
老版本：int init_module(void); <br />
void cleanup_module(voi); <br />
2.4中两种都可以用，对如后面的入口函数不必要显示包含任何头文件。</p>
<p>2、 GPL <br />
MODULE_LICENSE("Dual BSD/GPL"); <br />
老版本：MODULE_LICENSE("GPL");</p>
<p>3、 模块参数 <br />
必须显式包含&lt;linux/moduleparam.h&gt; <br />
module_param(name, type, perm); <br />
module_param_named(name, value, type, perm); <br />
参数定义 <br />
module_param_string(name, string, len, perm); <br />
module_param_array(name, type, num, perm); <br />
老版本：MODULE_PARM(variable,type); <br />
MODULE_PARM_DESC(variable,type);</p>
<p>4、 模块别名 <br />
MODULE_ALIAS("alias-name"); <br />
这是新增的，在老版本中需在/etc/modules.conf配置，现在在代码中就可以实现。</p>
<p>5、 模块计数 <br />
int try_module_get(&amp;module); <br />
module_put(); <br />
老版本：MOD_INC_USE_COUNT 和 MOD_DEC_USE_COUNT <br />
<br />
<a href="http://www.fsl.cs.sunysb.edu/%7Esean/parser.cgi?modules">http://www.fsl.cs.sunysb.edu/~sean/parser.cgi?modules</a> <br />
<br />
In 2.4 modules, the MOD_INC_USE_COUNT macro is used to prevent unloading of the module while there is an open file. The 2.6 kernel, however, knows not to unload a module that owns a character device that's currently open.<br />
However, this requires that the module be explicit in specifying ownership of character devices, using the THIS_MODULE macro.</p>
<p>You also have to take out all calls to MOD_INC_USE_COUNT and MOD_DEC_USE_COUNT.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; static struct file_operations fops =<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .owner = THIS_MODULE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .read = device_read,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .write = device_write,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .open = device_open,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .release = device_release<br />
}&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>The 2.6 kernel considers modules that use the deprecated facility to be unsafe, and does not permit their unloading, even with rmmod -f.</p>
<p>2.6,2.5的kbuild不需要到处加上MOD_INC_USE_COUNT来消除模块卸载竞争（module unload race）</p>
<p>6、 符号导出 <br />
只有显示的导出符号才能被其他模块使用，默认不导出所有的符号，不必使用EXPORT_NO_SYMBOLS <br />
老板本：默认导出所有的符号，除非使用EXPORT_NO_SYMBOLS</p>
<p>7、 内核版本检查 <br />
需要在多个文件中包含&lt;linux/module.h&gt;时，不必定义__NO_VERSION__ <br />
老版本：在多个文件中包含&lt;linux/module.h&gt;时，除在主文件外的其他文件中必须定义__NO_VERSION__，防止版本重复定义。</p>
<p>8、 设备号 <br />
kdev_t被废除不可用，新的dev_t拓展到了32位，12位主设备号，20位次设备号。 <br />
unsigned int iminor(struct inode *inode); <br />
unsigned int imajor(struct inode *inode); <br />
老版本：8位主设备号，8位次设备号 <br />
int MAJOR(kdev_t dev); <br />
int MINOR(kdev_t dev);</p>
<p>9、 内存分配头文件变更 <br />
所有的内存分配函数包含在头文件&lt;linux/slab.h&gt;，而原来的&lt;linux/malloc.h&gt;不存在 <br />
老版本：内存分配函数包含在头文件&lt;linux/malloc.h&gt;</p>
<p>10、 结构体的初试化 <br />
gcc开始采用ANSI C的struct结构体的初始化形式： <br />
static struct some_structure = { <br />
.field1 = value, <br />
.field2 = value, <br />
.. <br />
}; <br />
老版本：非标准的初试化形式 <br />
static struct some_structure = { <br />
field1: value, <br />
field2: value, <br />
.. <br />
};</p>
<p>11、 用户模式帮助器 <br />
int call_usermodehelper(char *path, char **argv, char **envp, int wait); <br />
新增wait参数</p>
<p>12、 request_module() <br />
request_module("foo-device-%d", number); <br />
老版本： <br />
char module_name[32]; <br />
printf(module_name, "foo-device-%d", number); <br />
request_module(module_name);</p>
<p>13、 dev_t引发的字符设备的变化 <br />
1、取主次设备号为 <br />
unsigned iminor(struct inode *inode); <br />
unsigned imajor(struct inode *inode); <br />
2、老的register_chrdev()用法没变，保持向后兼容，但不能访问设备号大于256的设备。 <br />
3、新的接口为 <br />
a)注册字符设备范围 <br />
int register_chrdev_region(dev_t from, unsigned count, char *name); <br />
b)动态申请主设备号 <br />
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, char *name); <br />
看了这两个函数郁闷吧^_^！怎么和file_operations结构联系起来啊？别急！ <br />
c)包含 &lt;linux/cdev.h&gt;，利用struct cdev和file_operations连接 <br />
struct cdev *cdev_alloc(void); <br />
void cdev_init(struct cdev *cdev, struct file_operations *fops); <br />
int cdev_add(struct cdev *cdev, dev_t dev, unsigned count); <br />
（分别为，申请cdev结构，和fops连接，将设备加入到系统中！好复杂啊！） <br />
d)void cdev_del(struct 