??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕无码亚洲欧洲日韩,亚洲13又紧又嫩又水多,亚洲啪啪综合AV一区http://m.tkk7.com/zellux/category/21871.htmlq的大二:M 思?{待zh-cnSat, 17 May 2008 17:20:58 GMTSat, 17 May 2008 17:20:58 GMT60ICS Lab 6http://m.tkk7.com/zellux/archive/2008/05/17/201170.htmlZelluXZelluXSat, 17 May 2008 14:28:00 GMThttp://m.tkk7.com/zellux/archive/2008/05/17/201170.htmlhttp://m.tkk7.com/zellux/comments/201170.htmlhttp://m.tkk7.com/zellux/archive/2008/05/17/201170.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/201170.htmlhttp://m.tkk7.com/zellux/services/trackbacks/201170.html
主要用到open, close, read和writeq几个函敎ͼ关于它们的用方法可以?br />man 2 <函数?gt;
查看?br />
q里单介l下Q?br />Linux内核为每个进E维护了一张已打开的文件的表格Q用File DescriptorQ整型,以下写成fdQ可以访问到q些文g。所以很Ҏ理解tsh.c中的函数listjobsZ么需?br />一个output_fd的整型参敎ͼ注意它的后面有这么一行:
if (writer(output_fd, buf, strlen(buf)) < 0) ?br />
q一行就把前面构造好的buf字符Ԍ包括当前q程的信息)输出到这个output_fd对应的文件中了?br />
每个q程的gؓ0, 1, 2的fd都指向相同的文gQ?对应标准输入Q通常是键盘输入)Q?对应标准输出Q通常为屏q)Q?对应标准错误输出?br />
可以看到在mainҎ的开_有这么一?br /> dup2(1, 2);

dup2的作用是把参C指向的文件改成和参数一一P如果之前打开了文Ӟ则先关闭Q,q句话的作用是把原来要输出到标准错误端(stderr)的内?br />输出到标准输出端(stdout)Q便于调试?br />
理解了fd和dup2的作用后Q重定向也就很容易实CQ一U最单的Ҏ是先用open函数打开输出文gq得到对应的fdQ然后用dup2把标准输?输入端的指向Ҏ文g的fd
?br />
另外注意用open创徏输出重定向的文g的时候要加上S_IRUSR和S_IWUSR选项Q否则创建后的文件没有读写权限。(不过好像q个lab的测试数据比较厚道,会事先touch一下,不加q两个选项应该也能通过试Q?br />
一些文档中未定义的行ؓQ?br />argv
假如我输入的命o?bin/ls -l > ls.txtQ对应的argv应该包括哪些内容呢?
一般的情况argv的内容应该是['/bin/ls', '-l']Q后面的重定向符是不包括的不q在q个lab中似乎没有这个限Ӟ不去掉重定向和管道部分应该还是能通过试的?br />
Job ID的分?br />如果现在1, 2, 4号子d在后台运行,再新增一个进E的话应该给它分配多呢Q?br />q个问题不需要处理,只要所有的jobs队列操作l一使用tsh.c中给出的几个函数p?br />
其他Q?br />关于信号的{发、后台前台的转换{内容,文档和书上都说得很清楚了Q这里不再赘q?br />

P.S. 多进E程序的调试大家之前应该接触的比较少Q其实这个lab大致的代码不隑ֆQ难点在于细节上的debug比较困难Q调试过E对W八章的理解很有帮助?br />

ZelluX 2008-05-17 22:28 发表评论
]]>
vim?cpp的配|和c.vim中指定的一?/title><link>http://m.tkk7.com/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://m.tkk7.com/zellux/archive/2008/04/17/193610.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/193610.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2008/04/17/193610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/193610.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/193610.html</trackback:ping><description><![CDATA[~/.vim/ftplugin/ 下有c.vim和cpp.vim<br />但是vim打开cpp和c文g时用的配置都是c.vim中指定的<br /><br />使用vim xxx.cpp -V跟踪了打开的配|列表,发现有这么一D?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 />把这行注释掉Q问题解?img src ="http://m.tkk7.com/zellux/aggbug/193610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2008-04-17 00:48 <a href="http://m.tkk7.com/zellux/archive/2008/04/17/193610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LW记(6) - 虚拟存储http://m.tkk7.com/zellux/archive/2008/02/27/182436.htmlZelluXZelluXWed, 27 Feb 2008 15:29:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/27/182436.htmlhttp://m.tkk7.com/zellux/comments/182436.htmlhttp://m.tkk7.com/zellux/archive/2008/02/27/182436.html#Feedback4http://m.tkk7.com/zellux/comments/commentRss/182436.htmlhttp://m.tkk7.com/zellux/services/trackbacks/182436.html本来想看完pagefault的处理的Q不q实验室有事情了Q只能先把这一半放上来了?/p>

面的分配与回收使用了一个叫做buddy allocator的机Ӟkernelnewbies上的解释
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.

首先在zone_struct{} 中保存了一个free_area_t数组Q这个数l记录了各种大小的空闲内存块的信息?br />include/linux/mmzone.h:


free_area_struct {}

面分配Ӟ扑ֈ适合大小的free_area_struct{}Q然后从free_list中找有没有空闲的内存块,如果没有找更大的free_area_struct{}Q因为大都?^nQ很Ҏ把大块内存拆开Q一块分配给hQ剩下的保存到对应大的队列中?br />面回收时主要的问题是如何解册多的内存片。当面块被释放Ӟ先检查是否有相同大小的相ȝ闲块存在Q如果有的话q合v来(递归q程Q?img src ="http://m.tkk7.com/zellux/aggbug/182436.html" width = "1" height = "1" />

ZelluX 2008-02-27 23:29 发表评论
]]>
Patching CVE-2008-0600, Local Root Exploithttp://m.tkk7.com/zellux/archive/2008/02/27/182572.htmlZelluXZelluXWed, 27 Feb 2008 15:15:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/27/182572.htmlhttp://m.tkk7.com/zellux/comments/182572.htmlhttp://m.tkk7.com/zellux/archive/2008/02/27/182572.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/182572.htmlhttp://m.tkk7.com/zellux/services/trackbacks/182572.html
http://kerneltrap.org/Linux/Patching_CVE-2008-0600_Local_Root_Exploit


ZelluX 2008-02-27 23:15 发表评论
]]>
[zz]LKM Rootkits on Linux x86 v2.6http://m.tkk7.com/zellux/archive/2008/02/26/182289.htmlZelluXZelluXTue, 26 Feb 2008 11:36:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/26/182289.htmlhttp://m.tkk7.com/zellux/comments/182289.htmlhttp://m.tkk7.com/zellux/archive/2008/02/26/182289.html#Feedback2http://m.tkk7.com/zellux/comments/commentRss/182289.htmlhttp://m.tkk7.com/zellux/services/trackbacks/182289.html阅读全文

ZelluX 2008-02-26 19:36 发表评论
]]>
信号量用例E?http://m.tkk7.com/zellux/archive/2008/02/21/181074.htmlZelluXZelluXThu, 21 Feb 2008 07:13:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/21/181074.htmlhttp://m.tkk7.com/zellux/comments/181074.htmlhttp://m.tkk7.com/zellux/archive/2008/02/21/181074.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/181074.htmlhttp://m.tkk7.com/zellux/services/trackbacks/181074.html/**//* semabinit.c ...  阅读全文

ZelluX 2008-02-21 15:13 发表评论
]]>
LW记(5) - ׃n内存http://m.tkk7.com/zellux/archive/2008/02/21/181046.htmlZelluXZelluXThu, 21 Feb 2008 06:10:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/21/181046.htmlhttp://m.tkk7.com/zellux/comments/181046.htmlhttp://m.tkk7.com/zellux/archive/2008/02/21/181046.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/181046.htmlhttp://m.tkk7.com/zellux/services/trackbacks/181046.html ...  阅读全文

ZelluX 2008-02-21 14:10 发表评论
]]>
Hacking the Kernel - 修改pȝ调用?/title><link>http://m.tkk7.com/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://m.tkk7.com/zellux/archive/2008/02/19/180686.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/180686.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2008/02/19/180686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/180686.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/180686.html</trackback:ping><description><![CDATA[昨天是没找到正的sys_call_table的地址Q原来我之前在虚拟机上装的ArchLinux?4位的。?br />今天在真Z成功C改了pȝ调用表?br />试环境QArchLinux 2.6.24<br /><br />1. 2.4.20以后的内核出于安全考虑Q没有导出sys_call_tableW号Q所以要先通过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 />l果一?br /><br />2. 以添加一个把uidҎroot(0)ZQ写一个内核模块:<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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">kernel.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">module.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">init.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">time.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">asm</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">uaccess.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sched.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_372_507_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    current</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">uid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> current</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">euid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> current</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">suid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> current</span><span style="COLOR: #000000">-></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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_543_741_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_778_892_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />module_init(init_addsyscall);<br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />module_exit(exit_addsyscall);<br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span></span></div><br />对应的MakefileQ?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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    obj-m :</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> addcall.o<br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />else<br /><img src="http://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    PWD  :</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> $(shell pwd)<br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />default:<br /><img src="http://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />endif<br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span></span></div><br />3. 使用insmod addcall.ko载入模块后,用dmesg可以看到the call has been added.<br />4. 试E序<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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_85_245_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://m.tkk7.com/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://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    syscall(__NR_changeuid);<br /><img src="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/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. q行./testQ即可看到类似的成功信息Q?br />Previous uid = 1002<br />Current uid = 0<br /><br />6. 卸蝲模块rmmod addcallQ此时再ơ运?/test׃p|<img src ="http://m.tkk7.com/zellux/aggbug/180686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2008-02-19 14:55 <a href="http://m.tkk7.com/zellux/archive/2008/02/19/180686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LW记(4) - ׃n内存http://m.tkk7.com/zellux/archive/2008/02/19/180612.htmlZelluXZelluXTue, 19 Feb 2008 03:30:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/19/180612.htmlhttp://m.tkk7.com/zellux/comments/180612.htmlhttp://m.tkk7.com/zellux/archive/2008/02/19/180612.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/180612.htmlhttp://m.tkk7.com/zellux/services/trackbacks/180612.html
主要的APIQ?br />shmget 创徏一块共享内?br />shmat 一块已l存在的׃n内存映射C个进E的地址I间
shmdt 取消一个进E的地址I间中的一块共享块的映?br />shmctl 理׃n内存Q和ioctl的风格很?br />
每一个新创徏的共享都׃个shmid_ds{}表示。struct shmid_ds在linux/shm.h中的定义Q?br />

