﻿<?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 cdev *cdev); <br />
只有在cdev_add执行成功才可运行。 <br />
e)辅助函数 <br />
kobject_put(&amp;cdev-&gt;kobj); <br />
struct kobject *cdev_get(struct cdev *cdev); <br />
void cdev_put(struct cdev *cdev); <br />
这一部分变化和新增的/sys/dev有一定的关联。</p>
<p>14、 新增对/proc的访问操作 <br />
&lt;linux/seq_file.h&gt; <br />
以前的/proc中只能得到string, seq_file操作能得到如long等多种数据。 <br />
相关函数： <br />
static struct seq_operations 必须实现这个类似file_operations得数据中得各个成员函数。 <br />
seq_printf()； <br />
int seq_putc(struct seq_file *m, char c); <br />
int seq_puts(struct seq_file *m, const char *s); <br />
int seq_escape(struct seq_file *m, const char *s, const char *esc); <br />
int seq_path(struct seq_file *m, struct vfsmount *mnt, <br />
struct dentry *dentry, char *esc); <br />
seq_open(file, &amp;ct_seq_ops); <br />
等等</p>
<p>15、 底层内存分配 <br />
1、&lt;linux/malloc.h&gt;头文件改为&lt;linux/slab.h&gt; <br />
2、分配标志GFP_BUFFER被取消，取而代之的是GFP_NOIO 和 GFP_NOFS <br />
3、新增__GFP_REPEAT，__GFP_NOFAIL，__GFP_NORETRY分配标志 <br />
4、页面分配函数alloc_pages()，get_free_page()被包含在&lt;linux/gfp.h&gt;中 <br />
5、对NUMA系统新增了几个函数： <br />
a) struct page *alloc_pages_node(int node_id, unsigned int gfp_mask, unsigned int order); <br />
b) void free_hot_page(struct page *page); <br />
c) void free_cold_page(struct page *page); <br />
6、 新增Memory pools <br />
&lt;linux/mempool.h&gt; <br />
mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data); <br />
void *mempool_alloc(mempool_t *pool, int gfp_mask); <br />
void mempool_free(void *element, mempool_t *pool); <br />
int mempool_resize(mempool_t *pool, int new_min_nr, int gfp_mask);</p>
<p>16、 per-CPU变量 <br />
get_cpu_var(); <br />
put_cpu_var(); <br />
void *alloc_percpu(type); <br />
void free_percpu(const void *); <br />
per_cpu_ptr(void *ptr, int cpu) <br />
get_cpu_ptr(ptr) <br />
put_cpu_ptr(ptr) <br />
老版本使用 <br />
DEFINE_PER_CPU(type, name); <br />
EXPORT_PER_CPU_SYMBOL(name); <br />
EXPORT_PER_CPU_SYMBOL_GPL(name); <br />
DECLARE_PER_CPU(type, name); <br />
DEFINE_PER_CPU(int, mypcint); <br />
2.6内核采用了可剥夺得调度方式这些宏都不安全。</p>
<p>17、 内核时间变化 <br />
1、现在的各个平台的HZ为 <br />
Alpha: 1024/1200; ARM: 100/128/200/1000; CRIS: 100; i386: 1000; IA-64: 1024; M68K: 100; M68K-nommu: 50-1000; MIPS: 100/128/1000; MIPS64: 100; PA-RISC: 100/1000; PowerPC32: 100; PowerPC64: 1000; S/390: 100; SPARC32: 100; SPARC64: 100; SuperH: 100/1000; UML: 100; v850: 24-100; x86-64: 1000. <br />
2、由于HZ的变化，原来的jiffies计数器很快就溢出了，引入了新的计数器jiffies_64 <br />
3、#include &lt;linux/jiffies.h&gt; <br />
u64 my_time = get_jiffies_64(); <br />
4、新的时间结构增加了纳秒成员变量 <br />
struct timespec current_kernel_time(void); <br />
5、他的timer函数没变，新增 <br />
void add_timer_on(struct timer_list *timer, int cpu); <br />
6、新增纳秒级延时函数 <br />
ndelay()； <br />
7、POSIX clocks 参考kernel/posix-timers.c</p>
<p>18、 工作队列（workqueue） <br />
1、任务队列（task queue ）接口函数都被取消，新增了workqueue接口函数 <br />
struct workqueue_struct *create_workqueue(const char *name); <br />
DECLARE_WORK(name, void (*function)(void *), void *data); <br />
INIT_WORK(struct work_struct *work, <br />
void (*function)(void *), void *data); <br />
PREPARE_WORK(struct work_struct *work, <br />
void (*function)(void *), void *data); <br />
2、申明struct work_struct结构 <br />
int queue_work(struct workqueue_struct *queue, struct work_struct *work); <br />
int queue_delayed_work(struct workqueue_struct *queue, struct work_struct *work, <br />
unsigned long delay); <br />
int cancel_delayed_work(struct work_struct *work); <br />
void flush_workqueue(struct workqueue_struct *queue); <br />
void destroy_workqueue(struct workqueue_struct *queue); <br />
int schedule_work(struct work_struct *work); <br />
int schedule_delayed_work(struct work_struct *work, unsigned long delay);</p>
<p>19、 新增创建VFS的"libfs" <br />
libfs给创建一个新的文件系统提供了大量的API. <br />
主要是对struct file_system_type的实现。 <br />
参考源代码： <br />
drivers/hotplug/pci_hotplug_core.c <br />
drivers/usb/core/inode.c <br />
drivers/oprofile/oprofilefs.c <br />
fs/ramfs/inode.c <br />
fs/nfsd/nfsctl.c (simple_fill_super() example)</p>
<p>20、 DMA的变化 <br />
未变化的有： <br />
void *pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma_handle); <br />
void pci_free_consistent(struct pci_dev *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle); <br />
变化的有： <br />
1、 void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag); <br />
void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle); <br />
2、列举了映射方向： <br />
enum dma_data_direction { <br />
DMA_BIDIRECTIONAL = 0, <br />
DMA_TO_DEVICE = 1, <br />
DMA_FROM_DEVICE = 2, <br />
DMA_NONE = 3, <br />
}; <br />
3、单映射 <br />
dma_addr_t dma_map_single(struct device *dev, void *addr, size_t size, enum dma_data_direction direction); <br />
void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction direction); <br />
4、页面映射 <br />
dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction direction); <br />
void dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction direction); <br />
5、有关scatter/gather的函数： <br />
int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction); <br />
void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, enum dma_data_direction direction); <br />
6、非一致性映射（Noncoherent DMA mappings） <br />
void *dma_alloc_noncoherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag); <br />
void dma_sync_single_range(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, <br />
enum dma_data_direction direction); <br />
void dma_free_noncoherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle); <br />
7、DAC (double address cycle) <br />
int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask); <br />
void pci_dac_dma_sync_single(struct pci_dev *dev, dma64_addr_t dma_addr, size_t len, int direction);</p>
<p>21、 互斥 <br />
新增seqlock主要用于： <br />
1、少量的数据保护 <br />
2、数据比较简单(没有指针)，并且使用频率很高 <br />
3、对不产生任何副作用的数据的访问 <br />
4、访问时写者不被饿死 <br />
&lt;linux/seqlock.h&gt; <br />
初始化 <br />
seqlock_t lock1 = SEQLOCK_UNLOCKED; <br />
或seqlock_t lock2; seqlock_init(&amp;lock2); <br />
void write_seqlock(seqlock_t *sl); <br />
void write_sequnlock(seqlock_t *sl); <br />
int write_tryseqlock(seqlock_t *sl); <br />
void write_seqlock_irqsave(seqlock_t *sl, long flags); <br />
void write_sequnlock_irqrestore(seqlock_t *sl, long flags); <br />
void write_seqlock_irq(seqlock_t *sl); <br />
void write_sequnlock_irq(seqlock_t *sl); <br />
void write_seqlock_bh(seqlock_t *sl); <br />
void write_sequnlock_bh(seqlock_t *sl); <br />
unsigned int read_seqbegin(seqlock_t *sl); <br />
int read_seqretry(seqlock_t *sl, unsigned int iv); <br />
unsigned int read_seqbegin_irqsave(seqlock_t *sl, long flags); <br />
int read_seqretry_irqrestore(seqlock_t *sl, unsigned int iv, long flags);</p>
<p>22、 内核可剥夺 <br />
&lt;linux/preempt.h&gt; <br />
preempt_disable()； <br />
preempt_enable_no_resched()； <br />
preempt_enable_noresched()； <br />
preempt_check_resched()；</p>
<p>23、 眠和唤醒 <br />
1、原来的函数可用，新增下列函数： <br />
prepare_to_wait_exclusive()； <br />
prepare_to_wait()； <br />
2、等待队列的变化 <br />
typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync); <br />
void init_waitqueue_func_entry(wait_queue_t *queue, wait_queue_func_t func);</p>
<p>24、 新增完成事件（completion events） <br />
&lt;linux/completion.h&gt; <br />
init_completion(&amp;my_comp); <br />
void wait_for_completion(struct completion *comp); <br />
void complete(struct completion *comp); <br />
void complete_all(struct completion *comp);</p>
<p>25、 RCU（Read-copy-update） <br />
rcu_read_lock(); <br />
void call_rcu(struct rcu_head *head, void (*func)(void *arg), <br />
void *arg);</p>
<p>26、 中断处理 <br />
1、中断处理有返回值了。 <br />
IRQ_RETVAL(handled)； <br />
2、cli(), sti(), save_flags(), 和 restore_flags()不再有效，应该使用local_save <br />
_flags() 或local_irq_disable()。 <br />
3、synchronize_irq()函数有改动 <br />
4、新增int can_request_irq(unsigned int irq, unsigned long flags); <br />
5、 request_irq() 和free_irq() 从 &lt;linux/sched.h&gt;改到了 &lt;linux/interrupt.h&gt;</p>
<p>27、 异步I/O(AIO) <br />
&lt;linux/aio.h&gt; <br />
ssize_t (*aio_read) (struct kiocb *iocb, char __user *buffer, size_t count, loff_t pos); <br />
ssize_t (*aio_write) (struct kiocb *iocb, const char __user *buffer, size_t count, loff_t pos); <br />
int (*aio_fsync) (struct kiocb *, int datasync); <br />
新增到了file_operation结构中。 <br />
is_sync_kiocb(struct kiocb *iocb)； <br />
int aio_complete(struct kiocb *iocb, long res, long res2);</p>
<p>28、 网络驱动 <br />
1、struct net_device *alloc_netdev(int sizeof_priv, const char *name, void (*setup)(struct net_device *)); <br />
struct net_device *alloc_etherdev(int sizeof_priv); <br />
2、新增NAPI(New API) <br />
void netif_rx_schedule(struct net_device *dev); <br />
void netif_rx_complete(struct net_device *dev); <br />
int netif_rx_ni(struct sk_buff *skb); <br />
(老版本为netif_rx())</p>
<p>29、 USB驱动 <br />
老版本struct usb_driver取消了，新的结构体为 <br />
struct usb_class_driver { <br />
char *name; <br />
struct file_operations *fops; <br />
mode_t mode; <br />
int minor_base; <br />
}; <br />
int usb_submit_urb(struct urb *urb, int mem_flags); <br />
int (*probe) (struct usb_interface *intf, <br />
const struct usb_device_id *id);</p>
<p>30、 block I/O 层 <br />
这一部分做的改动最大。不祥叙。</p>
<p>31、 mmap() <br />
int remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_t prot); <br />
int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_t prot); <br />
struct page *(*nopage)(struct vm_area_struct *area, unsigned long address, int *type); <br />
int (*populate)(struct vm_area_struct *area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock); <br />
int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot); <br />
struct page *vmalloc_to_page(void *address);</p>
<p>32、 零拷贝块I/O(Zero-copy block I/O) <br />
struct bio *bio_map_user(struct block_device *bdev, unsigned long uaddr, unsigned int len, int write_to_vm); <br />
void bio_unmap_user(struct bio *bio, int write_to_vm); <br />
int get_user_pages(struct task_struct *task, struct mm_struct *mm, unsigned long start, int len, int write, int force, struct page **pages, struct vm_area_struct **vmas);</p>
<p>33、 高端内存操作kmaps <br />
void *kmap_atomic(struct page *page, enum km_type type); <br />
void kunmap_atomic(void *address, enum km_type type); <br />
struct page *kmap_atomic_to_page(void *address); <br />
老版本：kmap() 和 kunmap()。</p>
<p>34、 驱动模型 <br />
主要用于设备管理。 <br />
1、 sysfs <br />
2、 Kobjects</p>
<p>推荐文章： <br />
http:/www-900.ibm.com/developerWorks/cn/linux/kernel/l-kernel26/index.shtml <br />
http:/www-900.ibm.com/developerWorks/cn/linux/l-inside/index.shtml</p>
<p>2.6里不需要再定义&#8220;__KERNEL__&#8221;和&#8220;MODULE&#8221;了。 <br />
用下面的Makefile文件编译：</p>
<p>代码:</p>
<p>&nbsp;&nbsp;&nbsp; obj-m&nbsp;&nbsp; := hello.o</p>
<p>&nbsp;&nbsp;&nbsp; KDIR&nbsp;&nbsp; := /lib/modules/$(shell uname -r)/build <br />
&nbsp;&nbsp;&nbsp; PWD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := $(shell pwd) <br />
&nbsp;&nbsp;&nbsp; default: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(MAKE) -C $(KDIR) M=$(PWD) modules</p>
<img src ="http://www.blogjava.net/zellux/aggbug/179561.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 17:00 <a href="http://www.blogjava.net/zellux/archive/2008/02/10/179561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多文件内核模块的编译</title><link>http://www.blogjava.net/zellux/archive/2008/02/10/179542.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 10 Feb 2008 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/10/179542.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/179542.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/10/179542.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/179542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/179542.html</trackback:ping><description><![CDATA[捣鼓了半天，硬是没用gcc成功编译。还是用make modules算了。<br />
2.6内核编译系统提供了一种不同的写法。<br />
这里obj-m是树根，hello-objs是hello的两个结点。<br />
<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"  alt="" /><span style="color: #000000">ifneq&nbsp;($(KERNELRELEASE)</span><span style="color: #000000">,</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj-m&nbsp;:</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hello.o<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hello-objs&nbsp;:</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;start.o&nbsp;stop.o<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />else<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KERNELDIR&nbsp;?</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;/lib/modules/$(shell&nbsp;uname&nbsp;-r)/build<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PWD&nbsp;&nbsp;:</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;$(shell&nbsp;pwd)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />default:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;-C&nbsp;$(KERNELDIR)&nbsp;M</span><span style="color: #000000">=</span><span style="color: #000000">$(PWD)&nbsp;modules<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />endif<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
 <img src ="http://www.blogjava.net/zellux/aggbug/179542.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 12:34 <a href="http://www.blogjava.net/zellux/archive/2008/02/10/179542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 内核相关资料链接</title><link>http://www.blogjava.net/zellux/archive/2008/02/06/179405.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 06 Feb 2008 11:00:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/06/179405.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/179405.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/06/179405.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/179405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/179405.html</trackback:ping><description><![CDATA[
		<p>
				<strong>如果一些文章的链接失效，google相应的标题应该还是很容易找到其他网站的转载的。<br /><br />内核调度：</strong>
				<a title="Inside the Linux scheduler" href="http://www.ibm.com/developerworks/linux/library/l-scheduler/?S_TACT=105AGX52&amp;S_CMP=cn-a-l">
						<br />Inside the Linux scheduler</a>  <br />讲的是用expired/active两个数组维护的O(1)算法，大多数讲2.6内核的书上都会提到的调度算法 (2008-02-06)<br /><br /><a title="&#xD;&#xA;Multiprocessing with the Completely Fair Scheduler" href="http://www.ibm.com/developerworks/linux/library/l-cfs/?S_TACT=105AGX52&amp;S_CMP=cn-a-l">Multiprocessing with the Completely Fair Scheduler</a><br />最新的2.6.23采用的CFS，还没搞懂 (2008-02-06)<br /><br /><a href="http://www.ibm.com/developerworks/cn/linux/l-cn-scheduler/index.html">http://www.ibm.com/developerworks/cn/linux/l-cn-scheduler/index.html<br /></a>Linux 调度器发展简述 (2008-02-13)<br /><br /><strong>内核模块：<br /></strong>2.6 内核中的模块注入 (2008-02-17)<br /><a href="http://www.linuxforum.net/forum/showflat.php?Cat=&amp;Board=security&amp;Number=536404&amp;page=0&amp;view=collapsed&amp;sb=5&amp;o=31&amp;fpart">http://www.linuxforum.net/forum/showflat.php?Cat=&amp;Board=security&amp;Number=536404&amp;page=0&amp;view=collapsed&amp;sb=5&amp;o=31&amp;fpart</a><br /><br /><strong>系统调用：</strong><br />Linux 2.6 新增的 vsyscall 系统服务调用机制 (2008-02-18)<br /><a href="http://blog.csdn.net/wishfly/archive/2005/01/23/264435.aspx">http://blog.csdn.net/wishfly/archive/2005/01/23/264435.aspx</a><br /><br />Linux on-the-fly kernel patching without LKM (2008-02-19)<br /><a href="http://doc.bughunter.net/rootkit-backdoor/kernel-patching.html">http://doc.bughunter.net/rootkit-backdoor/kernel-patching.html<br /><br /></a><strong>内存管理：<br /></strong><a href="http://linux-mm.org/LinuxMM">http://linux-mm.org/LinuxMM</a><br />Linux-mm.org is a wiki for documenting how memory management works and for coordinating new memory management development projects. (2008-02-21)<br /><br /><strong>并发同步：</strong><br /><a href="http://hi.baidu.com/charleswen/blog/item/61f3e40ebc26dcce7acbe1c8.html">http://hi.baidu.com/charleswen/blog/item/61f3e40ebc26dcce7acbe1c8.html</a><br />Linux内核中的同步和互斥分析报告 (2008-02-21)<br /><br /><a href="http://www-128.ibm.com./developerworks/cn/linux/kernel/sync/index.html">http://www-128.ibm.com./developerworks/cn/linux/kernel/sync/index.html</a><br />Linux 2.4.x内核同步机制 (2008-02-22)<br /><br /><strong>Big Picture:<br /></strong><a href="http://www.linuxdriver.co.il/kernel_map">http://www.linuxdriver.co.il/kernel_map</a><br />Interactive Linux kernel map (2008-02-16)<br />把内核中的函数相互调用做成了一张可放大缩小的地图，单击相应函数名会跳转到lxr的相应代码链接。 <br /><br /><strong>编程资料：<br /></strong><a href="http://www.jegerlehner.ch/intel/">http://www.jegerlehner.ch/intel/</a><br />Intel Assembler CodeTable 80x86 (2008-02-21)<br /><br />相关站点：<br /><a href="http://kernelnewbies.org/">http://kernelnewbies.org</a><br />Linux Kernel Newbies<br /><br /><a href="http://bbs4.newsmth.net/bbsdoc.php?board=KernelTech">http://bbs4.newsmth.net/bbsdoc.php?board=KernelTech</a><br />水木KernelTech版<br /><br /><a href="http://www.phrack.org/">http://www.phrack.org</a><br />Phrack is an underground ezine made by and for hackers.<br />有不少和内核相关的hack资料</p>