其中存放权限信息的ipc_perm{}的定义ؓQ?br />include/linux/ipc.h

mode׃n的内存的d权限Q和chmod的参数有点像。mode低九位定义了讉K许可Q解释如下:
0400 用户可读  0200用户可写  0040 l成员可读?0020 l成员可写?0004 其他用户可读  0002 其他用户可写
没有执行?0100 0010 ?0001

 



ZelluX 2008-02-19 11:30 发表评论
]]>
LW记(3) - pȝ调用http://m.tkk7.com/zellux/archive/2008/02/18/180462.htmlZelluXZelluXMon, 18 Feb 2008 06:35:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/18/180462.htmlhttp://m.tkk7.com/zellux/comments/180462.htmlhttp://m.tkk7.com/zellux/archive/2008/02/18/180462.html#Feedback4http://m.tkk7.com/zellux/comments/commentRss/180462.htmlhttp://m.tkk7.com/zellux/services/trackbacks/180462.html_syscall 宏:
最单的没有参数的系l调用的实现Q?br />
/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
#define _syscall0(type,name) \
type name(
void) \
{ \
long __res; \
__asm__ 
volatile ("int $0x80" \
    : 
"=a" (__res) \
    : 
"0" (__NR_##name)); \
__syscall_return(type,__res); \
}

以getuid()ZQ_syscall0(int, getuid)展开后就变成
int getuid(void)
{
    
long __res;
    __asm__ 
volatile("int $0x80"
                    :
"=a" (__res)
                    :
"0"  (__NR_getuid));
    __syscall_return(
int, __res);
}

E序把系l调用号__NR_getuid攑օeax寄存器,然后调用软中断?br />include/asm-i386/hw_irq.h中的定义Q?br />00025   #define SYSCALL_VECTOR  0x80;

arch/i386/kernel/traps.c中把该中断号l定到system_call函数Q?br />00944   set_system_gate(SYSCALL_VECTOR,&system_call);

system_call函数在arch/i386/kernel/entry.S中:
ENTRY(system_call)
    pushl %eax            # save orig_eax
    SAVE_ALL
    GET_CURRENT(%ebx)
    testb $0x02
,tsk_ptrace(%ebx)    # PT_TRACESYS
    jne tracesys
    cmpl $(NR_syscalls)
,%eax
    jae badsys
    call *SYMBOL_NAME(sys_call_table)(
,%eax,4)
    movl %eax
,EAX(%esp)        # save the return value
ENTRY(ret_from_sys_call)
    cli                # need_resched and signals atomic test
    cmpl $
0,need_resched(%ebx)
    jne reschedule
    cmpl $
0,sigpending(%ebx)
    jne signal_return
restore_all:
    RESTORE_ALL
主要步骤Q?br />1. 保留一份系l调用号的最初拷?br />2. 保存堆栈环境(SAVE_ALL)
3. 得到当前task_struct的地址Q保存到ebx?br />4. 查系l调用号
5. Ҏ%eax调用可地址Q调用相应函?br />6. 在entry.S后面可以看到Q?br />
.data
ENTRY(sys_call_table)
    .long SYMBOL_NAME(sys_ni_syscall)    /* 
0  -  old "setup()" system call*/
        
    .long SYMBOL_NAME(sys_getuid16)
    .long SYMBOL_NAME(sys_stime)        /* 
25 */
    .long SYMBOL_NAME(sys_ptrace)
        
sys_call_table + %eax * 4是sys_getuid16地址Qkernel/uid16.c中:
asmlinkage long sys_getuid16(void)
{
    
return high2lowuid(current->uid);
}
很简单的处理代码Q返回当前进E的uid。这里asmlinkage修饰W表C函数必M堆栈中,而不是从寄存器中拿参敎ͼ防止gcc用寄存器传参优化Q?br />7. 保存q回值eax到堆栈中的eax
8. RESTORE_ALL

另外q里再提一下GET_CURRENT的实?br />
#define GET_CURRENT(reg) \
    movl $-
8192, reg; \
    andl %esp, reg
很y妙的实现Q把栈指针与掩码-8192做与操作Q末?3位清Ӟ是当前的进E的task_struct地址了?br />

接下来是利用内核模块动态添加一个系l调用的例程Q由?.4.20以后sys_call_tableW号不再被导ZQ要获得q个地址得手动hack。尚未成功,下次回过头来看看?img src ="http://m.tkk7.com/zellux/aggbug/180462.html" width = "1" height = "1" />

ZelluX 2008-02-18 14:35 发表评论
]]>
LW记(2) - 内核模块http://m.tkk7.com/zellux/archive/2008/02/10/179568.htmlZelluXZelluXSun, 10 Feb 2008 10:53:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/10/179568.htmlhttp://m.tkk7.com/zellux/comments/179568.htmlhttp://m.tkk7.com/zellux/archive/2008/02/10/179568.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/179568.htmlhttp://m.tkk7.com/zellux/services/trackbacks/179568.html阅读全文

ZelluX 2008-02-10 18:53 发表评论
]]>
Linux2.6内核驱动?.4的区?-Linux2.6内核驱动UL参考[zz]http://m.tkk7.com/zellux/archive/2008/02/10/179561.htmlZelluXZelluXSun, 10 Feb 2008 09:00:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/10/179561.htmlhttp://m.tkk7.com/zellux/comments/179561.htmlhttp://m.tkk7.com/zellux/archive/2008/02/10/179561.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/179561.htmlhttp://m.tkk7.com/zellux/services/trackbacks/179561.html 

作者:晏渭?
随着Linux2.6的发布,׃2.6内核做了新的改动Q各个设备的驱动E序在不同程度上要进行改写。ؓ了方便各位Linux爱好者我把自己整理的q分 文档share出来。该文当列D?.6内核同以前版本的l大多数变化Q可惜的是由于时间和_֊有限没有详细列出各个函数的用法?/p>

1?使用新的入口
必须包含 <linux/init.h>
module_init(your_init_func);
module_exit(your_exit_func);
老版本:int init_module(void);
void cleanup_module(voi);
2.4中两U都可以用,对如后面的入口函C必要昄包含M头文件?/p>

2?GPL
MODULE_LICENSE("Dual BSD/GPL");
老版本:MODULE_LICENSE("GPL");

3?模块参数
必须昑ּ包含<linux/moduleparam.h>
module_param(name, type, perm);
module_param_named(name, value, type, perm);
参数定义
module_param_string(name, string, len, perm);
module_param_array(name, type, num, perm);
老版本:MODULE_PARM(variable,type);
MODULE_PARM_DESC(variable,type);

4?模块别名
MODULE_ALIAS("alias-name");
q是新增的,在老版本中需?etc/modules.conf配置Q现在在代码中就可以实现?/p>

5?模块计数
int try_module_get(&module);
module_put();
老版本:MOD_INC_USE_COUNT ?MOD_DEC_USE_COUNT

http://www.fsl.cs.sunysb.edu/~sean/parser.cgi?modules

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.
However, this requires that the module be explicit in specifying ownership of character devices, using the THIS_MODULE macro.

You also have to take out all calls to MOD_INC_USE_COUNT and MOD_DEC_USE_COUNT.
       
    static struct file_operations fops =
{
         .owner = THIS_MODULE,
         .read = device_read,
         .write = device_write,
         .open = device_open,
         .release = device_release
}    
       

The 2.6 kernel considers modules that use the deprecated facility to be unsafe, and does not permit their unloading, even with rmmod -f.

2.6,2.5的kbuild不需要到处加上MOD_INC_USE_COUNT来消除模块卸载竞争(module unload raceQ?/p>

6?W号导出
只有昄的导出符h能被其他模块使用Q默认不导出所有的W号Q不必用EXPORT_NO_SYMBOLS
老板本:默认导出所有的W号Q除非用EXPORT_NO_SYMBOLS

7?内核版本?
需要在多个文g中包?lt;linux/module.h>Ӟ不必定义__NO_VERSION__
老版本:在多个文件中包含<linux/module.h>Ӟ除在L件外的其他文件中必须定义__NO_VERSION__Q防止版本重复定义?/p>

8?讑֤?
kdev_t被废除不可用Q新的dev_t拓展C32位,12位主讑֤P20位次讑֤受?
unsigned int iminor(struct inode *inode);
unsigned int imajor(struct inode *inode);
老版本:8位主讑֤P8位次讑֤?
int MAJOR(kdev_t dev);
int MINOR(kdev_t dev);

9?内存分配头文件变?
所有的内存分配函数包含在头文g<linux/slab.h>Q而原来的<linux/malloc.h>不存?
老版本:内存分配函数包含在头文g<linux/malloc.h>

10?l构体的初试?
gcc开始采用ANSI C的structl构体的初始化Ş式:
static struct some_structure = {
.field1 = value,
.field2 = value,
..
};
老版本:非标准的初试化Ş?
static struct some_structure = {
field1: value,
field2: value,
..
};

11?用户模式帮助?
int call_usermodehelper(char *path, char **argv, char **envp, int wait);
新增wait参数

12?request_module()
request_module("foo-device-%d", number);
老版本:
char module_name[32];
printf(module_name, "foo-device-%d", number);
request_module(module_name);

13?dev_t引发的字W设备的变化
1、取L讑֤号ؓ
unsigned iminor(struct inode *inode);
unsigned imajor(struct inode *inode);
2、老的register_chrdev()用法没变Q保持向后兼容,但不能访问设备号大于256的设备?
3、新的接口ؓ
a)注册字符讑֤范围
int register_chrdev_region(dev_t from, unsigned count, char *name);
b)动态申请主讑֤?
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, char *name);
看了q两个函数郁闷吧^_^Q怎么和file_operationsl构联系h啊?别急!
c)包含 <linux/cdev.h>Q利用struct cdev和file_operationsq接
struct cdev *cdev_alloc(void);
void cdev_init(struct cdev *cdev, struct file_operations *fops);
int cdev_add(struct cdev *cdev, dev_t dev, unsigned count);
Q分别ؓQ申请cdevl构Q和fopsq接Q将讑֤加入到系l中Q好复杂啊!Q?
d)void cdev_del(struct cdev *cdev);
只有在cdev_add执行成功才可q行?
e)辅助函数
kobject_put(&cdev->kobj);
struct kobject *cdev_get(struct cdev *cdev);
void cdev_put(struct cdev *cdev);
q一部分变化和新增的/sys/dev有一定的兌?/p>

14?新增?proc的访问操?
<linux/seq_file.h>
以前?proc中只能得到string, seq_file操作能得到如long{多U数据?
相关函数Q?
static struct seq_operations 必须实现q个cMfile_operations得数据中得各个成员函数?
seq_printf()Q?
int seq_putc(struct seq_file *m, char c);
int seq_puts(struct seq_file *m, const char *s);
int seq_escape(struct seq_file *m, const char *s, const char *esc);
int seq_path(struct seq_file *m, struct vfsmount *mnt,
struct dentry *dentry, char *esc);
seq_open(file, &ct_seq_ops);
{等

15?底层内存分配
1?lt;linux/malloc.h>头文件改?lt;linux/slab.h>
2、分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO ?GFP_NOFS
3、新增__GFP_REPEATQ__GFP_NOFAILQ__GFP_NORETRY分配标志
4、页面分配函数alloc_pages()Qget_free_page()被包含在<linux/gfp.h>?
5、对NUMApȝ新增了几个函敎ͼ
a) struct page *alloc_pages_node(int node_id, unsigned int gfp_mask, unsigned int order);
b) void free_hot_page(struct page *page);
c) void free_cold_page(struct page *page);
6?新增Memory pools
<linux/mempool.h>
mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data);
void *mempool_alloc(mempool_t *pool, int gfp_mask);
void mempool_free(void *element, mempool_t *pool);
int mempool_resize(mempool_t *pool, int new_min_nr, int gfp_mask);

16?per-CPU变量
get_cpu_var();
put_cpu_var();
void *alloc_percpu(type);
void free_percpu(const void *);
per_cpu_ptr(void *ptr, int cpu)
get_cpu_ptr(ptr)
put_cpu_ptr(ptr)
老版本?
DEFINE_PER_CPU(type, name);
EXPORT_PER_CPU_SYMBOL(name);
EXPORT_PER_CPU_SYMBOL_GPL(name);
DECLARE_PER_CPU(type, name);
DEFINE_PER_CPU(int, mypcint);
2.6内核采用了可剥夺得调度方式这些宏都不安全?/p>

17?内核旉变化
1、现在的各个q_的HZ?
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.
2、由于HZ的变化,原来的jiffies计数器很快就溢出了,引入了新的计数器jiffies_64
3?include <linux/jiffies.h>
u64 my_time = get_jiffies_64();
4、新的时间结构增加了U秒成员变量
struct timespec current_kernel_time(void);
5、他的timer函数没变Q新?
void add_timer_on(struct timer_list *timer, int cpu);
6、新增纳U延时函数
ndelay()Q?
7、POSIX clocks 参考kernel/posix-timers.c

18?工作队列QworkqueueQ?
1、Q务队列(task queue Q接口函数都被取消,新增了workqueue接口函数
struct workqueue_struct *create_workqueue(const char *name);
DECLARE_WORK(name, void (*function)(void *), void *data);
INIT_WORK(struct work_struct *work,
void (*function)(void *), void *data);
PREPARE_WORK(struct work_struct *work,
void (*function)(void *), void *data);
2、申明struct work_structl构
int queue_work(struct workqueue_struct *queue, struct work_struct *work);
int queue_delayed_work(struct workqueue_struct *queue, struct work_struct *work,
unsigned long delay);
int cancel_delayed_work(struct work_struct *work);
void flush_workqueue(struct workqueue_struct *queue);
void destroy_workqueue(struct workqueue_struct *queue);
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct work_struct *work, unsigned long delay);

19?新增创徏VFS?libfs"
libfsl创Z个新的文件系l提供了大量的API.
主要是对struct file_system_type的实现?
参考源代码Q?
drivers/hotplug/pci_hotplug_core.c
drivers/usb/core/inode.c
drivers/oprofile/oprofilefs.c
fs/ramfs/inode.c
fs/nfsd/nfsctl.c (simple_fill_super() example)

20?DMA的变?
未变化的有:
void *pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma_handle);
void pci_free_consistent(struct pci_dev *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle);
变化的有Q?
1?void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle);
2、列举了映射方向Q?
enum dma_data_direction {
DMA_BIDIRECTIONAL = 0,
DMA_TO_DEVICE = 1,
DMA_FROM_DEVICE = 2,
DMA_NONE = 3,
};
3、单映射
dma_addr_t dma_map_single(struct device *dev, void *addr, size_t size, enum dma_data_direction direction);
void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction direction);
4、页面映?
dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction direction);
void dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction direction);
5、有关scatter/gather的函敎ͼ
int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction);
void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, enum dma_data_direction direction);
6、非一致性映(Noncoherent DMA mappingsQ?
void *dma_alloc_noncoherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
void dma_sync_single_range(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size,
enum dma_data_direction direction);
void dma_free_noncoherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle);
7、DAC (double address cycle)
int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask);
void pci_dac_dma_sync_single(struct pci_dev *dev, dma64_addr_t dma_addr, size_t len, int direction);

21?互斥
新增seqlock主要用于Q?
1、少量的数据保护
2、数据比较简?没有指针)Qƈ且用频率很?
3、对不生Q何副作用的数据的讉K
4、访问时写者不被饿?
<linux/seqlock.h>
初始?
seqlock_t lock1 = SEQLOCK_UNLOCKED;
或seqlock_t lock2; seqlock_init(&lock2);
void write_seqlock(seqlock_t *sl);
void write_sequnlock(seqlock_t *sl);
int write_tryseqlock(seqlock_t *sl);
void write_seqlock_irqsave(seqlock_t *sl, long flags);
void write_sequnlock_irqrestore(seqlock_t *sl, long flags);
void write_seqlock_irq(seqlock_t *sl);
void write_sequnlock_irq(seqlock_t *sl);
void write_seqlock_bh(seqlock_t *sl);
void write_sequnlock_bh(seqlock_t *sl);
unsigned int read_seqbegin(seqlock_t *sl);
int read_seqretry(seqlock_t *sl, unsigned int iv);
unsigned int read_seqbegin_irqsave(seqlock_t *sl, long flags);
int read_seqretry_irqrestore(seqlock_t *sl, unsigned int iv, long flags);

22?内核可剥?
<linux/preempt.h>
preempt_disable()Q?
preempt_enable_no_resched()Q?
preempt_enable_noresched()Q?
preempt_check_resched()Q?/p>

23?眠和唤醒
1、原来的函数可用Q新增下列函敎ͼ
prepare_to_wait_exclusive()Q?
prepare_to_wait()Q?
2、等待队列的变化
typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync);
void init_waitqueue_func_entry(wait_queue_t *queue, wait_queue_func_t func);

24?新增完成事gQcompletion eventsQ?
<linux/completion.h>
init_completion(&my_comp);
void wait_for_completion(struct completion *comp);
void complete(struct completion *comp);
void complete_all(struct completion *comp);

25?RCUQRead-copy-updateQ?
rcu_read_lock();
void call_rcu(struct rcu_head *head, void (*func)(void *arg),
void *arg);

26?中断处理
1、中断处理有q回g?
IRQ_RETVAL(handled)Q?
2、cli(), sti(), save_flags(), ?restore_flags()不再有效Q应该用local_save
_flags() 或local_irq_disable()?
3、synchronize_irq()函数有改?
4、新增int can_request_irq(unsigned int irq, unsigned long flags);
5?request_irq() 和free_irq() ?<linux/sched.h>改到?<linux/interrupt.h>

27?异步I/O(AIO)
<linux/aio.h>
ssize_t (*aio_read) (struct kiocb *iocb, char __user *buffer, size_t count, loff_t pos);
ssize_t (*aio_write) (struct kiocb *iocb, const char __user *buffer, size_t count, loff_t pos);
int (*aio_fsync) (struct kiocb *, int datasync);
新增Cfile_operationl构中?
is_sync_kiocb(struct kiocb *iocb)Q?
int aio_complete(struct kiocb *iocb, long res, long res2);

28?|络驱动
1、struct net_device *alloc_netdev(int sizeof_priv, const char *name, void (*setup)(struct net_device *));
struct net_device *alloc_etherdev(int sizeof_priv);
2、新增NAPI(New API)
void netif_rx_schedule(struct net_device *dev);
void netif_rx_complete(struct net_device *dev);
int netif_rx_ni(struct sk_buff *skb);
(老版本ؓnetif_rx())