<img src ="http://www.blogjava.net/zellux/aggbug/179405.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-06 19:00 <a href="http://www.blogjava.net/zellux/archive/2008/02/06/179405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Linux设备设备驱动程序（第三版）》学习笔记 链接</title><link>http://www.blogjava.net/zellux/archive/2007/12/29/171603.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 29 Dec 2007 10:50:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/12/29/171603.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/171603.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/12/29/171603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/171603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/171603.html</trackback:ping><description><![CDATA[http://blog.csdn.net/wooin<br />
<br />
http://blog.csdn.net/wooin/category/156101.aspx<br />
<br />
<a title="《Linux设备设备驱动程序（第三版）》学习笔记之一：scull设备的使用" href="http://blog.csdn.net/wooin/archive/2007/08/28/1762818.aspx">《Linux设备设备驱动程序（第三版）》学习笔记之一：scull设备的使用</a><br />
<br />
<a title="《Linux设备设备驱动程序（第三版）》学习笔记之三：sleepy设备的使用 " href="http://blog.csdn.net/wooin/archive/2007/08/28/1762825.aspx">《Linux设备设备驱动程序（第三版）》学习笔记之三：sleepy设备的使用 </a><img src ="http://www.blogjava.net/zellux/aggbug/171603.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> 2007-12-29 18:50 <a href="http://www.blogjava.net/zellux/archive/2007/12/29/171603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Arch下配置samba服务</title><link>http://www.blogjava.net/zellux/archive/2007/10/17/153425.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 16 Oct 2007 17:36:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/17/153425.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/153425.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/17/153425.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/153425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/153425.html</trackback:ping><description><![CDATA[安装samba服务可以与Windows进行文件的共享<br />
下面是在Arch下的简单安装方法：<br />
- pacman -Sy samba<br />
-&nbsp;(root) cp /etc/samba/smb.conf.default /etc/samba/smp.conf<br />
- (root) vim /etc/samba/smb.conf （或者使用其他的编辑器）<br />
<br />
[globle]选项块<br />
workgroup =&nbsp;HOME&nbsp;&nbsp;&nbsp; # 组名，在Windows中默认是MSHOME或者WORKGROUP<br />
netbios name = ZelluX&nbsp; # 在网上邻居中显示的机器名<br />
encrypt passwords = yes&nbsp; # 应该设为yes。但是如果要在Windows 98/95上访问你的服务器，得把这个设为no，因为它们不支持密码的加密传输。<br />
<br />
[homes]选项块<br />
最简单的配置（登陆后方可访问）：<br />
browseable = no<br />
read only = no&nbsp;&nbsp; # 或者writable = yes<br />
<br />
匿名可读，登陆后可以修改：<br />
public = yes<br />
writable = yes<br />
write list = @staff<br />
<br />
如果想让Windows用户看到一个清晰的目录（隐藏.开头的文件，比如~/.bashrc）：<br />
[homes]<br />
path = /home/%u/smb<br />
browseable = no<br />
read only = no<br />
同时要在每位用户的主目录下建立一个smb目录。可以通过在/etc/skel目录下建立smb，从而自动在所有用户目录下建立该目录<br />
mkdir /etc/skel/smb<br />
<br />
要共享其他的目录也很容易，只要设置path和valid users属性即可<br />
[music]<br />
path = /mnt/windows/Music/<br />
browseable = yes<br />
read only = yes<br />
valid users = Bryan, Michael, David, Jane<br />
valid users属性指定登陆后有权限访问到这个目录的用户<br />
<br />
- (root) 使用 <strong><em>smbpasswd -a 用户名</em></strong>&nbsp; 增加允许登陆的用户，并指定他们的登陆密码<br />
- (root) /etc/rc.d/samba stop 停止samba服务<br />
- (root) /etc/rc.d/samba start 启动samba服务<br />
<img src ="http://www.blogjava.net/zellux/aggbug/153425.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> 2007-10-17 01:36 <a href="http://www.blogjava.net/zellux/archive/2007/10/17/153425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>阅读linux源代码的工具---lxr和glimpse简介</title><link>http://www.blogjava.net/zellux/archive/2007/10/08/151097.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 08 Oct 2007 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/08/151097.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/151097.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/08/151097.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/151097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/151097.html</trackback:ping><description><![CDATA[<a href="http://10.132.140.73/lxr/http/blurb.html">http://10.132.140.73/lxr/http/blurb.html</a><br />
<br />
在机房搭了一个，原本以为有笔记的功能，装好以后才发现只能阅读用，不过搜索功能还是很强大的。<br />
<br />
转载，部分修改（标为红色）<br />
<br />
<p>　　我们在阅读linux源代码时都有这样的体会:核心的组织相对松散，在看一个文件时往往要牵涉到其他的头文件、源代码文件。如此来回跳转寻找变量、常量、函数的定义十分不方便，这样折腾几次，便使读代码的心情降到了低点。<br />
<br />
<strong>lxr(linux cross reference)就是一个解决这个问题的工具：</strong>他对你指定的源代码文件建立索引数据库，利用perl脚本CGI动态生成包含源码的web页面，你可以用任何一种浏览器查阅。在此web页中，所有的变量、常量、函数都以超连接的形式给出，十分方便查阅。比如你在阅读/usr/src/linux/net/socket.c的源代码，发现函数 get_empty_inode不知道是如何以及在哪里定义的，这时候你只要点击get_empty_inode,lxr将返回此函数的定义、实现以及各次引用是在什么文件的哪一行，注意，这些信息也是超连接，点击将直接跳转到相应的文件相应的行。另外lxr还提供标识符搜索、文件搜索，结合程序 glimpse还可以提供对所有的源码文件进行全文检索，甚至包括注释！<br />
<br />
下面将结合实例介绍一下lxr和glimpse的基本安装和使用，由于glimpse比较简单，就从它开始：<br />
<br />
首先访问站点： <a href="http://glimpse.cs.arizona.edu/" target="_blank">http://glimpse.cs.arizona.edu/</a> 得到glimpse的源码</p>
<p>,比如我得到的是glimpse-4.12.5.tar.gz . 用root登录，在任一目录下用tar zxvf glimpse-4.12.5.tar.gz解开压缩包，在当前目录下出现新目录glimpse-4.12.5 .</p>
<p>进入该目录，执行</p>
<p><span style="color: red">
<p>./configure<br />
make<br />
make install</p>
</span>
<p>&nbsp;</p>
<p>&nbsp;如果单独使用glimpse，那么只要简单的执行glimpseindex foo即可，其中foo是你想要索引的目录，比如说是/usr/src/linux .glimpseindex的执行结果是在你的起始目录下产生若干.glimpse*的索引文件。 </p>
<p>　　然后你只要执行glimpse yourstring即可查找/usr/src/linux下所有包含字符串yourstring的文件。 </p>
<p>　　对于lxr，你可以访问<a href="http://lxr.linux.no/" target="_blank">lxr.linux.no</a>得到它的源代码解包后，遵循如下步骤：<br />
/*下面的文字来源于lxr的帮助文档以及本人的安装体会*/<br />
<br />
1)修改Makefile中的变量PERLBIN和INSTALLPREFIX,使它们分别为 perl程序的位置和你想lxr安装的位置.在我的机器上，PERLBIN的值为/usr/bin/perl .至于INSTALLPREFIX，有如下原则，lxr的安装路径必须是web服务器能有权限访问。因此它的值简单一点可取 /home/httpd/html/lxr (对于Apache web server)。<br />
<br />
2)执行 make install <br />
<br />
3)修改$INSTALLPREFIX/http/lxr.conf : <br />
baseurl : http://yourIP/lxr/http/<br />
htmlhead: /home/httpd/html/lxr/http/template-head <br />
htmltail: /home/httpd/html/lxr/http/template-tail<br />
htmldir: /home/httpd/html/lxr/http/template-dir <br />
sourceroot : /usr/src/linux　# 假如对linux核心代码索引 <br />
dbdir : /home/httpd/html/lxr/dbdir/　#dbdirk可任意起名，且位置任意 glimpsebin: /usr/bin/glimpse　 #可执行程序glimpse的位置 </p>
<p>4)在$INSTALLPREFIX/http/下增加一个文件.htaccess内容：<br />
&lt;Files ~ (source|search|ident|diff|find)$&gt; ***<br />
SetHandler cgi-script <br />
&lt;/Files&gt; </p>
上面这个文件保证Apache server将几个perl文件作为cgi-script. <br />
<br />
5)按照lxr.conf中的设置建立dbdir ,按照上例,建立目录 <br />
/home/httpd/html/lxr/dbdir <br />
进入这个目录执行$INSTALLPREFIX/bin/genxref yourdir <br />
<br />
其中yourdir是源码目录，比如/usr/src/linux <br />
<br />
如果要结合glimpse，则执行glimpseindex -H . yourdir <br />
<br />
6)修改 /etc/httpd/conf/<span style="color: red">httpd</span>.conf ,加入 <br />
<br />
&lt;Directory /home/httpd/html/lxr/http&gt;<br />
Options All <br />
AllowOverride All <br />
order allow,deny <br />
allow from all <br />
&lt;/Directory&gt; <br />
<br />
7)进入/etc/rc.d/init.d/ 执行 <br />
<br />
killall httpd <br />
./httpd start <br />
<br />
进入X ，用浏览器 <a href="http://yourip/lxr/http/blurb.html" target="_blank">http://yourIP/lxr/http/blurb.html</a><br />
<br />
大功告成 ，这下你可以舒心的读源码了。 
<img src ="http://www.blogjava.net/zellux/aggbug/151097.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> 2007-10-08 16:27 <a href="http://www.blogjava.net/zellux/archive/2007/10/08/151097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>proftpd登陆速度慢的问题的解决</title><link>http://www.blogjava.net/zellux/archive/2007/10/06/150641.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 06 Oct 2007 01:15:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/06/150641.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/150641.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/06/150641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/150641.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/150641.html</trackback:ping><description><![CDATA[proftpd.conf中增加两行设置：<br />
UseReverseDNS off<br />
IdentLookups off <br />
<br />
<br />
Come From Alacner Blog：http://blog.alacner.com/post/168.htm
<img src ="http://www.blogjava.net/zellux/aggbug/150641.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> 2007-10-06 09:15 <a href="http://www.blogjava.net/zellux/archive/2007/10/06/150641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zz 整理的内核学习计划</title><link>http://www.blogjava.net/zellux/archive/2007/09/24/147735.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 24 Sep 2007 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/24/147735.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/147735.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/24/147735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/147735.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/147735.html</trackback:ping><description><![CDATA[开始看lkd，不过最新可以抽出来的时间不多，下星期Java课还有project，还要写一份robocode的项目文档，然后编译课也得跟上，英语高口课还得准备资料。。。先转一篇学习计划过来<br />
<br />
<br />
发信人: ccedcced (turing), 信区: KernelTech<br />
标 &nbsp;题: 整理的内核学习计划<br />
发信站: 水木社区 (Fri Jan &nbsp;6 18:15:35 2006), 转信<br />
<br />
内核学习现在开始 <br />
方法就是： <br />
读书（lkd）+源代码阅读--&gt;项目 <br />
<br />
先从基础做起！ <br />
希望大家都能积极地参与讨论，写读书笔记和源码阅读笔记！ <br />
------------------------------<br />
内核学习第一周计划--Are you ready? <br />
<br />
时间:11月2号--11月5日 <br />
阅读内容：前言和第一章 <br />
导读：这是比较容易阅读的开头部分，内容比较少而且常识性的内容比较多。请在阅读的过程中考虑如下的问题： <br />
<br />
1.linux和unix相比有哪些特点？ <br />
2.内核编程和用户空间编程相比有哪些不同之处？ <br />
3.自己编译一下内核，你编译成功了么？如果不成功，有什么问题？使用你新编译的内核， <br />
&nbsp;&nbsp;能顺利启动么？有什么问题？ <br />
4.linux内核源代码树中你能找到sg设备驱动是在那个文件中实现的么？sg是什么含意? <br />
&nbsp;&nbsp;清楚地了解一下内核中源代码树的结构。 <br />
Are you ready? <br />
------------------------------<br />
内核学习第二周计划 <br />
时间:11.7-11.13 <br />
内容: <br />
&nbsp;主要是lkd中文版第一版第二章(英文第二版版第三章)的内容，比较重要。 <br />
<br />
&nbsp;1.和进程管理相关的内核文件都有哪些?找出来大致浏览一下. <br />
&nbsp;2.什么是进程和线程?在Linux中有什么独特的地方？ <br />
&nbsp;3.什么是进程描述符？怎样得到当前进程的进程描述符？进程的内核栈有多大？ <br />
&nbsp;4.进程的状态都有哪些？在什么情况下发生转化？ <br />
&nbsp;5.Linux中所有进程之间的关系是怎么样的？ <br />
&nbsp;6.用户线程和内核线程的区别和联系？ <br />
&nbsp;7.Linux是怎样创建进程和线程的？ <br />
&nbsp;8.Linux怎样终结进程？ <br />
&nbsp;9.对照相应的内核源代码文件，分析一下问题3、5、6、7。 <br />
------------------------------<br />
内核学习第三、四周计划 <br />
内核学习第三、四周计划： <br />
<br />
时间：11.14-11.27 <br />
<br />
调度是操作系统中非常重要的部分，也是最核心的东西。通过学习这一章，希望大家都能大致掌握Linux的调度策略，以及为什么要这么做，Linux相比其它的系统有什么优点。重点多分析源代码中的算法实现！！我希望我能有时间和大家一起分析代码，也希望大家积极主动地分析一些代码片断。 <br />
<br />
学习内容： <br />
1.进程调度最基本的原理是什么？ <br />
2.列举出几个I/O消耗性和处理器消耗型的进程。 <br />
3.Linux都采用了哪些调度的算法？详细解释一下这些算法。 <br />
4.进程什么时间进入运行态？什么时间进入休眠（阻塞）状态？ <br />
5.了解进程抢占的算法； <br />
6.讨论一下Linux进程调度的实时性怎么样，还有哪些需要提高的地方？ <br />
7.自己查找进程调度的相关文件，分析为题3-6。 <br />
------------------------------<br />
&nbsp;内核学习第五周计划 <br />
时间：11.28--12.5 <br />
<br />
1、什么是系统调用？ <br />
<br />
2、为什么需要系统调用？ <br />
<br />
3、实现系统调用相关的代码有哪些，找出来浏览一下 <br />
<br />
4、详细阅读getuid()这一下系统调用的实现代码 <br />
<br />
5、如何导出sys_call_table，有几种方法，注意不同内核版本的区别 <br />
<br />
6、尝试自己给kernel添加一个简单的系统调用 <br />
&nbsp;&nbsp; 功能要求：调用这个系统调用，使用户的uid等于0。（这个题目取自《边干边学》） <br />
7、采用添加系统调用的方式实现一个新功能的利弊有哪些，替代方法是什么？ <br />
------------------------------<br />
内核学习第六周计划 <br />
<br />
这一周就总结了一下中断和下半部相关的知识点，供大家参考一下！同时附件里有我以前学习时候的笔记，写的不好请多多指教。 <br />
内核学习第六周计划: <br />
1、如何理解中断、中断上下文和进程上下文的区别、为何中断不能睡眠 <br />
2、关于x86中选择子、描述符和各种门的理解 <br />
3、查阅相关资料和内核源码理解： <br />
中断是如何发生以及硬件和内核是如何相应的，如何返回的 <br />
x86上中断发生时上下文(寄存器)如何保存以及中断返回时上下文如何恢复的，系统的第一个任务是如何启动的 <br />
<br />
4、内核中安排下半部的理由 <br />
5、软中断及其他的下半部策略适用于什么样的任务和场合？ <br />
6、下半部可以睡眠么？为什么？ <br />
7、2.4和2.6内核中下半部包括哪些部分，为何2.6内核相比2.4内核会做这样的改进 <br />
8、阅读内核中关于软中断、tasklet以及工作队列的代码、相关书籍和资料，总结如下两个问题: <br />
软中断、tasklet以及工作队列是如何初始化，注册以及触发的，使用了哪些关键的数据结构及内核变量？ <br />
软中断、tasklet以及工作队列都在什么场合下使用？ <br />
------------------------------<br />
内核学习第七周计划 <br />
内核学习第七周计划： <br />
时间：12月13日--12月19日 <br />
内容：内核同步的理论知识。 <br />
&nbsp;<br />
问题： <br />
1.为什么要进行内核的同步？ <br />
2.内核中怎么定义原子操作？ <br />
3.竞争产生的条件与加锁的顺序？ <br />
4.要保护的对象？ <br />
5.死锁产生的条件与解决办法？ <br />
6.你有什么比较好的方法来调试多线程的程序？ <br />
7.据一个内核中产生竞争的例子。 <br />
------------------------------<br />
内核学习第八周计划 <br />
第八周： <br />
内容: <br />
上一周我们分析了内核中的同步，这一次我们要接触的是内核中怎么进行同步和互斥。 <br />
&nbsp;&nbsp; <br />
问题： <br />
1.原子操作的粒度问题； <br />
2.自旋锁的设计及其应用场合,分析自旋锁； <br />
3.信号量及其应用，信号量怎么使用？ <br />
4.锁的粒度以及其分类； <br />
5.内核可抢占性的实现及其与锁的关系； <br />
6.smp中需要考虑哪些同步与互斥； <br />
------------------------------ &nbsp; <br />
内核学习第九周计划 <br />
前面的话： <br />
&nbsp;&nbsp; 内核学习已经进行了两个月的时间，LKD这本书我们基本上已经进行了一半。希望大家在下面多用功。 <br />
我们在这个计划里面列出来的只是一些比较基本的问题，而且我们没有给出问题的答案，但是只要你在下面 <br />
用功了，我想答案就在这本书里和源代码里面。 <br />
<br />
本周内容：TIMERS AND TIME MANAGEMENT <br />
<br />
1.HZ和jiffies值的定义? <br />
2.内核中怎样解决jiffies的回绕？为什么这样可以解决jiffies回绕？ <br />
3.时钟中断处理程序有哪些值得注意的地方？ <br />
4.xtime_lock锁和seqlock锁? <br />
5.定时器的实现、使用和竞争条件？ <br />
6.udelay()&amp;mdelay()? <br />
------------------------------ &nbsp;<br />
&nbsp;内核学习第十周计划： <br />
内存管理 <br />
&nbsp;&nbsp; &nbsp;学习内容 <br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;内存管理是比较庞大的一个部分，在lkd这本书中用了很少的篇幅，从这里面我们基本能看清楚 内存管理的概貌。《情景分析》一书关于内存管理的部分讲得比较多，代码分析比较透彻也比较深入。 但是相对的难度也比较大，建议先看看lkd这本书，然后再看《情景分析》一书的内存管理。 <br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; 问题： <br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;1.内核中内存的分页、分区； <br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;2.内核中有哪些函数来获得内存？内核中分配内存要注意什么？ <br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;3.为什么使用slab?slab对象的详细分析。 <br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;4.内核栈上内存的静态分配问题； <br />
<img src ="http://www.blogjava.net/zellux/aggbug/147735.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> 2007-09-24 11:22 <a href="http://www.blogjava.net/zellux/archive/2007/09/24/147735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统恢复记</title><link>http://www.blogjava.net/zellux/archive/2007/09/19/146515.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 19 Sep 2007 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/19/146515.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/146515.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/19/146515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/146515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/146515.html</trackback:ping><description><![CDATA[原来只给机房电脑的Arch配了20G的空间，现在想装个virtualbox，空间自然不够了，于是到windows下删了一个分区用于挂载/home的内容。<br />
然后问题就出来了，由于少了一个分区，原来arch所在的分区(sda8)向前移了一位(sda7)，结果grub启动出错，无法进入系统。<br />
从机房管理员那借来Redhat的安装盘，进入rescue模式，挂在好/dev/sda7后，修改boot/grub/menu.lst中的盘符，重启，问题依旧。<br />
只好先恢复winxp再说，用winxp工具盘启动后，fdisk /mbr，重启，安装grub for dos，再重启，进入grub<br />
grub&gt; root (hd0,6)<br />
grub&gt; setup (hd0)<br />
报错，估计是dos下的问题，只好手动进入arch<br />
grub&gt; root (hd0,6)<br />
grub&gt; kernel /boot/vmlinuz26 root=/dev/sda7 ro<br />
grub&gt; initrd /boot/kernel26.img<br />
grub&gt; boot<br />
进入后仍然有错误，说是sda8无法访问，这时才想起fstab还没改过，但是当前的挂载的sda7还是只读的，只好再用redhat的启动盘启动，挂载sda7后修改fstab中的信息。<br />
<br />
问题解决。<br />
<br />
<img src ="http://www.blogjava.net/zellux/aggbug/146515.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> 2007-09-19 16:07 <a href="http://www.blogjava.net/zellux/archive/2007/09/19/146515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz] proftpd 学习笔记</title><link>http://www.blogjava.net/zellux/archive/2007/09/18/146293.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 18 Sep 2007 15:16:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/18/146293.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/146293.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/18/146293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/146293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/146293.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/09/18/146293.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/146293.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> 2007-09-18 23:16 <a href="http://www.blogjava.net/zellux/archive/2007/09/18/146293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Arch 安装手记</title><link>http://www.blogjava.net/zellux/archive/2007/09/12/144520.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 12 Sep 2007 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/12/144520.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/144520.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/12/144520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/144520.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/144520.html</trackback:ping><description><![CDATA[1. 安装后reboot，选择Arch Linux Fallback，出现登录提示后键盘无响应，按Num Lock键指示灯也没有变化，此时拔掉键盘再插上即可。<br />
<br />
2. Network IP, Gateway, Mask设置都正常，但无法ping到网关，翻了wiki后终于发现是Windows在捣鬼<br />
Windows中关机后会自动将Realtek 8168 8169 8101 8111网卡禁用，直到再次进入Windows后才会恢复<br />
解决方法是在设备管理器-&gt;网络适配器-&gt;Realtek xxx-&gt;高级中把"Wake-On-Lan After Shutdown"设为Enable <br />
<br />
<p>3. 几个pacman常用的参数<br />
pacman -Sy&nbsp; 更新本地包的数据库<br />
pacman -S package_name1 package_name2 ...&nbsp; 安装包<br />
pacman -S extra/package_name&nbsp;&nbsp; 指定安装某个版本的包<br />
pacman -Su&nbsp; 更新所有安装的包，通常和Sy参数合并为-Syu<br />
pacman -Ss&nbsp; 搜索<br />
pacman -U *.pkg.tar.gz&nbsp; 安装本地包</p>
<p>4. 好不容易+莫名奇妙地配好了显卡，startx可以跑起来了<br />
然后运行gnome-session，提示Gtk WARNING **: Cannot open display:<br />
找了一堆解决方法，总算有一个可行的： <br />
在~/.xinitrc中增加gnome-session，然后启动startx</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zellux/aggbug/144520.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> 2007-09-12 16:03 <a href="http://www.blogjava.net/zellux/archive/2007/09/12/144520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]一个很不错的Ubuntu配置帖子</title><link>http://www.blogjava.net/zellux/archive/2007/09/09/143740.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 09 Sep 2007 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/09/143740.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/143740.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/09/143740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/143740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/143740.html</trackback:ping><description><![CDATA[发信人: laye (Addict to Goth &gt;_&lt;), 信区: Unix<br />
标&nbsp; 题: 我的 Ubuntu 7.04 Cookbook<br />
发信站: 日月光华 (2007年09月09日09:19:35 星期天), 站内信件<br />
<br />
最近装了 Ubuntu 7.04，写了一个简单的 Cookbook，记录了自己遇到的一些问题和解决<br />
方法，希望对大家有帮助。<br />
<br />
cook01 中文字体美化<br />
<br />
(1) 得到 simsun.ttc tahoma.ttf tahomabd.ttf&nbsp; verdana.ttf verdanab.ttf<br />
verdanai.ttf verdanaz.ttf 几个个字体文件 （可以从 Windows 的 Fonts 文件夹中获<br />
取)<br />
(2) 用 nautilus 打开系统的字体文件夹：nautilus fonts:///<br />
(3) 将第 (1) 步中的几个个字体复制进第 (2) 步打开的字体文件夹中<br />
(4) 创建 /etc/fonts/local.conf 文件，内容如 [附录1] (本文最底端)<br />
(5) 重新启动 X: Ctrl + Alt + Backspace<br />
(6) 打开 gnome 字体设置：gnome-font-properties，设置前四个字体为 Tahoma<br />
(7) 打开 firefox 字体设置：将 Serif 设置为 SimSun，Sans-serif 设置为 Tahoma，<br />
Monospace 设置为 SimSun，并且允许网页自由选择字体<br />
(8) 重新启动 X, enjoy~<br />
<br />
点评：该优化方案用 Windows 的 SimSun (衬线) 和 Tahoma (无衬线) 作为 UI 和<br />
Web 中的主要字体使用。并且，解决了字体替换后的几个问题：<br />
(1) 针对中文选字混乱问题 (同一句话中的不同汉字可能用不同字体进行渲染)，我将所<br />
有亚洲字符都强制使用 SimSun 显示。<br />
(2) 由于 SimSun 的小字体为点阵字体，所以关闭了 8-17px 字体的抗锯齿以达到理想<br />
的显示效果。<br />
(3) 设置了 SimSun 和 Tahoma 的最小字体尺寸以保证显示效果<br />
<br />
已知 Bug:&nbsp; SimSun 英文和数字粗体效果不佳，可以下载网友制作的 SimSunbd 拷贝入<br />
字体目录 （SimSunbd 的英文和数字用的好像是 Tahoma）<br />
<br />
<br />
cook02 连接 windows 的远程桌面<br />
<br />
安装 rdesktop:<br />
sudo apt-get install rdesktop<br />
<br />
使用：<br />
rdesktop ip<br />
rdesktop -f ip (全屏)<br />
<br />
<br />
cook03 使 ntfs 分区可写<br />
<br />
安装 ntfs-config:<br />
sudo apt-get install ntfs-config<br />
<br />
配置：<br />
sudo ntfs-config<br />
勾选两个选项 (或根据需要勾选)<br />
<br />
<br />
cook04 访问 Windows 共享文件夹<br />
<br />
执行：nautilus-connect-server<br />
填写你要访问的 Windows 共享文件夹的相关信息，这个文件夹就会被 mount 到你的<br />
Desktop 下。同样的方法可以 mount FTP 文件夹等等。<br />
<br />
<br />
cook05 使 Windows 能访问 ubuntu 的文件 (samba)<br />
<br />
执行：shares-admin<br />
按需要设置<br />
<br />
<br />
cook06 播放各种视频<br />
<br />
(1) 下载 mplayer 的 Codec Package：<br />
http://www.mplayerhq.hu/design7/dload.html#binary_codecs<br />
(2) 将下载的 Codec Package 解压到 /usr/lib/win32<br />
(3) 安装 mplayer 或各种 mplayer 的前端程序，我用的是 mplayer 的一个前端：<br />
smplayer<br />
(4) 如果你的 mplayer 的播放画面不正常，请检查你的 Video Output Driver 是否为<br />
x11<br />
(5) 若要显示中文字幕，需要在播放器内设置字幕用字体和字幕编码<br />
<br />
<br />
cook07 使用 fcitx 替换 scim<br />
<br />
由于使用习惯和兼容性原因，许多人不得不使用 fcitx，安装方法如下：<br />
<br />
sudo apt-get install im-switch fcitx<br />
im-switch -s fcitx -z default<br />
<br />
如果你要在 en 的 locale 下使用 fcitx，请将 /etc/gtk-2.0/gtk.immodules 中的：<br />
<br />
&#8220;xim&#8221; &#8220;X Input Method&#8221; &#8220;gtk20&#8243; &#8220;/usr/share/locale&#8221; &#8220;ko:ja:th:zh&#8221;<br />
<br />
替换为<br />
<br />
&#8220;xim&#8221; &#8220;X Input Method&#8221; &#8220;gtk20&#8243; &#8220;/usr/share/locale&#8221; &#8220;en:ko:ja:th:zh&#8221;<br />
<br />
<br />
<br />
cook08 Panel 中的好东东<br />
<br />
ubuntu 桌面上下各有一个 Panel。其实，我们可以自定义 Panel 上面的内容，比如说<br />
：<br />
天气预报，本本的电量显示、亮度调节，CPU 频率监视，系统负载监视，还有一个强制<br />
终止程序的按钮 (Force Quit)等等。<br />
你也可以把自己建立的 Laucher 拖动到 Panel 上，当然，你也可以在别的位置建立自<br />
己的 Panel。<br />
<br />
<br />
cook09 使用 HP 打印机<br />
<br />
ubuntu 自带了 HP 系列打印机的驱动 oo2zjs，但奇怪的是，这个驱动居然是不能用的<br />
。<br />
用户需要卸载掉 ubuntu 自带的 oo2zjs，安装新的 oo2zjs。<br />
<br />
具体过程如下：<br />
<br />
确认编译环境已安装：<br />
sudo apt-get install build-essential<br />
<br />
下载 oo2zjs：<br />
wget -O foo2zjs.tar.gz http://foo2zjs.rkkda.com/foo2zjs.tar.gz<br />
<br />
解压：<br />
tar zxf foo2zjs.tar.gz<br />
cd foo2zjs<br />
<br />
卸载原有 foo2zjs：<br />
make uninstall<br />
<br />
编译，安装：<br />
make<br />
./getweb 1020 这里是你的打印机型号<br />
sudo make install install-hotplug cups<br />
<br />
在 ubuntu 的打印机管理中添加你的打印机 (不要选 suggest 的那个驱动):<br />
sudo gnome-cups-manager<br />
<br />
最后，重启 cups:<br />
sudo make cups<br />
<br />
cook10 开启 Vim 的&#8220;简易模式&#8221;<br />
<br />
ubuntu 中 Vim 只有 console 的版本，且是传统 Unix 的行为模式，即在 INSERT<br />
MODE 下，方向键和退格键是不起作用的。可以手动开启&#8220;类 Windows&#8221;模式，即在<br />
COMMAND MODE 下输入：<br />
<br />
:behave mswin<br />
<br />
<br />
[附录1]<br />
<br />
&lt;?xml version="1.0"?&gt;<br />
&lt;!DOCTYPE fontconfig SYSTEM "fonts.dtd"&gt;<br />
<br />
&lt;fontconfig&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;!-- use SimSun to display all Asia character --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;match target="font"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;test compare="contains" name="lang" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;zh-cn&lt;/string&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;zh-tw&lt;/string&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;ja&lt;/string&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;ko&lt;/string&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/test&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;edit name="family"&gt;&lt;string&gt;SimSun&lt;/string&gt;&lt;/edit&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/match&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;!-- open anti-alias for all font --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;match target="font" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;edit mode="assign" name="antialias"&gt;&lt;bool&gt;true&lt;/bool&gt;&lt;/edit&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;edit mode="assign"<br />
name="hintstyle"&gt;&lt;const&gt;hintslight&lt;/const&gt;&lt;/edit&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;edit mode="assign" name="hinting"&gt;&lt;bool&gt;true&lt;/bool&gt;&lt;/edit&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;edit mode="assign" name="autohint"&gt;&lt;bool&gt;false&lt;/bool&gt;&lt;/edit&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/match&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;!-- disable anti-alias for fonts between 8 to 17 pixels --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;match target="font" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;test compare="more_eq" name="pixelsize"<br />
qual="any"&gt;&lt;double&gt;8&lt;/double&gt;&lt;/test&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;test compare="less_eq" name="pixelsize"<br />
qual="any"&gt;&lt;double&gt;17&lt;/double&gt;&lt;/test&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;edit mode="assign" name="antialias"&gt;&lt;bool&gt;false&lt;/bool&gt;&lt;/edit&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/match&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;!-- set the minimum size for SimSun and Tahoma --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;match target="font" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;test name="family" qual="any"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;SimSun&lt;/string&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;NSimSun&lt;/string&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;Tahoma&lt;/string&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/test&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;test compare="more_eq" name="pixelsize"&gt;&lt;int&gt;8&lt;/int&gt;&lt;/test&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;test compare="less_eq" name="pixelsize"&gt;&lt;int&gt;12&lt;/int&gt;&lt;/test&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;edit compare="eq" name="pixelsize"&gt;&lt;int&gt;12&lt;/int&gt;&lt;/edit&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/match&gt;<br />
<br />
&lt;/fontconfig&gt;<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/zellux/aggbug/143740.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> 2007-09-09 10:52 <a href="http://www.blogjava.net/zellux/archive/2007/09/09/143740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE - File I/O (5)</title><link>http://www.blogjava.net/zellux/archive/2007/08/22/138633.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 22 Aug 2007 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/22/138633.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/138633.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/22/138633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/138633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/138633.html</trackback:ping><description><![CDATA[1. dup和dup2函数<br>#include &lt;unistd.h&gt;<br>int dup(int filedes);<br>int dup2(int filedes, int filedes2);<br>// Both return: new file descriptor if OK, -1 on error<br><br>dup返回的file descriptor(以下简称fd)为当前可用的最低号码，dup2则指定目的fd，如果该fd已被打开，则首先关闭这个fd。<br>dup后两个fd指向相同的file table entry，这意味着它们共享同一个的file status flag, read, write, append, offset等。<br><br>事实上，dup等价于<br>
fcntl(filedes, F_DUPFD, 0);<br>
<br>dup2和也类似于<br>
close(filedes2);<br>
fcntl(filedes, F_DUPFD, filedes2);<br>但这不是一个原子操作，而且errno也有一定的不同。<img src ="http://www.blogjava.net/zellux/aggbug/138633.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> 2007-08-22 15:46 <a href="http://www.blogjava.net/zellux/archive/2007/08/22/138633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE - File I/O (4) - Atomic Operations</title><link>http://www.blogjava.net/zellux/archive/2007/08/21/138379.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 21 Aug 2007 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/21/138379.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/138379.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/21/138379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/138379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/138379.html</trackback:ping><description><![CDATA[<strong>Appending to a File</strong><br>&nbsp;考虑某个单一进程试图在文件追加写入的操作。由于早期的UNIX系统不支持O_APPEND选项，因此得先用lseek将offset置于文件尾部。<br>if (lseek(fd, 0L, 2) &lt; 0)<br>&nbsp;&nbsp;&nbsp; err_sys("lseek error");<br>if (write(fd, buf, 100) != 100)<br>&nbsp;&nbsp;&nbsp; err_sys("write error");<br>注意这里的lseek函数的第三个参数2等于SEEK_END常量，但是早期UNIX并没有这个常量名（System V中才引进）<br><br>这样的处理在多进程试图在同一文件尾部追加写入时就有可能出现问题。<br>假设两个独立线程A B要在某个文件尾部追加写入，使用了上述方法，并没有使用O_APPEND开关。<br>首
先A指向了该文件尾部（假设是offset=1500的地方），接着内核切换到B进程，B也指向了该尾部，然后写入了100字节，此时内核把v-node
中当前文件的大小改为了1600。内核再次切换进程，A继续运行，调用write方法，结果就在offset=1500的地方写入了，覆盖了B进程写入的
内容。<br><br>这个问题其实和Java中的多线程差不多，指向文件尾部和写入应该作为一个原子操作执行，就像Java中使用synchronized块保护原子操作。使用O_APPEND选项就是一种解决方法。<br>另一种解决方法时使用XSI extension中的pread和pwrite函数。<br>#include &lt;unistd.h&gt;<br><br>ssize_t pread(int <em>filedes,</em> void <em>*buf,</em> size_t <em>nbytes,</em> off_t <em>offset</em>);<br>// Returns: number of bytes read, 0 if end of file, -1 on error<br><br>ssize_t pwrite(int <em>filedes</em>, const void <em>*buf</em>, size_t <em>nbytes</em>, off_t <em>offset</em>);<br>// Returns: number of bytes read, 0 if end of file, -1 on error<br><br>调用pread与调用lseek后再调用read等价，以下情况除外：<br>1. pread的两个步骤无法被中断。<br>2. 文件指针尚未被更新时。<br><br>pwrite与lseek+write的差别也相似。<br><br><strong>Creating a File<br></strong>当使用O_CREAT和O_EXCL开关调用open函数时，如果文件已经存在，则open函数返回失败值。如果不使用这两个开关，可以这样写：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((fd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;open(pathname,&nbsp;O_WRONLY))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(errno&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;ENOENT)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((fd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;creat(pathname,&nbsp;mode))&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys(</span><span style="color: #000000;">"</span><span style="color: #000000;">creat&nbsp;error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys(</span><span style="color: #000000;">"</span><span style="color: #000000;">open&nbsp;error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<br>当open函数执行后creat函数执行前另一个进程创建了同名文件的话，该数据就会被擦除。 <img src ="http://www.blogjava.net/zellux/aggbug/138379.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> 2007-08-21 14:45 <a href="http://www.blogjava.net/zellux/archive/2007/08/21/138379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE - File I/O (3) - File Sharing</title><link>http://www.blogjava.net/zellux/archive/2007/08/20/138233.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 20 Aug 2007 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/20/138233.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/138233.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/20/138233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/138233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/138233.html</trackback:ping><description><![CDATA[内核使用三种数据结构表示一个打开的文件，他们之间的关系决定了进程间对于共享文件的作用。<br>Every process has an entry in the process table. Within each process table entry is a table of open file descriptors, which we can think of as a vector, with one entry per descriptor. Associated with each file descriptor are<br>1) The file descriptor flags (close-on-exec; refer to Figure 3.6 and Section 3.14)<br>2) A pointer to a file table entry<br><br>The kernel maintains a file table for all open files. Each file table entry contains<br>1) The file status flags for the file, such as read, write, append, sync, and nonblocking<br>2) The current file offset<br>3) A pointer to the v-node table entry for the file<br><br>Each open file (or device) has a v-node structure that contains information about the type of file and pointers to functions that operate on the file. For most files, the v-node also contains the i-node for the file. This information is read from disk when the file is opened, so that all the pertinent information about the file is readily available. For example, the i-node contains the owner of the file, the size of the file, pointers to where the actual data blocks for the file are located on disk, and so on.<br><br><img src="http://www.blogjava.net/images/blogjava_net/zellux/a.gif" border="0"><br>上图为这三种数据结构及其相互联系<br>其中v-node主要用于提供单个操作系统上的多文件系统支持，Sun把它称为Virtual File System<br>linux中没有v-node，使用了一个generic i-node代替，尽管使用了不同的实现方式，v-node在概念上与generic i-node相同。<br><br>下面来讨论两个独立的进程打开同一文件的情况<br>这种情况下两个进程拥有不同的file table，但其中的两个指针指向了同一个v-node。<br><br> 知道了这些数据结构的情况以后，我们可以更精确的知道某些操作的结果<br>1) 每次write操作结束后，当前文件的offset增加，如果这个操作导致当前的offset超出了文件长度，则i-node表中记录的文件大小会被修改为改动后的大小。<br>2) 使用O_APPEND方式打开文件后，每次调用write函数时，当前文件的offset都会被设置为i-node表中的该文件大小，从而write函数只能在文件尾部追加。<br>3) lseek 函数只改变在file table中的当前文件offset，并不会产生io操作<br><br>注意file descriptor flag和file status flag的作用域差别，前者属于某个单独进程的单独的file descriptor，后者则适用于任意进程中指向给定file table entry的所有descriptor。fcntl函数可以修改这两种flag<br><br>  <img src ="http://www.blogjava.net/zellux/aggbug/138233.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> 2007-08-20 22:39 <a href="http://www.blogjava.net/zellux/archive/2007/08/20/138233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE - File I/O (2) </title><link>http://www.blogjava.net/zellux/archive/2007/08/13/136516.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 13 Aug 2007 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/13/136516.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/136516.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/13/136516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/136516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/136516.html</trackback:ping><description><![CDATA[&nbsp;1. File hole<br>The file's offset can be greater than the file's current size, in which case the next <u>write</u> to the file will extend the file. This is referred to as creating a <em>hole </em>in a file and is allowed. Any bytes in a file that not been written are read back as 0.<br>A
hole in a file isn't required to have storage backing it on disk.
Depending on the file system implementation, when you write after
seeking past the end of the file, new disk blocks might be allocated to
store the data, but there's no need to allocate disk blocks for the
data between the old end of file and t he location where you start
writing.<br><br>2. read Function<br>#include &lt;unistd.h&gt;<br>ssize_t read(int filedes, void *buf, size_t nbytes);<br>// Returns: number of bytes read, 0 if end of file, -1 on error<br>
read读取的字节数小于所要求的字节数的几种可能：<br>
1) 从文件中读取，在所要求的字节数读取完成前到达文件尾。<br>
2) 从终端读取，这种情况下通常每次最多读取一行内容。<br>
3) 通过网络读取，网络缓冲可能导致读取到少于要求的字节数。<br>
4) 从管道或者FIFO中读取<br>
5) 从record-oriented设备中读取，如磁带，每次至多返回一个记录。orz...<br>
6) 在一定数量的数据读取后被信号中断。<br>
<br>
3. write Function<br>
#include &lt;unistd.h&gt;<br>
ssize_t write(int filedes, const void *buf, size_t nbytes);<br>
// Returns: number of bytes written if OK, -1 on error<br>
导致错误的通常原因是磁盘已满，或者超出了给定进程的文件大小限制。 <img src ="http://www.blogjava.net/zellux/aggbug/136516.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> 2007-08-13 22:14 <a href="http://www.blogjava.net/zellux/archive/2007/08/13/136516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE - File I/O (1) </title><link>http://www.blogjava.net/zellux/archive/2007/08/09/135654.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 09 Aug 2007 14:46:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/09/135654.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/135654.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/09/135654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/135654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/135654.html</trackback:ping><description><![CDATA[1. unbuffered IO是相对于standard IO而言的，unbuffered指每个read和write函数都是通过内核系统调用实现的。这些函数并不是ISO C的一部分，但都属于POSIX.1和Single UNIX Specification.<br><br>2. File Descriptors<br>内
核中所有打开的文件都是通过File Descriptor指向的。file
descriptor是一个非负的整数，按照管理，UNIX系统把0指定为进程的标准输入，1为进程的标准输出，2为标准错误输出。为了程序的通用性考
虑，这些magic number应该由&lt;unistd.h&gt;中的STDIN_FILENO, STDOUT_FILENO,
STRERR_FILENO代替。<br>file descriptor的范围是从[0, OPEN_MAX]，早期系统的上限为19，现在许多已经到达了63，Linux 2.4.22把每个进程打开的文件数上限提升到了2^20.<br><br>3. open 函数<br>#include &lt;fcntl.h&gt;<br>int open(const char <em>*pathname,</em> int <em>oflag</em>, ..., /* mode_t <em>mode</em> */ );<br>返回: 正常 - 最小的未被使用的file descriptor，出错 - 0 <br>oflag: O_RDONLY(0), O_WRONLY(1), O_RDWR(2) 括号内为大多数情况下的值，这三个参数中必选一个，剩下的可选参数指定了是否追加、是否创建等信息，具体参见man 2 open<br><br>4. File Name and Pathname Truncation<br>如果创建的文件名长度大于NAME_MAX常量，BSD系统会返回一个错误状态，并把errno设为ENAMETOOLONG。如果只是把文件名截去部分就有可能导致与已存在的文件重名。<br>POSIX.1中的常量_POSIX_NO_TRUNC指定了长文件名和路径会被截断还是会引发错误<br><br>5.&nbsp; 创建文件<br>#include &lt;fcntl.h&gt;<br>int creat(const char *<em>pathname</em>, mode_t <em>mode</em>);<br>事实上这个函数等价于<br>open (<em>pathname</em>, O_WRONLY | O_CREAT | O_TRUNC, <em>mode</em>);<br><br>6. 关闭文件<br>#include &lt;fcntl.h&gt;<br>int close(int <em>filedes</em>);<br>返回: 成功 -1，出错 0<br>当一个进程结束时，系统会自动关闭该进程打开的所有文件。<br><br>7. lseek 函数<br>每个打开的文件都有一个current file offset属性，通常是一个非负的整数。默认情况下文件打开后该值为0,除非指定了O_APPEND选项。<br>#include &lt;unistd.h&gt;<br>off_t lseek(int <em>filedes,</em> off_t <em>offset,</em> int <em>whence</em>);<br>// Returns: new file offset if OK, -1 on error<br><br>可以通过seek 0字节来得到当前的offset<br>off_t currpos;<br>currpos = lseek(fd, 0, SEEK_CUR);<br>这个方法也可以用来判断当前文件是否可以被seek，如果是指向管道(pipe)，FIFO，或者socket的file descriptor，lseek把errno设置为ESPIPE并返回-1<br><br>某些设备可能允许负值的offset(如FreeBSD上的/dev/kmem)，因此在检查返回值时应判断是否等于-1，而不是是否小于0<img src ="http://www.blogjava.net/zellux/aggbug/135654.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> 2007-08-09 22:46 <a href="http://www.blogjava.net/zellux/archive/2007/08/09/135654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vim - Formatting the code</title><link>http://www.blogjava.net/zellux/archive/2007/08/06/134784.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 06 Aug 2007 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/06/134784.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/134784.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/06/134784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/134784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/134784.html</trackback:ping><description><![CDATA[1. The following Vim command will perform a fast code block formatting:<br>1G=G<br>We can split it up in simply says:<br>1G : Go to the first line(you can also use gg)<br>= : Indent according to the configuration<br>G : Go to the last line(tell Vim where to end indenting)<br><br>2. Another way is to go into visual mode with V and press =&nbsp; to reindent the chosen lines.<br><br>3.<br>=i{ will reindent everything between { and } excluding the brackets.<br>other similar choices:<br>a{ : all the code between { and } including the brackets.<br>i(, a(, i&lt;, a&lt;, i[, a[<br><br> <img src ="http://www.blogjava.net/zellux/aggbug/134784.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> 2007-08-06 21:24 <a href="http://www.blogjava.net/zellux/archive/2007/08/06/134784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一次成功编译了内核模块</title><link>http://www.blogjava.net/zellux/archive/2007/07/29/133101.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 29 Jul 2007 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/29/133101.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/133101.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/29/133101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/133101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/133101.html</trackback:ping><description><![CDATA[先抄了《Linux编程白皮书》上的代码，貌似不成功；google后改了下，编译成功。<br>hello.c<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</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>#include&nbsp;</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><br>MODULE_LICENSE(</span><span style="color: #000000;">"</span><span style="color: #000000;">GPL</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;init_module()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello,&nbsp;world&nbsp;-&nbsp;this&nbsp;is&nbsp;the&nbsp;kernel&nbsp;speaking\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;cleanup_module()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">Short&nbsp;is&nbsp;the&nbsp;life&nbsp;of&nbsp;a&nbsp;kernel&nbsp;module\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br></span></div>
<br>Makefile:<br>obj-m := hello.o<br>KERNELBUILD := /lib/modules/`uname -r`/build<br>default:<br>&nbsp;&nbsp; &nbsp;make -C $(KERNELBUILD) M=$(shell pwd) modules<br><br>然后<br>
make<br>sudo insmod hello.ko&nbsp;&nbsp;&nbsp; // 载入模块<br>dmesg&nbsp; // 即可看到Hello, world<br>sudo rmmod hello // 移除模块<br>dmesg // 看到移除时信息<br><br><br> <img src ="http://www.blogjava.net/zellux/aggbug/133101.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> 2007-07-29 12:21 <a href="http://www.blogjava.net/zellux/archive/2007/07/29/133101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>