29?USB驱动
老版本struct usb_driver取消了,新的l构体ؓ
struct usb_class_driver {
char *name;
struct file_operations *fops;
mode_t mode;
int minor_base;
};
int usb_submit_urb(struct urb *urb, int mem_flags);
int (*probe) (struct usb_interface *intf,
const struct usb_device_id *id);

30?block I/O ?
q一部分做的改动最大。不叙?/p>

31?mmap()
int remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
struct page *(*nopage)(struct vm_area_struct *area, unsigned long address, int *type);
int (*populate)(struct vm_area_struct *area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot);
struct page *vmalloc_to_page(void *address);

32?零拷贝块I/O(Zero-copy block I/O)
struct bio *bio_map_user(struct block_device *bdev, unsigned long uaddr, unsigned int len, int write_to_vm);
void bio_unmap_user(struct bio *bio, int write_to_vm);
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);

33?高端内存操作kmaps
void *kmap_atomic(struct page *page, enum km_type type);
void kunmap_atomic(void *address, enum km_type type);
struct page *kmap_atomic_to_page(void *address);
老版本:kmap() ?kunmap()?/p>

34?驱动模型
主要用于讑֤理?
1?sysfs
2?Kobjects

推荐文章Q?
http:/www-900.ibm.com/developerWorks/cn/linux/kernel/l-kernel26/index.shtml
http:/www-900.ibm.com/developerWorks/cn/linux/l-inside/index.shtml

2.6里不需要再定义“__KERNEL__”?#8220;MODULE”了?
用下面的Makefile文g~译Q?/p>

代码:

    obj-m   := hello.o

    KDIR   := /lib/modules/$(shell uname -r)/build
    PWD      := $(shell pwd)
    default:
              $(MAKE) -C $(KDIR) M=$(PWD) modules



ZelluX 2008-02-10 17:00 发表评论
]]>
多文件内核模块的~译http://m.tkk7.com/zellux/archive/2008/02/10/179542.htmlZelluXZelluXSun, 10 Feb 2008 04:34:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/10/179542.htmlhttp://m.tkk7.com/zellux/comments/179542.htmlhttp://m.tkk7.com/zellux/archive/2008/02/10/179542.html#Feedback1http://m.tkk7.com/zellux/comments/commentRss/179542.htmlhttp://m.tkk7.com/zellux/services/trackbacks/179542.html 2.6内核~译pȝ提供了一U不同的写法?br /> q里obj-m是树根,hello-objs是hello的两个结炏V?br />
ifneq ($(KERNELRELEASE),)
        obj-m :
= hello.o
        hello-objs :
= start.o stop.o
else
        KERNELDIR ?
= /lib/modules/$(shell uname -r)/build
        PWD  :
= $(shell pwd)

default:
        $(MAKE) -C $(KERNELDIR) M
=$(PWD) modules

endif


ZelluX 2008-02-10 12:34 发表评论
]]>
Linux 内核相关资料链接http://m.tkk7.com/zellux/archive/2008/02/06/179405.htmlZelluXZelluXWed, 06 Feb 2008 11:00:00 GMThttp://m.tkk7.com/zellux/archive/2008/02/06/179405.htmlhttp://m.tkk7.com/zellux/comments/179405.htmlhttp://m.tkk7.com/zellux/archive/2008/02/06/179405.html#Feedback5http://m.tkk7.com/zellux/comments/commentRss/179405.htmlhttp://m.tkk7.com/zellux/services/trackbacks/179405.html 如果一些文章的链接失效Qgoogle相应的标题应该还是很Ҏ扑ֈ其他|站的{载的?br />
内核调度Q?/strong>
Inside the Linux scheduler
 
讲的是用expired/active两个数组l护的O(1)法Q大多数?.6内核的书上都会提到的调度法 (2008-02-06)

Multiprocessing with the Completely Fair Scheduler
最新的2.6.23采用的CFSQ还没搞?(2008-02-06)

http://www.ibm.com/developerworks/cn/linux/l-cn-scheduler/index.html
Linux 调度器发展简q?(2008-02-13)

内核模块Q?br />2.6 内核中的模块注入 (2008-02-17)
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=security&Number=536404&page=0&view=collapsed&sb=5&o=31&fpart

pȝ调用Q?/strong>
Linux 2.6 新增?vsyscall pȝ服务调用机制 (2008-02-18)
http://blog.csdn.net/wishfly/archive/2005/01/23/264435.aspx

Linux on-the-fly kernel patching without LKM (2008-02-19)
http://doc.bughunter.net/rootkit-backdoor/kernel-patching.html

内存理Q?br />http://linux-mm.org/LinuxMM
Linux-mm.org is a wiki for documenting how memory management works and for coordinating new memory management development projects. (2008-02-21)

q发同步Q?/strong>
http://hi.baidu.com/charleswen/blog/item/61f3e40ebc26dcce7acbe1c8.html
Linux内核中的同步和互斥分析报?(2008-02-21)

http://www-128.ibm.com./developerworks/cn/linux/kernel/sync/index.html
Linux 2.4.x内核同步机制 (2008-02-22)

Big Picture:
http://www.linuxdriver.co.il/kernel_map
Interactive Linux kernel map (2008-02-16)
把内怸的函数相互调用做成了一张可攑֤~小的地图,单击相应函数名会跌{到lxr的相应代码链接?

~程资料Q?br />http://www.jegerlehner.ch/intel/
Intel Assembler CodeTable 80x86 (2008-02-21)

相关站点Q?br />http://kernelnewbies.org
Linux Kernel Newbies

http://bbs4.newsmth.net/bbsdoc.php?board=KernelTech
水木KernelTech?br />
http://www.phrack.org
Phrack is an underground ezine made by and for hackers.
有不和内核相关的hack资料



ZelluX 2008-02-06 19:00 发表评论
]]>
《Linux讑֤讑֤驱动E序Q第三版Q》学习笔?链接http://m.tkk7.com/zellux/archive/2007/12/29/171603.htmlZelluXZelluXSat, 29 Dec 2007 10:50:00 GMThttp://m.tkk7.com/zellux/archive/2007/12/29/171603.htmlhttp://m.tkk7.com/zellux/comments/171603.htmlhttp://m.tkk7.com/zellux/archive/2007/12/29/171603.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/171603.htmlhttp://m.tkk7.com/zellux/services/trackbacks/171603.html
http://blog.csdn.net/wooin/category/156101.aspx

《Linux讑֤讑֤驱动E序Q第三版Q》学习笔C三:sleepy讑֤的?

ZelluX 2007-12-29 18:50 发表评论
]]>
Arch下配|samba服务http://m.tkk7.com/zellux/archive/2007/10/17/153425.htmlZelluXZelluXTue, 16 Oct 2007 17:36:00 GMThttp://m.tkk7.com/zellux/archive/2007/10/17/153425.htmlhttp://m.tkk7.com/zellux/comments/153425.htmlhttp://m.tkk7.com/zellux/archive/2007/10/17/153425.html#Feedback2http://m.tkk7.com/zellux/comments/commentRss/153425.htmlhttp://m.tkk7.com/zellux/services/trackbacks/153425.html 下面是在Arch下的单安装方法:
- pacman -Sy samba
- (root) cp /etc/samba/smb.conf.default /etc/samba/smp.conf
- (root) vim /etc/samba/smb.conf Q或者用其他的~辑器)

[globle]选项?br /> workgroup = HOME    # l名Q在Windows中默认是MSHOME或者WORKGROUP
netbios name = ZelluX  # 在网上邻居中昄的机器名
encrypt passwords = yes  # 应该设ؓyes。但是如果要在Windows 98/95上访问你的服务器Q得把这个设为noQ因为它们不支持密码的加密传输?br />
[homes]选项?br /> 最单的配置Q登陆后方可讉KQ:
browseable = no
read only = no   # 或者writable = yes

匿名可读Q登陆后可以修改Q?br /> public = yes
writable = yes
write list = @staff

如果惌Windows用户看到一个清晰的目录Q隐?开头的文gQ比如~/.bashrcQ:
[homes]
path = /home/%u/smb
browseable = no
read only = no
同时要在每位用户的主目录下徏立一个smb目录。可以通过?etc/skel目录下徏立smbQ从而自动在所有用L录下建立该目?br /> mkdir /etc/skel/smb

要共享其他的目录也很ҎQ只要设|path和valid users属性即?br /> [music]
path = /mnt/windows/Music/
browseable = yes
read only = yes
valid users = Bryan, Michael, David, Jane
valid users属性指定登陆后有权限访问到q个目录的用?br />
- (root) 使用 smbpasswd -a 用户?/em>  增加允许登陆的用Pq指定他们的登陆密码
- (root) /etc/rc.d/samba stop 停止samba服务
- (root) /etc/rc.d/samba start 启动samba服务


ZelluX 2007-10-17 01:36 发表评论
]]>
阅读linux源代码的工具---lxr和glimpse?/title><link>http://m.tkk7.com/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://m.tkk7.com/zellux/archive/2007/10/08/151097.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/151097.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2007/10/08/151097.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/151097.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/151097.html</trackback:ping><description><![CDATA[<a >http://10.132.140.73/lxr/http/blurb.html</a><br /> <br /> 在机房搭了一个,原本以ؓ有笔记的功能Q装好以后才发现只能阅读用,不过搜烦功能q是很强大的?br /> <br /> 转蝲Q部分修改(标ؓU色Q?br /> <br /> <p>  我们在阅读linux源代码时都有q样的体?核心的组l相Ҏ散,在看一个文件时往往要牵涉到其他的头文g、源代码文g。如此来回蟩转寻扑֏量、常量、函数的定义十分不方便,q样折腾几次Q便使读代码的心情降C低点?br /> <br /> <strong>lxr(linux cross reference)是一个解册个问题的工具Q?/strong>他对你指定的源代码文件徏立烦引数据库Q利用perl脚本CGI动态生成包含源码的web面Q你可以用Q何一U浏览器查阅。在此web中Q所有的变量、常量、函数都以超q接的Ş式给出,十分方便查阅。比如你在阅?usr/src/linux/net/socket.c的源代码Q发现函?get_empty_inode不知道是如何以及在哪里定义的Q这时候你只要点击get_empty_inode,lxr返回此函数的定义、实C及各ơ引用是在什么文件的哪一行,注意Q这些信息也是超q接Q点d直接跌{到相应的文g相应的行。另外lxrq提供标识符搜烦、文件搜索,l合E序 glimpseq可以提供对所有的源码文gq行全文索,甚至包括注释Q?br /> <br /> 下面结合实例介l一下lxr和glimpse的基本安装和使用Q由于glimpse比较单,׃它开始:<br /> <br /> 首先讉K站点Q?<a target="_blank">http://glimpse.cs.arizona.edu/</a> 得到glimpse的源?/p> <p>,比如我得到的是glimpse-4.12.5.tar.gz . 用rootdQ在M目录下用tar zxvf glimpse-4.12.5.tar.gz解开压羃包,在当前目录下出现新目录glimpse-4.12.5 .</p> <p>q入该目录,执行</p> <p><span style="color: red"> <p>./configure<br /> make<br /> make install</p> </span> <p> </p> <p> 如果单独使用glimpseQ那么只要简单的执行glimpseindex foo卛_Q其中foo是你惌索引的目录,比如说是/usr/src/linux .glimpseindex的执行结果是在你的v始目录下产生若干.glimpse*的烦引文件?</p> <p>  然后你只要执行glimpse yourstring卛_查找/usr/src/linux下所有包含字W串yourstring的文件?</p> <p>  对于lxrQ你可以讉K<a target="_blank">lxr.linux.no</a>得到它的源代码解包后Q遵循如下步骤:<br /> /*下面的文字来源于lxr的帮助文档以及本人的安装体会*/<br /> <br /> 1)修改Makefile中的变量PERLBIN和INSTALLPREFIX,使它们分别ؓ perlE序的位|和你想lxr安装的位|?在我的机器上QPERLBIN的gؓ/usr/bin/perl .至于INSTALLPREFIXQ有如下原则Qlxr的安装\径必Lweb服务器能有权限访问。因此它的值简单一点可?/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可Q意v名,且位|Q?glimpsebin: /usr/bin/glimpse  #可执行程序glimpse的位|?</p> <p>4)?INSTALLPREFIX/http/下增加一个文?htaccess内容Q?br /> <Files ~ (source|search|ident|diff|find)$> ***<br /> SetHandler cgi-script <br /> </Files> </p> 上面q个文g保证Apache server几个perl文g作ؓcgi-script. <br /> <br /> 5)按照lxr.conf中的讄建立dbdir ,按照上例,建立目录 <br /> /home/httpd/html/lxr/dbdir <br /> q入q个目录执行$INSTALLPREFIX/bin/genxref yourdir <br /> <br /> 其中yourdir是源码目录,比如/usr/src/linux <br /> <br /> 如果要结合glimpseQ则执行glimpseindex -H . yourdir <br /> <br /> 6)修改 /etc/httpd/conf/<span style="color: red">httpd</span>.conf ,加入 <br /> <br /> <Directory /home/httpd/html/lxr/http><br /> Options All <br /> AllowOverride All <br /> order allow,deny <br /> allow from all <br /> </Directory> <br /> <br /> 7)q入/etc/rc.d/init.d/ 执行 <br /> <br /> killall httpd <br /> ./httpd start <br /> <br /> q入X Q用览?<a href="http://yourip/lxr/http/blurb.html" target="_blank">http://yourIP/lxr/http/blurb.html</a><br /> <br /> 大功告成 Q这下你可以舒心的读源码了? <img src ="http://m.tkk7.com/zellux/aggbug/151097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2007-10-08 16:27 <a href="http://m.tkk7.com/zellux/archive/2007/10/08/151097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>proftpd登陆速度慢的问题的解?/title><link>http://m.tkk7.com/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://m.tkk7.com/zellux/archive/2007/10/06/150641.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/150641.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2007/10/06/150641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/150641.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/150641.html</trackback:ping><description><![CDATA[proftpd.conf中增加两行设|:<br /> UseReverseDNS off<br /> IdentLookups off <br /> <br /> <br /> Come From Alacner BlogQhttp://blog.alacner.com/post/168.htm <img src ="http://m.tkk7.com/zellux/aggbug/150641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2007-10-06 09:15 <a href="http://m.tkk7.com/zellux/archive/2007/10/06/150641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zz 整理的内核学习计?/title><link>http://m.tkk7.com/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://m.tkk7.com/zellux/archive/2007/09/24/147735.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/147735.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2007/09/24/147735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/147735.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/147735.html</trackback:ping><description><![CDATA[开始看lkdQ不q最新可以抽出来的时间不多,下星期Java课还有projectQ还要写一份robocode的项目文档,然后~译课也得跟上,p高口课还得准备资料。。。先转一学习计划过?br /> <br /> <br /> 发信? ccedcced (turing), 信区: KernelTech<br /> ? ? 整理的内核学习计?br /> 发信? 水木C֌ (Fri Jan  6 18:15:35 2006), 转信<br /> <br /> 内核学习现在开?<br /> Ҏ是Q?<br /> MQlkdQ?源代码阅?->目 <br /> <br /> 先从基础做vQ?<br /> 希望大家都能U极地参与讨论,写读书笔记和源码阅读W记Q?<br /> ------------------------------<br /> 内核学习W一周计?-Are you ready? <br /> <br /> 旉:11??-11??<br /> 阅读内容Q前a和第一?<br /> DQ这是比较容易阅ȝ开头部分,内容比较而且常识性的内容比较多。请在阅ȝq程中考虑如下的问题: <br /> <br /> 1.linux和unix相比有哪些特点? <br /> 2.内核~程和用L间编E相比有哪些不同之处Q?<br /> 3.自己~译一下内核,你编译成功了么?如果不成功,有什么问题?使用你新~译的内核, <br />   能顺利启动么Q有什么问题? <br /> 4.linux内核源代码树中你能找到sg讑֤驱动是在那个文g中实现的么?sg是什么含? <br />   清楚C解一下内怸源代码树的结构?<br /> Are you ready? <br /> ------------------------------<br /> 内核学习W二周计?<br /> 旉:11.7-11.13 <br /> 内容: <br />  主要是lkd中文版第一版第二章(英文W二版版W三?的内容,比较重要?<br /> <br />  1.和进E管理相关的内核文g都有哪些?扑և来大致浏览一? <br />  2.什么是q程和线E?在Linux中有什么独特的地方Q?<br />  3.什么是q程描述W?怎样得到当前q程的进E描q符Q进E的内核栈有多大Q?<br />  4.q程的状态都有哪些?在什么情况下发生转化Q?<br />  5.Linux中所有进E之间的关系是怎么LQ?<br />  6.用户U程和内核线E的区别和联p? <br />  7.Linux是怎样创徏q程和线E的Q?<br />  8.Linux怎样l结q程Q?<br />  9.对照相应的内核源代码文gQ分析一下问?????<br /> ------------------------------<br /> 内核学习W三、四周计?<br /> 内核学习W三、四周计划: <br /> <br /> 旉Q?1.14-11.27 <br /> <br /> 调度是操作系l中非常重要的部分,也是最核心的东ѝ通过学习q一章,希望大家都能大致掌握Linux的调度策略,以及Z么要q么做,Linux相比其它的系l有什么优炏V重点多分析源代码中的算法实玎ͼQ我希望我能有时间和大家一起分析代码,也希望大家积极主动地分析一些代码片断?<br /> <br /> 学习内容Q?<br /> 1.q程调度最基本的原理是什么? <br /> 2.列D出几个I/O消耗性和处理器消耗型的进E?<br /> 3.Linux都采用了哪些调度的算法?详细解释一下这些算法?<br /> 4.q程什么时间进入运行态?什么时间进入休眠(dQ状态? <br /> 5.了解q程抢占的算法; <br /> 6.讨论一下Linuxq程调度的实时性怎么Pq有哪些需要提高的地方Q?<br /> 7.自己查找q程调度的相xӞ分析为题3-6?<br /> ------------------------------<br />  内核学习W五周计?<br /> 旉Q?1.28--12.5 <br /> <br /> 1、什么是pȝ调用Q?<br /> <br /> 2、ؓ什么需要系l调用? <br /> <br /> 3、实现系l调用相关的代码有哪些,扑և来浏览一?<br /> <br /> 4、详l阅读getuid()q一下系l调用的实现代码 <br /> <br /> 5、如何导出sys_call_tableQ有几种ҎQ注意不同内核版本的区别 <br /> <br /> 6、尝试自qkerneld一个简单的pȝ调用 <br />    功能要求Q调用这个系l调用,使用Luid{于0。(q个题目取自《边q边学》) <br /> 7、采用添加系l调用的方式实现一个新功能的利弊有哪些Q替代方法是什么? <br /> ------------------------------<br /> 内核学习W六周计?<br /> <br /> q一周就ȝ了一下中断和下半部相关的知识点,供大家参考一下!同时附g里有我以前学习时候的W记Q写的不好请多多指教?<br /> 内核学习W六周计? <br /> 1、如何理解中断、中断上下文和进E上下文的区别、ؓ何中断不能睡?<br /> 2、关于x86中选择子、描q符和各U门的理?<br /> 3、查阅相兌料和内核源码理解Q?<br /> 中断是如何发生以及硬件和内核是如何相应的Q如何返回的 <br /> x86上中断发生时上下?寄存?如何保存以及中断q回时上下文如何恢复的,pȝ的第一个Q务是如何启动?<br /> <br /> 4、内怸安排下半部的理由 <br /> 5、Y中断及其他的下半部策略适用于什么样的Q务和场合Q?<br /> 6、下半部可以睡眠么?Z么? <br /> 7?.4?.6内核中下半部包括哪些部分Qؓ?.6内核相比2.4内核会做q样的改q?<br /> 8、阅d怸关于软中断、tasklet以及工作队列的代码、相关书c和资料Qȝ如下两个问题: <br /> 软中断、tasklet以及工作队列是如何初始化Q注册以及触发的Q用了哪些关键的数据结构及内核变量Q?<br /> 软中断、tasklet以及工作队列都在什么场合下使用Q?<br /> ------------------------------<br /> 内核学习W七周计?<br /> 内核学习W七周计划: <br /> 旉Q?2?3?-12?9?<br /> 内容Q内核同步的理论知识?<br />  <br /> 问题Q?<br /> 1.Z么要q行内核的同步? <br /> 2.内核中怎么定义原子操作Q?<br /> 3.竞争产生的条件与加锁的顺序? <br /> 4.要保护的对象Q?<br /> 5.死锁产生的条件与解决办法Q?<br /> 6.你有什么比较好的方法来调试多线E的E序Q?<br /> 7.据一个内怸产生竞争的例子?<br /> ------------------------------<br /> 内核学习W八周计?<br /> W八周: <br /> 内容: <br /> 上一周我们分析了内核中的同步Q这一ơ我们要接触的是内核中怎么q行同步和互斥?<br />    <br /> 问题Q?<br /> 1.原子操作的粒度问题; <br /> 2.自旋锁的设计及其应用场合,分析自旋锁; <br /> 3.信号量及其应用,信号量怎么使用Q?<br /> 4.锁的_度以及其分c; <br /> 5.内核可抢占性的实现及其与锁的关p; <br /> 6.smp中需要考虑哪些同步与互斥; <br /> ------------------------------   <br /> 内核学习W九周计?<br /> 前面的话Q?<br />    内核学习已经q行了两个月的时_LKDq本书我们基本上已经q行了一半。希望大家在下面多用功?<br /> 我们在这个计划里面列出来的只是一些比较基本的问题Q而且我们没有l出问题的答案,但是只要你在下面 <br /> 用功了,我想{案在q本书里和源代码里面?<br /> <br /> 本周内容QTIMERS AND TIME MANAGEMENT <br /> <br /> 1.HZ和jiffies值的定义? <br /> 2.内核中怎样解决jiffies的回l?Z么这样可以解决jiffies回绕Q?<br /> 3.旉中断处理E序有哪些值得注意的地方? <br /> 4.xtime_lock锁和seqlock? <br /> 5.定时器的实现、用和竞争条gQ?<br /> 6.udelay()&mdelay()? <br /> ------------------------------  <br />  内核学习W十周计划: <br /> 内存理 <br />     学习内容 <br />         内存理是比较庞大的一个部分,在lkdq本书中用了很少的篇q,从这里面我们基本能看清楚 内存理的概貌。《情景分析》一书关于内存管理的部分讲得比较多,代码分析比较透彻也比较深入?但是相对的难度也比较大,先看看lkdq本书,然后再看《情景分析》一书的内存理?<br />     <br />    问题Q?<br />         1.内核中内存的分页、分区; <br />         2.内核中有哪些函数来获得内存?内核中分配内存要注意什么? <br />         3.Z么用slab?slab对象的详l分析?<br />         4.内核栈上内存的静态分配问题; <br /> <img src ="http://m.tkk7.com/zellux/aggbug/147735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2007-09-24 11:22 <a href="http://m.tkk7.com/zellux/archive/2007/09/24/147735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pȝ恢复?/title><link>http://m.tkk7.com/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://m.tkk7.com/zellux/archive/2007/09/19/146515.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/146515.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2007/09/19/146515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/146515.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/146515.html</trackback:ping><description><![CDATA[原来只给机房电脑的Arch配了20G的空_现在惌个virtualboxQ空间自然不够了Q于是到windows下删了一个分区用于挂?home的内宏V?br /> 然后问题出来了Q由于少了一个分区,原来arch所在的分区(sda8)向前UM一?sda7)Q结果grub启动出错Q无法进入系l?br /> 从机房管理员那借来Redhat的安装盘Q进入rescue模式Q挂在好/dev/sda7后,修改boot/grub/menu.lst中的盘符Q重启,问题依旧?br /> 只好先恢复winxp再说Q用winxp工具盘启动后Qfdisk /mbrQ重启,安装grub for dosQ再重启Q进入grub<br /> grub> root (hd0,6)<br /> grub> setup (hd0)<br /> 报错Q估计是dos下的问题Q只好手动进入arch<br /> grub> root (hd0,6)<br /> grub> kernel /boot/vmlinuz26 root=/dev/sda7 ro<br /> grub> initrd /boot/kernel26.img<br /> grub> boot<br /> q入后仍然有错误Q说是sda8无法讉KQ这时才惌vfstabq没改过Q但是当前的挂蝲的sda7q是只读的,只好再用redhat的启动盘启动Q挂载sda7后修改fstab中的信息?br /> <br /> 问题解决?br /> <br /> <img src ="http://m.tkk7.com/zellux/aggbug/146515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2007-09-19 16:07 <a href="http://m.tkk7.com/zellux/archive/2007/09/19/146515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz] proftpd 学习W记http://m.tkk7.com/zellux/archive/2007/09/18/146293.htmlZelluXZelluXTue, 18 Sep 2007 15:16:00 GMThttp://m.tkk7.com/zellux/archive/2007/09/18/146293.htmlhttp://m.tkk7.com/zellux/comments/146293.htmlhttp://m.tkk7.com/zellux/archive/2007/09/18/146293.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/146293.htmlhttp://m.tkk7.com/zellux/services/trackbacks/146293.html阅读全文

ZelluX 2007-09-18 23:16 发表评论
]]>
Arch 安装手记http://m.tkk7.com/zellux/archive/2007/09/12/144520.htmlZelluXZelluXWed, 12 Sep 2007 08:03:00 GMThttp://m.tkk7.com/zellux/archive/2007/09/12/144520.htmlhttp://m.tkk7.com/zellux/comments/144520.htmlhttp://m.tkk7.com/zellux/archive/2007/09/12/144520.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/144520.htmlhttp://m.tkk7.com/zellux/services/trackbacks/144520.html
2. Network IP, Gateway, Mask讄都正常,但无法ping到网养IMwiki后终于发现是Windows在捣?br /> Windows中关机后会自动将Realtek 8168 8169 8101 8111|卡用Q直到再ơ进入Windows后才会恢?br /> 解决Ҏ是在讑֤理?>|络适配?>Realtek xxx->高中把"Wake-On-Lan After Shutdown"设ؓEnable

3. 几个pacman常用的参?br /> pacman -Sy  更新本地包的数据?br /> pacman -S package_name1 package_name2 ...  安装?br /> pacman -S extra/package_name   指定安装某个版本的包
pacman -Su  更新所有安装的包,通常和Sy参数合ƈ?Syu
pacman -Ss  搜烦
pacman -U *.pkg.tar.gz  安装本地?/p>

4. 好不Ҏ+莫名奇妙地配好了昑֍Qstartx可以跑v来了
然后q行gnome-sessionQ提CGtk WARNING **: Cannot open display:
找了一堆解x法,ȝ有一个可行的Q?
在~/.xinitrc中增加gnome-sessionQ然后启动startx

 



ZelluX 2007-09-12 16:03 发表评论
]]>
[zz]一个很不错的Ubuntu配置帖子http://m.tkk7.com/zellux/archive/2007/09/09/143740.htmlZelluXZelluXSun, 09 Sep 2007 02:52:00 GMThttp://m.tkk7.com/zellux/archive/2007/09/09/143740.htmlhttp://m.tkk7.com/zellux/comments/143740.htmlhttp://m.tkk7.com/zellux/archive/2007/09/09/143740.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/143740.htmlhttp://m.tkk7.com/zellux/services/trackbacks/143740.html ?nbsp; ? 我的 Ubuntu 7.04 Cookbook
发信? 日月光华 (2007q?9?9?9:19:35 星期?, 站内信g

最q装?Ubuntu 7.04Q写了一个简单的 CookbookQ记录了自己遇到的一些问题和解决
ҎQ希望对大家有帮助?br />
cook01 中文字体化

(1) 得到 simsun.ttc tahoma.ttf tahomabd.ttf  verdana.ttf verdanab.ttf
verdanai.ttf verdanaz.ttf 几个个字体文?Q可以从 Windows ?Fonts 文g夹中?br /> ?
(2) ?nautilus 打开pȝ的字体文件夹Qnautilus fonts:///
(3) 第 (1) 步中的几个个字体复制q第 (2) 步打开的字体文件夹?br /> (4) 创徏 /etc/fonts/local.conf 文gQ内容如 [附录1] (本文最底端)
(5) 重新启动 X: Ctrl + Alt + Backspace
(6) 打开 gnome 字体讄Qgnome-font-propertiesQ设|前四个字体?Tahoma
(7) 打开 firefox 字体讄Q将 Serif 讄?SimSunQSans-serif 讄?TahomaQ?br /> Monospace 讄?SimSunQƈ且允许网自由选择字体
(8) 重新启动 X, enjoy~

点评Q该优化Ҏ?Windows ?SimSun (衬线) ?Tahoma (无衬U? 作ؓ UI ?br /> Web 中的主要字体使用。ƈ且,解决了字体替换后的几个问题:
(1) 针对中文选字混ؕ问题 (同一句话中的不同汉字可能用不同字体进行渲?Q我所
有亚z字W都强制使用 SimSun 昄?br /> (2) ׃ SimSun 的小字体为点阵字体,所以关闭了 8-17px 字体的抗锯以达到理?br /> 的显C效果?br /> (3) 讄?SimSun ?Tahoma 的最字体尺总保证昄效果

已知 Bug:  SimSun 英文和数字粗体效果不佻I可以下蝲|友制作?SimSunbd 拯?br /> 字体目录 QSimSunbd 的英文和数字用的好像?TahomaQ?br />

cook02 q接 windows 的远E桌?br />
安装 rdesktop:
sudo apt-get install rdesktop

使用Q?br /> rdesktop ip
rdesktop -f ip (全屏)


cook03 ?ntfs 分区可写

安装 ntfs-config:
sudo apt-get install ntfs-config

配置Q?br /> sudo ntfs-config
N两个选项 (或根据需要勾?


cook04 讉K Windows ׃n文g?br />
执行Qnautilus-connect-server
填写你要讉K?Windows ׃n文g夹的相关信息Q这个文件夹׃?mount C?br /> Desktop 下。同LҎ可以 mount FTP 文g夹等{?br />

cook05 ?Windows 能访?ubuntu 的文?(samba)

执行Qshares-admin
按需要设|?br />

cook06 播放各种视频

(1) 下蝲 mplayer ?Codec PackageQ?br /> http://www.mplayerhq.hu/design7/dload.html#binary_codecs
(2) 下载的 Codec Package 解压?/usr/lib/win32
(3) 安装 mplayer 或各U?mplayer 的前端程序,我用的是 mplayer 的一个前端:
smplayer
(4) 如果你的 mplayer 的播攄面不正常Q请查你?Video Output Driver 是否?br /> x11
(5) 若要昄中文字幕Q需要在播放器内讄字幕用字体和字幕~码


cook07 使用 fcitx 替换 scim

׃使用习惯和兼Ҏ原因,许多Z得不使用 fcitxQ安装方法如下:

sudo apt-get install im-switch fcitx
im-switch -s fcitx -z default

如果你要?en ?locale 下?fcitxQ请?/etc/gtk-2.0/gtk.immodules 中的Q?br />
“xim” “X Input Method” “gtk20″ “/usr/share/locale” “ko:ja:th:zh”

替换?br />
“xim” “X Input Method” “gtk20″ “/usr/share/locale” “en:ko:ja:th:zh”



cook08 Panel 中的好东?br />
ubuntu 桌面上下各有一?Panel。其实,我们可以自定?Panel 上面的内容,比如?br /> Q?br /> 天气预报Q本本的电量昄、亮度调节,CPU 频率监视Q系l负载监视,q有一个强?br /> l止E序的按?(Force Quit){等?br /> 你也可以把自己徏立的 Laucher 拖动?Panel 上,当然Q你也可以在别的位置建立?br /> q Panel?br />

cook09 使用 HP 打印?br />
ubuntu 自带?HP pd打印机的驱动 oo2zjsQ但奇怪的是,q个驱动居然是不能用?br /> ?br /> 用户需要卸载掉 ubuntu 自带?oo2zjsQ安装新?oo2zjs?br />
具体q程如下Q?br />
认~译环境已安装:
sudo apt-get install build-essential

下蝲 oo2zjsQ?br /> wget -O foo2zjs.tar.gz http://foo2zjs.rkkda.com/foo2zjs.tar.gz

解压Q?br /> tar zxf foo2zjs.tar.gz
cd foo2zjs

卸蝲原有 foo2zjsQ?br /> make uninstall

~译Q安装:
make
./getweb 1020 q里是你的打印机型号
sudo make install install-hotplug cups

?ubuntu 的打印机理中添加你的打印机 (不要?suggest 的那个驱?:
sudo gnome-cups-manager

最后,重启 cups:
sudo make cups

cook10 开?Vim ?#8220;易模?#8221;

ubuntu ?Vim 只有 console 的版本,且是传统 Unix 的行为模式,卛_ INSERT
MODE 下,方向键和退格键是不起作用的。可以手动开?#8220;c?Windows”模式Q即?br /> COMMAND MODE 下输入:

:behave mswin


[附录1]

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">

<fontconfig>

    <!-- use SimSun to display all Asia character -->
    <match target="font">
        <test compare="contains" name="lang" >
            <string>zh-cn</string>
            <string>zh-tw</string>
            <string>ja</string>
            <string>ko</string>
        </test>
        <edit name="family"><string>SimSun</string></edit>
    </match>

    <!-- open anti-alias for all font -->
    <match target="font" >
        <edit mode="assign" name="antialias"><bool>true</bool></edit>
        <edit mode="assign"
name="hintstyle"><const>hintslight</const></edit>
        <edit mode="assign" name="hinting"><bool>true</bool></edit>
        <edit mode="assign" name="autohint"><bool>false</bool></edit>
    </match>

    <!-- disable anti-alias for fonts between 8 to 17 pixels -->
    <match target="font" >
        <test compare="more_eq" name="pixelsize"
qual="any"><double>8</double></test>
        <test compare="less_eq" name="pixelsize"
qual="any"><double>17</double></test>
        <edit mode="assign" name="antialias"><bool>false</bool></edit>
    </match>

    <!-- set the minimum size for SimSun and Tahoma -->
    <match target="font" >
        <test name="family" qual="any">
            <string>SimSun</string>
            <string>NSimSun</string>
            <string>Tahoma</string>
        </test>
        <test compare="more_eq" name="pixelsize"><int>8</int></test>
        <test compare="less_eq" name="pixelsize"><int>12</int></test>
        <edit compare="eq" name="pixelsize"><int>12</int></edit>
    </match>

</fontconfig>





ZelluX 2007-09-09 10:52 发表评论
]]>
APUE - File I/O (5)http://m.tkk7.com/zellux/archive/2007/08/22/138633.htmlZelluXZelluXWed, 22 Aug 2007 07:46:00 GMThttp://m.tkk7.com/zellux/archive/2007/08/22/138633.htmlhttp://m.tkk7.com/zellux/comments/138633.htmlhttp://m.tkk7.com/zellux/archive/2007/08/22/138633.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/138633.htmlhttp://m.tkk7.com/zellux/services/trackbacks/138633.html#include <unistd.h>
int dup(int filedes);
int dup2(int filedes, int filedes2);
// Both return: new file descriptor if OK, -1 on error

dupq回的file descriptor(以下Ufd)为当前可用的最低号码,dup2则指定目的fdQ如果该fd已被打开Q则首先关闭q个fd?br>dup后两个fd指向相同的file table entryQ这意味着它们׃n同一个的file status flag, read, write, append, offset{?br>
事实上,dup{h?br> fcntl(filedes, F_DUPFD, 0);

dup2和也cM?br> close(filedes2);
fcntl(filedes, F_DUPFD, filedes2);
但这不是一个原子操作,而且errno也有一定的不同?img src ="http://m.tkk7.com/zellux/aggbug/138633.html" width = "1" height = "1" />

ZelluX 2007-08-22 15:46 发表评论
]]>
APUE - File I/O (4) - Atomic Operationshttp://m.tkk7.com/zellux/archive/2007/08/21/138379.htmlZelluXZelluXTue, 21 Aug 2007 06:45:00 GMThttp://m.tkk7.com/zellux/archive/2007/08/21/138379.htmlhttp://m.tkk7.com/zellux/comments/138379.htmlhttp://m.tkk7.com/zellux/archive/2007/08/21/138379.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/138379.htmlhttp://m.tkk7.com/zellux/services/trackbacks/138379.htmlAppending to a File

 考虑某个单一q程试图在文件追加写入的操作。由于早期的UNIXpȝ不支持O_APPEND选项Q因此得先用lseekoffset|于文gN?br>if (lseek(fd, 0L, 2) < 0)
    err_sys("lseek error");
if (write(fd, buf, 100) != 100)
    err_sys("write error");
注意q里的lseek函数的第三个参数2{于SEEK_END帔RQ但是早期UNIXq没有这个常量名QSystem V中才引进Q?br>
q样的处理在多进E试囑֜同一文gNq加写入时就有可能出现问题?br>假设两个独立U程A B要在某个文gNq加写入Q用了上述ҎQƈ没有使用O_APPEND开兟?br>? 先A指向了该文gNQ假设是offset=1500的地方)Q接着内核切换到Bq程QB也指向了该尾部,然后写入?00字节Q此时内核把v-node 中当前文件的大小改ؓ?600。内核再ơ切换进E,Al箋q行Q调用writeҎQ结果就在offset=1500的地方写入了Q覆盖了Bq程写入? 内容?br>
q个问题其实和Java中的多线E差不多Q指向文件尾部和写入应该作ؓ一个原子操作执行,像Java中用synchronized块保护原子操作。用O_APPEND选项是一U解x法?br>另一U解x法时使用XSI extension中的pread和pwrite函数?br>#include <unistd.h>

ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);
// Returns: number of bytes read, 0 if end of file, -1 on error

ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset);
// Returns: number of bytes read, 0 if end of file, -1 on error

调用pread与调用lseek后再调用read{hQ以下情况除外:
1. pread的两个步骤无法被中断?br>2. 文g指针未被更新时?br>
pwrite与lseek+write的差别也怼?br>
Creating a File
当用O_CREAT和O_EXCL开兌用open函数Ӟ如果文g已经存在Q则open函数q回p|倹{如果不使用q两个开养I可以q样写:
if ((fd = open(pathname, O_WRONLY)) < 0) {
    
if (errno == ENOENT) {
        
if ((fd = creat(pathname, mode)) < 0)
            err_sys(
"creat error");
    } 
else {
        err_sys(
"open error");
    }
}

当open函数执行后creat函数执行前另一个进E创Z同名文g的话Q该数据׃被擦除?

ZelluX 2007-08-21 14:45 发表评论
]]>APUE - File I/O (3) - File Sharinghttp://m.tkk7.com/zellux/archive/2007/08/20/138233.htmlZelluXZelluXMon, 20 Aug 2007 14:39:00 GMThttp://m.tkk7.com/zellux/archive/2007/08/20/138233.htmlhttp://m.tkk7.com/zellux/comments/138233.htmlhttp://m.tkk7.com/zellux/archive/2007/08/20/138233.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/138233.htmlhttp://m.tkk7.com/zellux/services/trackbacks/138233.htmlEvery 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
1) The file descriptor flags (close-on-exec; refer to Figure 3.6 and Section 3.14)
2) A pointer to a file table entry

The kernel maintains a file table for all open files. Each file table entry contains
1) The file status flags for the file, such as read, write, append, sync, and nonblocking
2) The current file offset
3) A pointer to the v-node table entry for the file

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.


上图三种数据l构及其怺联系
其中v-node主要用于提供单个操作pȝ上的多文件系l支持,Sun把它UCؓVirtual File System
linux中没有v-nodeQ用了一个generic i-node代替Q尽用了不同的实现方式,v-node在概念上与generic i-node相同?br>
下面来讨Z个独立的q程打开同一文g的情?br>q种情况下两个进E拥有不同的file tableQ但其中的两个指针指向了同一个v-node?br>
知道了这些数据结构的情况以后Q我们可以更_的知道某些操作的l果
1) 每次write操作l束后,当前文g的offset增加Q如果这个操作导致当前的offset出了文仉度,则i-node表中记录的文件大会被修改ؓ改动后的大小?br>2) 使用O_APPEND方式打开文g后,每次调用write函数Ӟ当前文g的offset都会被设|ؓi-node表中的该文g大小Q从而write函数只能在文件尾部追加?br>3) lseek 函数只改变在file table中的当前文goffsetQƈ不会产生io操作

注意file descriptor flag和file status flag的作用域差别Q前者属于某个单独进E的单独的file descriptorQ后者则适用于Q意进E中指向l定file table entry的所有descriptor。fcntl函数可以修改q两Uflag



ZelluX 2007-08-20 22:39 发表评论
]]>
APUE - File I/O (2) http://m.tkk7.com/zellux/archive/2007/08/13/136516.htmlZelluXZelluXMon, 13 Aug 2007 14:14:00 GMThttp://m.tkk7.com/zellux/archive/2007/08/13/136516.htmlhttp://m.tkk7.com/zellux/comments/136516.htmlhttp://m.tkk7.com/zellux/archive/2007/08/13/136516.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/136516.htmlhttp://m.tkk7.com/zellux/services/trackbacks/136516.htmlThe file's offset can be greater than the file's current size, in which case the next write to the file will extend the file. This is referred to as creating a hole in a file and is allowed. Any bytes in a file that not been written are read back as 0.
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.

2. read Function
#include <unistd.h>
ssize_t read(int filedes, void *buf, size_t nbytes);
// Returns: number of bytes read, 0 if end of file, -1 on error
readd的字节数于所要求的字节数的几U可能:
1) 从文件中dQ在所要求的字节数d完成前到达文件尾?br> 2) 从终端读取,q种情况下通常每次最多读取一行内宏V?br> 3) 通过|络dQ网l缓冲可能导致读取到于要求的字节数?br> 4) 从管道或者FIFO中读?br> 5) 从record-oriented讑֤中读取,如磁带,每次臛_q回一个记录。orz...
6) 在一定数量的数据d后被信号中断?br>
3. write Function
#include <unistd.h>
ssize_t write(int filedes, const void *buf, size_t nbytes);
// Returns: number of bytes written if OK, -1 on error
D错误的通常原因是磁盘已满,或者超Zl定q程的文件大限制?

ZelluX 2007-08-13 22:14 发表评论
]]>
APUE - File I/O (1) http://m.tkk7.com/zellux/archive/2007/08/09/135654.htmlZelluXZelluXThu, 09 Aug 2007 14:46:00 GMThttp://m.tkk7.com/zellux/archive/2007/08/09/135654.htmlhttp://m.tkk7.com/zellux/comments/135654.htmlhttp://m.tkk7.com/zellux/archive/2007/08/09/135654.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/135654.htmlhttp://m.tkk7.com/zellux/services/trackbacks/135654.html
2. File Descriptors
? 怸所有打开的文仉是通过File Descriptor指向的。file descriptor是一个非负的整数Q按照管理,UNIXpȝ?指定E的标准输入Q?E的标准输出Q?为标准错误输出。ؓ了程序的通用性? 虑,q些magic number应该?lt;unistd.h>中的STDIN_FILENO, STDOUT_FILENO, STRERR_FILENO代替?br>file descriptor的范围是从[0, OPEN_MAX]Q早期系l的上限?9Q现在许多已l到达了63QLinux 2.4.22把每个进E打开的文件数上限提升C2^20.

3. open 函数
#include <fcntl.h>
int open(const char *pathname, int oflag, ..., /* mode_t mode */ );
q回: 正常 - 最的未被使用的file descriptorQ出?- 0
oflag: O_RDONLY(0), O_WRONLY(1), O_RDWR(2) 括号内ؓ大多数情况下的|q三个参C必选一个,剩下的可选参数指定了是否q加、是否创建等信息Q具体参见man 2 open

4. File Name and Pathname Truncation
如果创徏的文件名长度大于NAME_MAX帔RQBSDpȝ会返回一个错误状态,q把errno设ؓENAMETOOLONG。如果只是把文g名截去部分就有可能导致与已存在的文g重名?br>POSIX.1中的帔R_POSIX_NO_TRUNC指定了长文g名和路径会被截断q是会引发错?br>
5.  创徏文g
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
事实上这个函数等价于
open (pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

6. 关闭文g
#include <fcntl.h>
int close(int filedes);
q回: 成功 -1Q出?0
当一个进E结束时Q系l会自动关闭该进E打开的所有文件?br>
7. lseek 函数
每个打开的文仉有一个current file offset属性,通常是一个非负的整数。默认情况下文g打开后该gؓ0,除非指定了O_APPEND选项?br>#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
// Returns: new file offset if OK, -1 on error

可以通过seek 0字节来得到当前的offset
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
q个Ҏ也可以用来判断当前文件是否可以被seekQ如果是指向道(pipe)QFIFOQ或者socket的file descriptorQlseek把errno讄为ESPIPEq返?1

某些讑֤可能允许负值的offset(如FreeBSD上的/dev/kmem)Q因此在查返回值时应判断是否等?1Q而不是是否小?

ZelluX 2007-08-09 22:46 发表评论
]]>
Vim - Formatting the codehttp://m.tkk7.com/zellux/archive/2007/08/06/134784.htmlZelluXZelluXMon, 06 Aug 2007 13:24:00 GMThttp://m.tkk7.com/zellux/archive/2007/08/06/134784.htmlhttp://m.tkk7.com/zellux/comments/134784.htmlhttp://m.tkk7.com/zellux/archive/2007/08/06/134784.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/134784.htmlhttp://m.tkk7.com/zellux/services/trackbacks/134784.html1G=G
We can split it up in simply says:
1G : Go to the first line(you can also use gg)
= : Indent according to the configuration
G : Go to the last line(tell Vim where to end indenting)

2. Another way is to go into visual mode with V and press =  to reindent the chosen lines.

3.
=i{ will reindent everything between { and } excluding the brackets.
other similar choices:
a{ : all the code between { and } including the brackets.
i(, a(, i<, a<, i[, a[



ZelluX 2007-08-06 21:24 发表评论
]]>
W一ơ成功编译了内核模块http://m.tkk7.com/zellux/archive/2007/07/29/133101.htmlZelluXZelluXSun, 29 Jul 2007 04:21:00 GMThttp://m.tkk7.com/zellux/archive/2007/07/29/133101.htmlhttp://m.tkk7.com/zellux/comments/133101.htmlhttp://m.tkk7.com/zellux/archive/2007/07/29/133101.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/133101.htmlhttp://m.tkk7.com/zellux/services/trackbacks/133101.htmlhello.c
#include <linux/kernel.h>
#include 
<linux/module.h>

MODULE_LICENSE(
"GPL");

int init_module()
{
    printk(
"Hello, world - this is the kernel speaking\n");

    
return 0;
}

void cleanup_module()
{
    printk(
"Short is the life of a kernel module\n");
}

Makefile:
obj-m := hello.o
KERNELBUILD := /lib/modules/`uname -r`/build
default:
    make -C $(KERNELBUILD) M=$(shell pwd) modules

然后
make
sudo insmod hello.ko    // 载入模块
dmesg  // 卛_看到Hello, world
sudo rmmod hello // U除模块
dmesg // 看到U除时信?br>



ZelluX 2007-07-29 12:21 发表评论
]]>
վ֩ģ壺 ëƬ| þù޸ۿ| Ʒѿþþþ| ½һëƬƵۿi| þþþþƵ| 91۲ݹ߹ۿ| ߹ۿ| 99þۺϹƷ| Ƭ߹ۿ| ѹۿaƵ| Ʒѿþþ| mm1313޾Ʒִִ| ޾ƷӰԺ| ɫۺ| ۺͼɫ40p| ޹Ʒ˾þ| СƵ߲| 99ɫƷ88| һػػƵĴƬ| 99aƷ| һƵ߲| һŮ18ƬëƬƵ| ëƬѹۿ| 99þѿƷ| ɫƵվ| jizzjizzƵ| AVպAV̾| һëƬ붯ѹۿ| aaŮ˴ƬˮƵ| þþƷ| Hվ߹ۿ| ձһaƵѹۿ| ˵һaվ| AVһ| ޹Ʒyw߹ۿ| aŹavۺav| ƷžžþƵ| 88avѹۿ| ڵĤѿ| ޺ݺۺϾþþþ | ĻƵ|