<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Inside SW,FW and HW R&#038;D</title>
	<atom:link href="http://blog.donews.com/21cnbao/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.donews.com/21cnbao</link>
	<description>C/C++ &#124; Visual C++ &#124; 嵌入式系统 &#124; 硬件设计 &#124; 通信与网络</description>
	<lastBuildDate>Sun, 17 Jan 2010 15:10:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>bio 与块设备驱动</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/17/1581989.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/17/1581989.aspx#comments</comments>
		<pubDate>Sun, 17 Jan 2010 15:10:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[4.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/17/1581989.aspx</guid>
		<description><![CDATA[在学习块设备原理的时候，我最关系块设备的数据流程，从应用程序调用Read或者Write开始，数据在内核中到底是如何流通、处理的呢？然后又如何抵达具体的物理设备的呢？下面对一个带Cache功能的块设备数据流程进行分析。
]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="text-indent: 21pt;"><font size="3"><span>reference to: http://hi.baidu.com/liu_bin0101/blog/item/8d3cfd2efb7725594ec22623.html</span></font></p>
<p class="MsoNormal" style="text-indent: 21pt;"><font size="3"><span><br /></span></font></p>
<p class="MsoNormal" style="text-indent: 21pt;"><font size="3"><span>在学习块设备原理的时候，我最关系块设备的数据流程，从应用程序调用</span><span>Read</span><span>或者</span><span>Write</span><span>开始，数据在内核中到底是如何流通、处理的呢？然后又如何抵达具体的物理设备的呢？下面对一个带</span><span>Cache</span><span>功能的块设备数据流程进行分析。</span></font></p>
<p class="MsoNormal" style="text-indent: 21pt;"><font size="3"><span> </span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>1、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span>用户态程序通过</span><span>open()</span><span>打开指定的块设备，通过</span><span>systemcall</span><span>机制陷入内核，执行</span><span>blkdev_open()</span><span>函数，该函数注册到文件系统方法（</span><span>file_operations</span><span>）中的</span><span>open</span><span>上。在</span><span>blkdev_open</span><span>函数中调用</span><span>bd_acquire()</span><span>函数，</span><span>bd_acquire</span><span>函数完成文件系统</span><span>inode</span><span>到块设备</span><span>bdev</span><span>的转换，具体的转换方法通过</span><span>hash</span><span>查找实现。得到具体块设备的</span><span>bdev</span><span>之后，调用</span><span>do_open()</span><span>函数完成设备打开的操作。在</span><span>do_open</span><span>函数中会调用到块设备驱动注册的</span><span>open</span><span>方法，具体调用如下：</span><span>gendisk-&gt;fops-&gt;open(bdev-&gt;bd_inode, file)</span><span>。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>2、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span>用户程序通过</span><span>read</span><span>、</span><span>write</span><span>函数对设备进行读写，文件系统会调用相应的方法，通常会调用如下两个函数：</span><span>generic_file_read</span><span>和</span><span>blkdev_file_write</span><span>。在读写过程中采用了多种策略，首先分析读过程。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>3、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span></span><span>用户态调用了</span><span>read</span><span>函数，内核执行</span><span>generic_file_read</span><span>，如果不是</span><span>direct io</span><span>方式，那么直接调用</span><span>do_generic_file_read-&gt;do_generic_mapping_read()</span><span>函数，在</span><span>do_generic_mapping_read</span><span>（函数位于</span><span>filemap.c</span><span>）函数中，首先查找数据是否命中</span><span>Cache</span><span>，如果命中，那么直接将数据返回给用户态；否则通过</span><span>address_space-&gt;a_ops-&gt;readpage</span><span>函数发起一个真实的读请求。<font color="#ff0000">在</font></span><font color="#ff0000"><span>readpage</span><span>函数中，构造一个</span><span>buffer_head</span><span>，设置</span><span>bh</span><span>回调函数</span><span>end_buffer_async_read</span><span>，然后调用</span><span>submit_bh</span><span>发起请求。在</span><span>submit_bh</span><span>函数中，根据</span><span>buffer_head</span><span>构造</span><span>bio</span><span>，设置</span><span>bio</span><span>的回调函数</span><span>end_bio_bh_io_sync</span><span>，最后通过</span><span>submit_bio</span><span>将</span><span>bio</span><span>请求发送给指定的快设备。</span></font></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>4、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span>如果用户态调用了一个</span><span>write</span><span>函数，内核执行</span><span>blkdev_file_write</span><span>函数，如果不是</span><span>direct io</span><span>操作方式，那么执行</span><span>buffered write</span><span>操作过程，直接调用</span><span>generic_file_buffered_write</span><span>函数。</span><span>Buffered write</span><span>操作方法会将数据直接写入</span><span>Cache</span><span>，并进行</span><span>Cache</span><span>的替换操作，在替换操作过程中需要对实际的快设备进行操作，</span><span>address_space-&gt;a_ops</span><span>提供了块设备操作的方法。当数据被写入到</span><span>Cache</span><span>之后，</span><span>write</span><span>函数就可以返回了，后继异步写入的任务绝大部分交给了</span><span>pdflush daemon</span><span>（有一部分在替换的时候做了）</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>5、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span>数据流操作到这一步，我们已经很清楚用户的数据是如何到内核了。与用户最接近的方法是</span><span>file_operations</span><span>，每种设备类型都定义了这一方法（由于</span><span>Linux</span><span>将所有设备都看成是文件，所以为每类设备都定义了文件操作方法，例如，字符设备的操作方法为</span><span>def_chr_fops</span><span>，块设备为</span><span>def_blk_fops</span><span>，网络设备为</span><span>bad_sock_fops</span><span>）。每种设备类型底层操作方法是不一样的，但是通过</span><span>file_operations</span><span>方法将设备类型的差异化屏蔽了，这就是</span><span>Linux</span><span>能够将所有设备都理解为文件的缘由。到这里，又提出一个问题：既然这样，那设备的差异化又该如何体现呢？在文件系统层定义了文件系统访问设备的方法，该方法就是</span><span>address_space_operations</span><span>，文件系统通过该方法可以访问具体的设备。对于字符设备而言，没有实现</span><span>address_space_operations</span><span>方法，也没有必要，因为字符设备的接口与文件系统的接口是一样的，在字符设备</span><span>open</span><span>操作的过程中，将</span><span>inode</span><span>所指向的</span><span>file_operations</span><span>替换成</span><span>cdev</span><span>所指向的</span><span>file_operations</span><span>就可以了。这样用户层读写字符设备可以直接调用</span><span>cdev</span><span>中</span><span>file_operations</span><span>方法了。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>6、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span>截至到步骤（</span><span>4</span><span>），读操作在没有命中</span><span>Cache</span><span>的情况下通过</span><span>address_space_operations</span><span>方法中的</span><span>readpage</span><span>函数发起块设备读请求；写操作在替换</span><span>Cache</span><span>或者</span><span>Pdflush</span><span>唤醒时发起块设备请求。发起块设备请求的过程都一样，首先根据需求构建</span><span>bio</span><span>结构，</span><span>bio</span><span>结构中包含了读写地址、长度、目的设备、回调函数等信息。构造完</span><span>bio</span><span>之后，通过简单的</span><span>submit_bio</span><span>函数将请求转发给具体的块设备。从这里可以看出，块设备接口很简单，接口方法为</span><span>submit_bio</span><span>（更底层函数为</span><span>generic_make_request</span><span>），数据结构为</span><span>struct bio</span><span>。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>7、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span>submit_bio</span><span>函数通过</span><span>generic_make_request</span><span>转发</span><span>bio</span><span>，</span><span>generic_make_request</span><span>是一个循环，其通过每个块设备下注册的</span><span>q-&gt;make_request_fn</span><span>函数与块设备进行交互。如果访问的块设备是一个有</span><span>queue</span><span>的设备，那么会将系统的</span><span>__make_request</span><span>函数注册到</span><span>q-&gt;make_request_fn</span><span>中；否则块设备会注册一个私有的方法。在私有的方法中，由于不存在</span><span>queue</span><span>队列，所以不会处理具体的请求，而是通过修改</span><span>bio</span><span>中的方法实现</span><span>bio</span><span>的转发，在私有</span><span>make_request</span><span>方法中，往往会返回</span><span>1</span><span>，告诉</span><span>generic_make_request</span><span>继续转发比</span><span>bio</span><span>。</span><span>Generic_make_request</span><span>的执行上下文可能有两种，一种是用户上下文，另一种为</span><span>pdflush</span><span>所在的内核线程上下文。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>8、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span></span><span>通过</span><span>generic_make_request</span><span>的不断转发，最后请求一定会到一个存在</span><span>queue</span><span>队列的块设备上，假设最终的那个块设备是某个</span><span>scsi disk</span><span>（</span><span>/dev/sda</span><span>）。</span><span>generic_make_request</span><span>将请求转发给</span><span>sda</span><span>时，调用</span><span>__make_request</span><span>，该函数是</span><span>Linux</span><span>提供的块设备请求处理函数。在该函数中实现了极其重要的操作，通常所说的</span><span>IO Schedule</span><span>就在该函数中实现。在该函数中试图将转发过来的</span><span>bio merge</span><span>到一个已经存在的</span><span>request</span><span>中，如果可以合并，那么将新的</span><span>bio</span><span>请求挂载到一个已经存在</span><span>request</span><span>中。如果不能合并，那么分配一个新的</span><span>request</span><span>，然后将</span><span>bio</span><span>添加到其中。这一切搞定之后，说明通过</span><span>generic_make_request</span><span>转发的</span><span>bio</span><span>已经抵达了内核的一个站点&mdash;&mdash;</span><span>request</span><span>，找到了一个临时归宿。此时，还没有真正启动物理设备的操作。在</span><span>__make_request</span><span>退出之前，会判断一个</span><span>bio</span><span>中的</span><span>sync</span><span>标记，如果该标记有效，说明请求的</span><span>bio</span><span>是一个是实时性很强的操作，不能在内核中停留，因此调用了</span><span>__generic_unplug_device</span><span>函数，该函数将触发下一阶段的操作；如果该标记无效的话，那么该请求就需要在</span><span>queue</span><span>队列中停留一段时间，等到</span><span>queue</span><span>队列触发闹钟响了之后，再触发下一阶段的操作。</span><span>__make_request</span><span>函数返回</span><span>0</span><span>，告诉</span><span>generic_make_request</span><span>无需再转发</span><span>bio</span><span>了，</span><span>bio</span><span>转发结束。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>9、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span>到目前为止，文件系统（</span><span>pdflush</span><span>或者</span><span>address_space_operations</span><span>）发下来的</span><span>bio</span><span>已经</span><span>merge</span><span>到</span><span>request queue</span><span>中，如果为</span><span>sync bio</span><span>，那么直接调用</span><span>__generic_unplug_device</span><span>，否则需要在</span><span>unplug timer</span><span>的软中断上下文中执行</span><span>q-&gt;unplug_fn</span><span>。后继</span><span>request</span><span>的处理方法应该和具体的物理设备相关，但是在标准的块设备上如何体现不同物理设备的差异性呢？这种差异性就体现在</span><span>queue</span><span>队列的方法上，不同的物理设备，</span><span>queue</span><span>队列的方法是不一样的。举例中的</span><span>sda</span><span>是一个</span><span>scsi</span><span>设备，在</span><span>scsi middle level</span><span>将</span><span>scsi_request_fn</span><span>函数注册到了</span><span>queue</span><span>队列的</span><span>request_fn</span><span>方法上。在</span><span>q-&gt;unplug_fn</span><span>（具体方法为：</span><span>generic_unplug_device</span><span>）函数中会调用</span><span>request</span><span>队列的具体处理函数</span><span>q-&gt;request_fn</span><span>。</span><span>Ok</span><span>，到这一步实际上已经将块设备层与</span><span>scsi</span><span>总线驱动层联系在了一起，他们的接口方法为</span><span>request_fn</span><span>（具体函数为</span><span>scsi_request_fn</span><span>）。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>10、</span></span><span>明白了第（</span><span>9</span><span>）点之后，接下来的过程实际上和具体的</span><span>scsi</span><span>总线操作相关了。在</span><span>scsi_request_fn</span><span>函数中会扫描</span><span>request</span><span>队列，通过</span><span>elv_next_request</span><span>函数从队列中获取一个</span><span>request</span><span>。在</span><span>elv_next_request</span><span>函数中通过</span><span>scsi</span><span>总线层注册的</span><span>q-&gt;prep_rq_fn</span><span>（</span><span>scsi</span><span>层注册为</span><span>scsi_prep_fn</span><span>）函数将具体的</span><span>request</span><span>转换成</span><span>scsi</span><span>驱动所能认识的</span><span>scsi command</span><span>。获取一个</span><span>request</span><span>之后，</span><span>scsi_request_fn</span><span>函数直接调用</span><span>scsi_dispatch_cmd</span><span>函数将</span><span>scsi command</span><span>发送给一个具体的</span><span>scsi host</span><span>。到这一步，有一个问题：</span><span>scsi command</span><span>具体转发给那个</span><span>scsi host</span><span>呢？秘密就在于</span><span>q-&gt;queuedata</span><span>中，在为</span><span>sda</span><span>设备分配</span><span>queue</span><span>队列时，已经指定了</span><span>sda</span><span>块设备与底层的</span><span>scsi</span><span>设备（</span><span>scsi device</span><span>）之间的关系，他们的关系是通过</span><span>request queue</span><span>维护的。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>11、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> </span></span></span><span>在</span><span>scsi_dispatch_cmd</span><span>函数中，通过</span><span>scsi host</span><span>的接口方法</span><span>queuecommand</span><span>将</span><span>scsi command</span><span>发送给</span><span>scsi host</span><span>。通常</span><span>scsi host</span><span>的</span><span>queuecommand</span><span>方法会将接收到的</span><span>scsi command</span><span>挂到自己维护的队列中，然后再启动</span><span>DMA</span><span>过程将</span><span>scsi command</span><span>中的数据发送给具体的磁盘。</span><span>DMA</span><span>完毕之后，</span><span>DMA</span><span>控制器中断</span><span>CPU</span><span>，告诉</span><span>CPU DMA</span><span>过程结束，并且在中断上下文中设置</span><span>DMA</span><span>结束的中断下半部。</span><span>DMA</span><span>中断服务程序返回之后触发软中断，执行</span><span>SCSI</span><span>中断下半部。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>12、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span>在</span><span>SCSi</span><span>中断下半部中，调用</span><span>scsi command</span><span>结束的回调函数，这个函数往往为</span><span>scsi_done</span><span>，在</span><span>scsi_done</span><span>函数调用</span><span>blk_complete_request</span><span>函数结束请求</span><span>request</span><span>，每个请求维护了一个</span><span>bio</span><span>链，所以在结束请求过程中回调每个请求中的</span><span>bio</span><span>回调函数，结束具体的</span><span>bio</span><span>。</span><span>Bio</span><span>又有文件系统的</span><span>buffer head</span><span>生成，所以在结束</span><span>bio</span><span>时，回调</span><span>buffer_head</span><span>的回调处理函数</span><span>bio-&gt;bi_end_io</span><span>（注册为</span><span>end_bio_bh_io_sync</span><span>）。自此，由中断引发的一系列回调过程结束，总结一下回调过程如下：</span><span>scsi_done-&gt;end_request-&gt;end_bio-&gt;end_bufferhead</span><span>。</span></font></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><font size="3"><span><span>13、<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;</span></span></span><span>回调结束之后，文件系统引发的读写操作过程结束。</span></font></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/17/1581989.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>块设备层分析(1)</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/17/1581984.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/17/1581984.aspx#comments</comments>
		<pubDate>Sun, 17 Jan 2010 15:06:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[4.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/17/1581984.aspx</guid>
		<description><![CDATA[图1是块设备操作的一个分层实现图。当一个进程调用read读取一个文件时，内核执行如下一个过程：首先，它通过VFS层去读取要到的文件块有没有已经被cache了，这个cache由一个buffer_head结构读取。如果要读取的文件块还没有被cache，则就要从文件系统中去读取了，这就是文件系统的映射层，它通过一个address_space结构来引用，然后调用文件系统读函数(readpage)去读取一个页面大小的数据，这个读函数对于不同的文件系统来说，是不一样的。当它从磁盘中读出数据时，它会将数据页链入cache中，当下次再读取时，就不需要再次从磁盘出去读了。Readpage()函数并不是直接去操作磁盘，而只是将请求初始化成一个bio结构，并提交给通用块层(generic block layer)。]]></description>
			<content:encoded><![CDATA[<div class="cnt" id="blog_text">
<p align="center" style="margin-left: 21pt; text-align: center; text-indent: 21pt;"><span style="font-size: 16pt;">块设备层分析(1)</span></p>
<p align="center" style="margin-left: 21pt; text-align: center; text-indent: 21pt;">R.wen<span style="font-size: 16pt;"></span><span style="font-size: 16pt;"></span></p>
<p><span> </span></p>
<p style="margin-left: 21pt; text-indent: -21pt;"><span><span>一、</span></span><span>综述</span></p>
<p style="margin-left: 21pt;"><span>图</span><span>1</span><span>是块设备操作的一个分层实现图。当一个进程调用</span><span>read</span><span>读取一个文件时，内核执行如下一个过程：首先，它通过</span><span>VFS</span><span>层去读取要到的文件块有没有已经被</span><span>cache</span><span>了，这个</span><span>cache</span><span>由一个</span><span>buffer_head</span><span>结构读取。如果要读取的文件块还没有被</span><span>cache</span><span>，则就要从文件系统中去读取了，这就是文件系统的映射层，它通过一个</span><span>address_space</span><span>结构来引用，然后调用文件系统读函数</span><span>(readpage)</span><span>去读取一个页面大小的数据，这个读函数对于不同的文件系统来说，是不一样的。当它从磁盘中读出数据时，它会将数据页链入</span><span>cache</span><span>中，当下次再读取时，就不需要再次从磁盘出去读了。</span><span>Readpage()</span><span>函数并不是直接去操作磁盘，而只是将请求初始化成一个</span><span>bio</span><span>结构，并提交给通用块层</span><span>(generic block layer)</span><span>。</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<div align="left" forimg="1"><a href="http://hiphotos.baidu.com/rwen2012/pic/item/d765f5fb30e568244e4aeafc.jpg" target="_blank"></p>
<div align="left" forimg="1">
<div align="center" forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/rwen2012/pic/item/26910cfbd5e8ad62034f56cd.jpg" alt="" /></div>
<p> </div>
<p></a></div>
<p align="center" style="text-align: center;"><span>图</span><span>1</span></p>
<p align="center" style="text-align: center;"><span> </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span></span><span>它就通过</span><span>submit_bio()</span><span>去完成的。通用块层再调用相应设备的</span><span>IO</span><span>调度器，通过这个调度器的调度算法，将这个</span><span>bio</span><span>或合并到已存在的</span><span>request</span><span>中，或创建一个新的</span><span>request</span><span>，并将这个新创建的</span><span>request</span><span>插入到设备的请求队列中去。这就完成了</span><span>IO</span><span>调度层的工作。最后就是块设备驱动所做的工作了。</span><span>IO</span><span>调度器传递给块驱动的是一个请求队列，块驱动就是要处理这个队列中的请求，直到这个队列为空为止。</span></p>
<p><span> </span></p>
<p style="margin-left: 21pt; text-indent: -21pt;"><span><span>二、</span></span><span>通用块层</span><span>(generic block layer)</span></p>
<p style="margin-left: 21pt;"><span>通用块层操作的是一个</span><span>bio</span><span>结构，这个结构主要的数据域是，</span></p>
<p style="margin-left: 21pt;"><span>unsigned short<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span> bi_vcnt;</span></p>
<p style="margin-left: 21pt;"><span>struct bio_vec<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>*bi_io_vec;<span>&nbsp;&nbsp;&nbsp;&nbsp;   </span>/* the actual vec list */</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span>这个就是要读写的数据向量，且每个</span><span>struct bio_vec<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span></span><span>为一个</span><span>segment</span><span>。</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span>//</span><span>这个函数主要是调用</span><span>generic_make_request()</span><span>去完成工作：</span></p>
<p style="margin-left: 21pt;"><span>void submit_bio(int rw, struct bio *bio)</span></p>
<p style="margin-left: 21pt;"><span>{</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>&hellip;&hellip;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>generic_make_request(bio);</span></p>
<p style="margin-left: 21pt;"><span>}</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span>//</span><span>这个函数的主要作用是将</span><span>bio</span><span>传递给驱动去处理</span></p>
<p style="margin-left: 21pt;"><span>void generic_make_request(struct bio *bio)</span></p>
<p style="margin-left: 21pt;"><span>{</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>&hellip;&hellip;</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>do {</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>char b[BDEVNAME_SIZE];</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>//</span><span>取得块设备相应的队列，每个设备一个</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>q = bdev_get_queue(bio-&gt;bi_bdev);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span></span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>/*</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span><span> </span>* If this device has partitions, remap block n</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span><span> </span>* of partition p to block n+start(p) of the disk.</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span><span> </span>*/</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>blk_partition_remap(bio); //</span><span>块设备分区信息转换，如将相对于一个分区的的偏移地址转换成相对于整个块设备的绝对偏移等等。</span></p>
<p style="margin-left: 21pt;"><span> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span></span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>old_sector = bio-&gt;bi_sector;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>old_dev = bio-&gt;bi_bdev-&gt;bd_dev;</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>&hellip;&hellip;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>//</span><span>这个是块设备队列的请求处理函数。由块设备创建请求队列时初始化。</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>//</span><span>对于</span><span>IDE</span><span>等设备，它是</span><span>__make_request()</span><span>。但对于</span><span>ramdisk</span><span>就不一样了。</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>ret = q-&gt;make_request_fn(q, bio);<span>  </span>// __make_request()</span><span>等</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>} while (ret);</span></p>
<p style="margin-left: 21pt;"><span>}</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span>//</span><span>这要函数的主要作用就是调用</span><span>IO</span><span>调度算法将</span><span>bio</span><span>合并，或插入到队列中合适的位置中去</span></p>
<p style="margin-left: 21pt;"><span>static int __make_request(request_queue_t *q, struct bio *bio)</span></p>
<p style="margin-left: 21pt;"><span>{</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>struct request *req;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>int el_ret, nr_sectors, barrier, err;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>const unsigned short prio = bio_prio(bio);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>const int sync = bio_sync(bio);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>int rw_flags;</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>nr_sectors = bio_sectors(bio);</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>//</span><span>用于处理高端内存</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>blk_queue_bounce(q, &amp;bio);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span></span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>spin_lock_irq(q-&gt;queue_lock);</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>//</span><span>测试是否能合并，本文忽略</span><span>IO</span><span>调度算法</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>el_ret = elv_merge(q, &amp;req, bio);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>switch (el_ret) {</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>//</span><span>前两种可以合并</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>case ELEVATOR_BACK_MERGE:</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>&hellip;&hellip;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>goto out;</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>case ELEVATOR_FRONT_MERGE:</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>&hellip;&hellip;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>goto out;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span></span></p>
<p style="margin-left: 42pt; text-indent: 21pt;"><span>//</span><span>不能合并，需要新创一个</span><span>request</span><span>。</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>/* ELV_NO_MERGE: elevator says don&#8217;t/can&#8217;t merge. */</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>default:</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>}</span></p>
<p style="margin-left: 21pt;"><span>get_rq:</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span></span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>rw_flags = bio_data_dir(bio);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>if (sync)</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>rw_flags |= REQ_RW_SYNC;</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>//</span><span>新创一个</span><span>request</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>req = get_request_wait(q, rw_flags, bio);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>//</span><span>初始化这个</span><span>request</span><span>。</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>init_request_from_bio(req, bio);</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>spin_lock_irq(q-&gt;queue_lock);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>if (elv_queue_empty(q)) //</span><span>空队列的处理</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>blk_plug_device(q);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>add_request(q, req);<span>  </span>//</span><span>将新请求加入队列中去</span></p>
<p style="margin-left: 21pt;"><span>out:</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>if (sync) //</span><span>如果需要同步，立即处理请求</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>__generic_unplug_device(q);</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>spin_unlock_irq(q-&gt;queue_lock);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>return 0;</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span>end_io:</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>bio_endio(bio, nr_sectors &lt;&lt; 9, err);</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>return 0;</span></p>
<p style="margin-left: 21pt;"><span>}</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span>//</span><span>触发块设备驱动进行真正的</span><span>IO</span><span>操作</span></p>
<p style="margin-left: 21pt;"><span>void __generic_unplug_device(request_queue_t *q)</span></p>
<p style="margin-left: 21pt;"><span>{</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>if (unlikely(blk_queue_stopped(q)))</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>return;</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>if (!blk_remove_plug(q))</span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>return;</span></p>
<p style="margin-left: 21pt;"><span> </span></p>
<p style="margin-left: 21pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>q-&gt;request_fn(q);<span>  </span>//</span><span>设备的请求处理函数，属于驱动层</span></p>
<p style="margin-left: 21pt;"><span>}<span>&nbsp;&nbsp;&nbsp;&nbsp;   </span></span></p>
<div align="center" forimg="1"><a href="http://hiphotos.baidu.com/rwen2012/pic/item/d765f5fb30e568244e4aeafc.jpg" target="_blank"><br /> </a></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/17/1581984.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在内核中新增一个板——以skyeye2410为例</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/16/1581868.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/16/1581868.aspx#comments</comments>
		<pubDate>Sat, 16 Jan 2010 15:13:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[3.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/16/1581868.aspx</guid>
		<description><![CDATA[讲解如何在Linux内核中新增板文件（Linux电路板级移植）。]]></description>
			<content:encoded><![CDATA[<div style="font-style: italic; margin-top: 3px;">在内核BSP中增加一块新的skyeye2410电路板</div>
<h1><a name="添加板相关代码">添加板相关代码</a></h1>
<p><a name="添加板相关代码">为新板子在arch/arm/mach-xxx添加Kconfig和Makefile项目： </a></p>
<pre class="prettyprint"><a name="添加板相关代码"><span class="typ">Index</span><span class="pun">:</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">mach</span><span class="pun">-</span><span class="pln">s3c2410</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">mach</span><span class="pun">-</span><span class="pln">s3c2410</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">revision </span><span class="lit">87</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">mach</span><span class="pun">-</span><span class="pln">s3c2410</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">working copy</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">139</span><span class="pun">,</span><span class="lit">4</span><span class="pln"> </span><span class="pun">+</span><span class="lit">139</span><span class="pun">,</span><span class="lit">10</span><span class="pln"> </span><span class="lit">@@</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; help&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="typ">Say</span><span class="pln"> Y here </span><span class="kwd">if</span><span class="pln"> you are </span><span class="kwd">using</span><span class="pln"> the </span><span class="typ">Armzone</span><span class="pln"> QT2410&nbsp;</span><span class="pun">+</span><span class="pln">config MACH_SKYEYE2410</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="kwd">bool</span><span class="pln"> </span><span class="str">&quot;skyeye 2410 board&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="kwd">select</span><span class="pln"> CPU_S3C2410</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; help</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="typ">Say</span><span class="pln"> Y here </span><span class="kwd">if</span><span class="pln"> you are </span><span class="kwd">using</span><span class="pln"> the skyeye to simulate S3C2410</span><span class="pun">+</span><span class="pln">&nbsp;endmenu</span><span class="typ">Index</span><span class="pun">:</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">mach</span><span class="pun">-</span><span class="pln">s3c2410</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">mach</span><span class="pun">-</span><span class="pln">s3c2410</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">revision </span><span class="lit">87</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">mach</span><span class="pun">-</span><span class="pln">s3c2410</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">working copy</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">29</span><span class="pun">,</span><span class="lit">6</span><span class="pln"> </span><span class="pun">+</span><span class="lit">29</span><span class="pun">,</span><span class="lit">7</span><span class="pln"> </span><span class="lit">@@</span><span class="pln">&nbsp;obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_MACH_TCT_HAMMER</span><span class="pun">)</span><span class="pln"> &nbsp;</span><span class="pun">+=</span><span class="pln"> mach</span><span class="pun">-</span><span class="pln">tct_hammer</span><span class="pun">.</span><span class="pln">o&nbsp;obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_MACH_VR1000</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp;</span><span class="pun">+=</span><span class="pln"> mach</span><span class="pun">-</span><span class="pln">vr1000</span><span class="pun">.</span><span class="pln">o usb</span><span class="pun">-</span><span class="pln">simtec</span><span class="pun">.</span><span class="pln">o&nbsp;obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_MACH_QT2410</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp;</span><span class="pun">+=</span><span class="pln"> mach</span><span class="pun">-</span><span class="pln">qt2410</span><span class="pun">.</span><span class="pln">o</span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_MACH_SKYEYE2410</span><span class="pun">)</span><span class="pln"> &nbsp;</span><span class="pun">+=</span><span class="pln"> mach</span><span class="pun">-</span><span class="pln">skyeye2410</span><span class="pun">.</span><span class="pln">o&nbsp;&nbsp;</span><span class="com"># Common bits of machine support</span></a></pre>
<p><a name="添加板相关代码">添加新的板文件arch/arm/mach-s3c2410/mach-skyeye2410.c： </a></p>
<pre class="prettyprint"><a name="添加板相关代码"><span class="com">/* linux/arch/arm/mach-s3c2410/mach-skyeye2410.c&nbsp;*&nbsp;* linux/arch/arm/mach-s3c2410/mach-skyeye2410.c&nbsp;*&nbsp;* Copyright (C) 2010 by Barry Song&nbsp;* All rights reserved.&nbsp;*&nbsp;* @Author: Barry Song&nbsp;*&nbsp;* This program is free software; you can redistribute it and/or&nbsp;* modify it under the terms of the GNU General Public License as&nbsp;* published by the Free Software Foundation; either version 2 of&nbsp;* the License, or (at your option) any later version.&nbsp;*&nbsp;* This program is distributed in the hope that it will be useful,&nbsp;* but WITHOUT ANY WARRANTY; without even the implied warranty of&nbsp;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &nbsp;See the&nbsp;* GNU General Public License for more details.&nbsp;*&nbsp;* You should have received a copy of the GNU General Public License&nbsp;* along with this program; if not, write to the Free Software&nbsp;* Foundation, Inc., 59 Temple Place, Suite 330, Boston,&nbsp;* MA 02111-1307 USA&nbsp;*&nbsp;* @History:&nbsp;* derived from linux/arch/arm/mach-s3c2410/mach-bast.c, written by&nbsp;* Ben Dooks &lt;ben@simtec.co.uk&gt;&nbsp;*&nbsp;***********************************************************************/</span><span class="pln">

</span><span class="com">#include &lt;linux/kernel.h&gt;</span><span class="pln"></span><span class="com">#include &lt;linux/types.h&gt;</span><span class="pln"></span><span class="com">#include &lt;linux/interrupt.h&gt;</span><span class="pln"></span><span class="com">#include &lt;linux/list.h&gt;</span><span class="pln"></span><span class="com">#include &lt;linux/timer.h&gt;</span><span class="pln"></span><span class="com">#include &lt;linux/init.h&gt;</span><span class="pln"></span><span class="com">#include &lt;linux/serial_core.h&gt;</span><span class="pln"></span><span class="com">#include &lt;linux/platform_device.h&gt;</span><span class="pln"></span><span class="com">#include &lt;linux/io.h&gt;</span><span class="pln">

</span><span class="com">#include &lt;asm/mach/arch.h&gt;</span><span class="pln"></span><span class="com">#include &lt;asm/mach/map.h&gt;</span><span class="pln"></span><span class="com">#include &lt;asm/mach/irq.h&gt;</span><span class="pln">

</span><span class="com">#include &lt;mach/hardware.h&gt;</span><span class="pln"></span><span class="com">#include &lt;asm/irq.h&gt;</span><span class="pln"></span><span class="com">#include &lt;asm/mach-types.h&gt;</span><span class="pln">

</span><span class="com">#include &lt;plat/regs-serial.h&gt;</span><span class="pln"></span><span class="com">#include &lt;plat/iic.h&gt;</span><span class="pln">

</span><span class="com">#include &lt;plat/devs.h&gt;</span><span class="pln"></span><span class="com">#include &lt;plat/cpu.h&gt;</span><span class="pln">

</span><span class="com">#include &lt;plat/common-smdk.h&gt;</span><span class="pln">

</span><span class="com">#include &lt;mach/regs-lcd.h&gt;</span><span class="pln"></span><span class="com">#include &lt;mach/fb.h&gt;</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> map_desc skyeye2410_iodesc</span><span class="pun">[]</span><span class="pln"> __initdata </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">/* nothing here yet */</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="kwd">virtual</span><span class="pun">=</span><span class="pln"> &nbsp;</span><span class="lit">0xe0000000</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">pfn</span><span class="pun">=</span><span class="pln"> __phys_to_pfn</span><span class="pun">(</span><span class="lit">0x19000000</span><span class="pun">),</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">length</span><span class="pun">=</span><span class="pln"> SZ_1M</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">type</span><span class="pun">=</span><span class="pln"> MT_DEVICE&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">},</span><span class="pln"></span><span class="pun">};</span><span class="pln">

</span><span class="com">#define LCD_WIDTH 320</span><span class="pln"></span><span class="com">#define LCD_HEIGHT 240</span><span class="pln"></span><span class="com">#define LCD_PIXCLOCK 40000</span><span class="pln"></span><span class="com">#define LCD_RIGHT_MARGIN 67</span><span class="pln"></span><span class="com">#define LCD_LEFT_MARGIN 40</span><span class="pln"></span><span class="com">#define LCD_HSYNC_LEN 31</span><span class="pln"></span><span class="com">#define LCD_UPPER_MARGIN 25</span><span class="pln"></span><span class="com">#define LCD_LOWER_MARGIN 5</span><span class="pln"></span><span class="com">#define LCD_VSYNC_LEN </span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> s3c2410fb_display skyeye2410_lcd_cfg __initdata </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">lcdcon5 &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> S3C2410_LCDCON5_FRM565 </span><span class="pun">|</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S3C2410_LCDCON5_INVVLINE </span><span class="pun">|</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S3C2410_LCDCON5_INVVFRAME </span><span class="pun">|</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S3C2410_LCDCON5_PWREN</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">width &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> LCD_WIDTH</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">height &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> LCD_HEIGHT</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">xres &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> LCD_WIDTH</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">yres &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> LCD_HEIGHT</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">bpp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">16</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">left_margin &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> LCD_LEFT_MARGIN </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">right_margin &nbsp; </span><span class="pun">=</span><span class="pln"> LCD_RIGHT_MARGIN </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">hsync_len &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> LCD_HSYNC_LEN </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">upper_margin &nbsp; </span><span class="pun">=</span><span class="pln"> LCD_UPPER_MARGIN </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">lower_margin &nbsp; </span><span class="pun">=</span><span class="pln"> LCD_LOWER_MARGIN </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">vsync_len &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> LCD_VSYNC_LEN </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">pixclock &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> LCD_PIXCLOCK</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">type &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> S3C2410_LCDCON1_TFT</span><span class="pun">,</span><span class="pln"></span><span class="pun">};</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> s3c2410fb_mach_info s3c2410_lcd_info __initdata </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">displays &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">skyeye2410_lcd_cfg</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">num_displays &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">default_display </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">gpdcon </span><span class="pun">=</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="lit">0xaa95aaa1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">gpdcon_mask </span><span class="pun">=</span><span class="pln"> &nbsp;</span><span class="lit">0xffc0fff0</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">gpdup </span><span class="pun">=</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="lit">0x0000faff</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">gpdup_mask </span><span class="pun">=</span><span class="pln"> &nbsp; </span><span class="lit">0xffffffff</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">lpcsel &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xf82</span><span class="pun">,</span><span class="pln"></span><span class="pun">};</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> __init skyeye2410_lcd_init</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln"></span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; s3c24xx_fb_set_platdata</span><span class="pun">(&amp;</span><span class="pln">s3c2410_lcd_info</span><span class="pun">);</span><span class="pln"></span><span class="pun">}</span><span class="pln">

</span><span class="com">#define UCON S3C2410_UCON_DEFAULT</span><span class="pln"></span><span class="com">#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB</span><span class="pln"></span><span class="com">#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> s3c2410_uartcfg skyeye2410_uartcfgs</span><span class="pun">[]</span><span class="pln"> __initdata </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">hwport &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">flags &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ucon &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> UCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ulcon &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> ULCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ufcon &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> UFCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">},</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">hwport &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">flags &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ucon &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> UCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ulcon &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> ULCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ufcon &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> UFCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">},</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">hwport &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">flags &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ucon &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> UCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ulcon &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> ULCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">ufcon &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> UFCON</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">}</span><span class="pln"></span><span class="pun">};</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> platform_device </span><span class="pun">*</span><span class="pln">skyeye2410_devices</span><span class="pun">[]</span><span class="pln"> __initdata </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">/*&amp;s3c_device_usb,*/</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">&amp;</span><span class="pln">s3c_device_lcd</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">&amp;</span><span class="pln">s3c_device_wdt</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">/*&amp;s3c_device_i2c0,*/</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">/*&amp;s3c_device_iis,*/</span><span class="pln"></span><span class="pun">};</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> __init skyeye2410_map_io</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln"></span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; s3c24xx_init_io</span><span class="pun">(</span><span class="pln">skyeye2410_iodesc</span><span class="pun">,</span><span class="pln"> ARRAY_SIZE</span><span class="pun">(</span><span class="pln">skyeye2410_iodesc</span><span class="pun">));</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; s3c24xx_init_clocks</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; s3c24xx_init_uarts</span><span class="pun">(</span><span class="pln">skyeye2410_uartcfgs</span><span class="pun">,</span><span class="pln"> ARRAY_SIZE</span><span class="pun">(</span><span class="pln">skyeye2410_uartcfgs</span><span class="pun">));</span><span class="pln"></span><span class="pun">}</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> __init skyeye2410_init</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln"></span><span class="pun">{</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; s3c_i2c0_set_platdata</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">);</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; platform_add_devices</span><span class="pun">(</span><span class="pln">skyeye2410_devices</span><span class="pun">,</span><span class="pln"> ARRAY_SIZE</span><span class="pun">(</span><span class="pln">skyeye2410_devices</span><span class="pun">));</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; skyeye2410_lcd_init</span><span class="pun">();</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; smdk_machine_init</span><span class="pun">();</span><span class="pln"></span><span class="pun">}</span><span class="pln">

MACHINE_START</span><span class="pun">(</span><span class="pln">SMDK2410</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;skyeye2410&quot;</span><span class="pun">)</span><span class="pln"> </span><span class="com">/* @TODO: request a new identifier and switch&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * to skyeye2410 */</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">/* Maintainer: Barry Song */</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">phys_io &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> S3C2410_PA_UART</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">io_pg_offst &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="pun">(((</span><span class="pln">u32</span><span class="pun">)</span><span class="pln">S3C24XX_VA_UART</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">18</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">0xfffc</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">boot_params &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> S3C2410_SDRAM_PA </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0x100</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">map_io &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> skyeye2410_map_io</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">init_irq &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> s3c24xx_init_irq</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">init_machine &nbsp; </span><span class="pun">=</span><span class="pln"> skyeye2410_init</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">timer &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">s3c24xx_timer</span><span class="pun">,</span><span class="pln">MACHINE_END</span></a></pre>
<h1><a name="配置内核并编译">配置内核并编译</a></h1>
<p><a name="配置内核并编译">配置内核，选择skyeye2410板: </a></p>
<pre class="prettyprint"><a name="配置内核并编译"><span class="typ">System</span><span class="pln"> </span><span class="typ">Type</span><span class="pln"> &nbsp;</span><span class="pun">---&gt;</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; S3C2410 </span><span class="typ">Machines</span><span class="pln"> &nbsp;</span><span class="pun">---&gt;</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">[*]</span><span class="pln"> skyeye </span><span class="lit">2410</span><span class="pln"> board</span></a></pre>
<p><a name="配置内核并编译">编译内核。得到的vmlinux可以直接在skyeye运行： </a></p>
<pre class="prettyprint"><a name="配置内核并编译"><span class="pln">bhsong@bhsong</span><span class="pun">-</span><span class="pln">laptop</span><span class="pun">:~/</span><span class="pln">develop</span><span class="pun">/</span><span class="pln">training</span><span class="pun">/</span><span class="pln">skyeye</span><span class="pun">/</span><span class="pln">training</span><span class="pun">-</span><span class="pln">simulation</span><span class="pun">-</span><span class="kwd">new</span><span class="pun">-</span><span class="pln">board$ sudo skyeye </span><span class="pun">-</span><span class="pln">e vmlinux </span><span class="pun">-</span><span class="pln">c skyeye</span><span class="pun">-</span><span class="pln">standalone</span><span class="pun">.</span><span class="pln">conf big_endian </span><span class="kwd">is</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">.</span><span class="pln">arch</span><span class="pun">:</span><span class="pln"> armcpu info</span><span class="pun">:</span><span class="pln"> armv4</span><span class="pun">,</span><span class="pln"> arm920t</span><span class="pun">,</span><span class="pln"> </span><span class="lit">41009200</span><span class="pun">,</span><span class="pln"> ff00fff0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> mach info</span><span class="pun">:</span><span class="pln"> name s3c2410x</span><span class="pun">,</span><span class="pln"> mach_init addr </span><span class="lit">0x805f030</span><span class="pln">ethmod num</span><span class="pun">=</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> mac addr</span><span class="pun">=</span><span class="lit">0</span><span class="pun">:</span><span class="lit">4</span><span class="pun">:</span><span class="lit">3</span><span class="pun">:</span><span class="lit">2</span><span class="pun">:</span><span class="lit">1</span><span class="pun">:</span><span class="pln">f</span><span class="pun">,</span><span class="pln"> hostip</span><span class="pun">=</span><span class="lit">10.0</span><span class="pun">.</span><span class="lit">0.1</span><span class="pln">lcd_mod</span><span class="pun">:</span><span class="lit">1</span><span class="pln">uart_mod</span><span class="pun">:</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> desc_in</span><span class="pun">:,</span><span class="pln"> desc_out</span><span class="pun">:,</span><span class="pln"> converter</span><span class="pun">:</span><span class="pln">SKYEYE</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> arm920t mmu ops</span><span class="typ">Loaded</span><span class="pln"> RAM &nbsp; </span><span class="pun">./</span><span class="pln">initrd</span><span class="pun">.</span><span class="pln">imgstart addr </span><span class="kwd">is</span><span class="pln"> </span><span class="kwd">set</span><span class="pln"> to </span><span class="lit">0xc0008000</span><span class="pln"> </span><span class="kwd">by</span><span class="pln"> </span><span class="kwd">exec</span><span class="pln"> file</span><span class="pun">.</span><span class="pln"></span><span class="typ">Linux</span><span class="pln"> version </span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">31.6</span><span class="pun">-</span><span class="pln">svn79 </span><span class="pun">(</span><span class="pln">bhsong@bhsong</span><span class="pun">-</span><span class="pln">laptop</span><span class="pun">)</span><span class="pln"> </span><span class="pun">(</span><span class="pln">gcc version </span><span class="lit">4.2</span><span class="pun">.</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="com">#34 Sat Jan 16 18:38:55 CST 2010</span><span class="pln">CPU</span><span class="pun">:</span><span class="pln"> ARM920T </span><span class="pun">[</span><span class="lit">41009200</span><span class="pun">]</span><span class="pln"> revision </span><span class="lit">0</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ARMvundefined</span><span class="pun">/</span><span class="pln">unknown</span><span class="pun">),</span><span class="pln"> cr</span><span class="pun">=</span><span class="lit">00003177</span><span class="pln">CPU</span><span class="pun">:</span><span class="pln"> VIVT data cache</span><span class="pun">,</span><span class="pln"> VIVT instruction cache</span><span class="typ">Machine</span><span class="pun">:</span><span class="pln"> skyeye2410</span><span class="pun">...</span></a></pre>
<p><a name="配置内核并编译">另外，我们也可以为skyeye2410电路板分配一个新的machine ID,这样就不再需要在<tt>MACHINE_START(SMDK2410, &quot;skyeye2410&quot;)</tt>等处使用smdk2410的ID了。 </a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/16/1581868.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>对思科实施嵌入式Linux培训</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/16/1581867.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/16/1581867.aspx#comments</comments>
		<pubDate>Sat, 16 Jan 2010 15:09:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[3.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/16/1581867.aspx</guid>
		<description><![CDATA[2010年初对思科实施嵌入式Linux开发培训，感谢思科员工的支持。]]></description>
			<content:encoded><![CDATA[<p>2010年初对思科实施嵌入式Linux开发培训，感谢思科员工的支持。<br />
<meta content="text/html; charset=utf-8" http-equiv="CONTENT-TYPE" /><br />
<title></title><br />
<meta content="OpenOffice.org 2.4  (Linux)" name="GENERATOR" /><br />
<style type="text/css">
	<!--
		@page { size: 8.5in 11in; margin: 0.79in }
		P { margin-bottom: 0.08in }
	-->
	</style>
<p align="center" style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="4"><strong>第一天</strong></font></font></p>
<p style="margin-bottom: 0in;"><font face="宋体, SimSun"><font size="4">_________________________________________________________________</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>课程一：  动手构建一个嵌入式</strong></font></font><font face="楷体_GB2312, monospace"><strong>Linux</strong></font><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>系统</strong></font></font></p>
<p style="margin-bottom: 0in;"><font face="宋体, SimSun"><font size="4">_________________________________________________________________</font></font></p>
<ol>
<li>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">进入嵌入式</font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">的精彩世界</font></font></p>
</li>
</ol>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">1.1	Linux</font><font face="DejaVu Sans"><font size="2">的特点、版本演进与发展方向</font></font></p>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">1.2	</font><font face="DejaVu Sans"><font size="2">嵌入式</font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">系统组成</font></font></p>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">1.3	</font><font face="DejaVu Sans"><font size="2">开发环境构建</font></font></p>
<p style="margin-left: 0.53in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">1.3.1 </font><font face="DejaVu Sans"><font size="2">安装设置</font></font><font size="2">ARM</font><font face="DejaVu Sans"><font size="2">工具链</font></font></p>
<p style="margin-left: 0.53in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">1.3.2 </font><font face="DejaVu Sans"><font size="2">安装设置</font></font><font size="2">NFS</font><font face="DejaVu Sans"><font size="2">文件系统</font></font></p>
<p style="margin-left: 0.53in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">1.3.3 </font><font face="DejaVu Sans"><font size="2">安装设置</font></font><font size="2">SSH</font><font face="DejaVu Sans"><font size="2">服务</font></font></p>
<p style="margin-left: 0.53in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">1.3.3 </font><font face="DejaVu Sans"><font size="2">安装设置</font></font><font size="2">TFTP</font><font face="DejaVu Sans"><font size="2">服务</font></font></p>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">1.4 GNU</font><font face="DejaVu Sans"><font size="2">工具链和</font></font><font size="2">GDB</font><font face="DejaVu Sans"><font size="2">调试</font></font></p>
<p style="margin-left: 0.53in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">	1.4.1 </font><font face="DejaVu Sans"><font size="2">常用</font></font><font size="2">GNU</font><font face="DejaVu Sans"><font size="2">工具的使用</font></font></p>
<p style="margin-left: 0.53in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">	1.4.2 </font><font face="DejaVu Sans"><font size="2">使用</font></font><font size="2">gdb</font><font face="DejaVu Sans"><font size="2">调试器</font></font></p>
<ol start="2">
<li>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">构建</font></font><font size="2">Linux 	Bootloader</font></p>
</li>
</ol>
<p style="margin-left: 0.44in; text-indent: 0.14in; margin-bottom: 0in;"> <font size="2">2.1	</font><font face="DejaVu Sans"><font size="2">编译和运行</font></font><font size="2">U-Boot</font></p>
<p style="margin-left: 0.44in; text-indent: 0.14in; margin-bottom: 0in;"> <font size="2">2.2	U-Boot</font><font face="DejaVu Sans"><font size="2">移植</font></font></p>
<ol start="3">
<li>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">内核编译与配置</font></font></p>
</li>
</ol>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">3.1 </font><font face="DejaVu Sans"><font size="2">内核配置</font></font><font size="2">Kconfig</font><font face="DejaVu Sans"><font size="2">和</font></font><font size="2">Makefile</font></p>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">3.2 </font><font face="DejaVu Sans"><font size="2">内核编译</font></font></p>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">3.2 </font><font face="DejaVu Sans"><font size="2">在内核中新增和修改程序</font></font></p>
<ol start="4">
<li>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">构建文件系统</font></font></p>
</li>
</ol>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">4.1 </font><font face="DejaVu Sans"><font size="2">文件系统组成</font></font></p>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">4.2 Busybox</font><font face="DejaVu Sans"><font size="2">编译与配置</font></font></p>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">4.3 </font><font face="DejaVu Sans"><font size="2">加入</font></font><font size="2">C</font><font face="DejaVu Sans"><font size="2">库</font></font></p>
<p style="margin-left: 0.3in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">4.4 </font><font face="DejaVu Sans"><font size="2">加入应用程序</font></font></p>
<p style="margin-left: 0.59in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">4.4.1 </font><font face="DejaVu Sans"><font size="2">编写一个应用程序</font></font></p>
<p style="margin-left: 0.59in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">4.4.2 </font><font face="DejaVu Sans"><font size="2">使用</font></font><font size="2">NFS</font><font face="DejaVu Sans"><font size="2">服务</font></font></p>
<p style="margin-left: 0.59in; text-indent: 0.29in; margin-bottom: 0in;"> <font size="2">4.4.3 </font><font face="DejaVu Sans"><font size="2">使用</font></font><font size="2">TFTP</font><font face="DejaVu Sans"><font size="2">服务</font></font></p>
<p align="center" style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="4"><strong>第二天</strong></font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">5</font><font face="DejaVu Sans"><font size="2">章 让系统映像更小</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">5.1 </font><font face="DejaVu Sans"><font size="2">内核裁剪</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">5.2 </font><font face="DejaVu Sans"><font size="2">文件系统裁剪</font></font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">5.2.1 C</font><font face="DejaVu Sans"><font size="2">库裁剪</font></font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">5.2.2 </font><font face="DejaVu Sans"><font size="2">应用程序裁剪</font></font></p>
<p style="margin-bottom: 0in;"><font face="宋体, SimSun"><font size="4">_________________________________________________________________</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>课程二：  </strong></font></font><font face="楷体_GB2312, monospace"><strong>Linux</strong></font><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>内核和内核开发技术（驱动开发必备的内核知识）</strong></font></font></p>
<p style="margin-bottom: 0in;"><font face="宋体, SimSun"><font size="4">_________________________________________________________________</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">6</font><font face="DejaVu Sans"><font size="2">章 成为一个</font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">内核开发者</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">6.1 patch</font><font face="DejaVu Sans"><font size="2">和邮件列表</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">6.2</font><font face="DejaVu Sans"><font size="2">官方源代码演进</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">6.3 </font><font face="DejaVu Sans"><font size="2">商业发行版版本维护</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">6.4 </font><font face="DejaVu Sans"><font size="2">源代码与项目管理工具</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">6.5 </font><font face="DejaVu Sans"><font size="2">内核代码检查和</font></font><font size="2">check-in</font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">7</font><font face="DejaVu Sans"><font size="2">章 </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">内核工作机理</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">7.1 </font><font face="DejaVu Sans"><font size="2">内核总体结构</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">7.2 </font><font face="DejaVu Sans"><font size="2">进程管理</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">7.3</font> <font face="DejaVu Sans"><font size="2">内存管理</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">7.4 </font><font face="DejaVu Sans"><font size="2">文件系统</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">7.5 </font><font face="DejaVu Sans"><font size="2">系统调用</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">8</font><font face="DejaVu Sans"><font size="2">章 </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">内核编程</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.1	</font><font face="DejaVu Sans"><font size="2">内核编程主要</font></font><font size="2">API</font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.1.1 </font><font face="DejaVu Sans"><font size="2">同步与并发</font></font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.1.2 </font><font face="DejaVu Sans"><font size="2">等待队列</font></font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.1.3 </font><font face="DejaVu Sans"><font size="2">内核延时</font></font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.1.4 </font><font face="DejaVu Sans"><font size="2">内存申请和释放</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.2	</font><font face="DejaVu Sans"><font size="2">定时器</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.3 </font><font face="DejaVu Sans"><font size="2">中断顶底半部</font></font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.3.1 </font><font face="DejaVu Sans"><font size="2">软中断</font></font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.3.2 tasklet</font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.3.3 </font><font face="DejaVu Sans"><font size="2">工作队列</font></font></p>
<p style="margin-left: 0.58in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.3.4 threaded_irq</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.4 </font><font face="宋体, SimSun"><font size="2">Linux</font></font><font face="DejaVu Sans"><font size="2">内核线程</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.5 IO</font><font face="DejaVu Sans"><font size="2">与内存访问</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">8.6 DMA</font><font face="DejaVu Sans"><font size="2">与</font></font><font size="2">cache</font><font face="DejaVu Sans"><font size="2">一致性</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">9</font><font face="DejaVu Sans"><font size="2">章 </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">内核模块开发</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">9.1 </font><font face="DejaVu Sans"><font size="2">内核模块组成</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">9.2 </font><font face="DejaVu Sans"><font size="2">编写一个内核模块</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">9.3 </font><font face="DejaVu Sans"><font size="2">加载和卸载内核模块</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">9.4 </font><font face="DejaVu Sans"><font size="2">内核模块进入文件系统</font></font></p>
<p align="center" style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="4"><strong>第三天</strong></font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">10</font><font face="DejaVu Sans"><font size="2">章 </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">内核调试方法</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">10.1 printk</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">10.2 oops</font><font face="DejaVu Sans"><font size="2">和</font></font><font size="2">panic</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">10.3 </font><font face="DejaVu Sans"><font size="2">内核</font></font><font size="2">debug</font><font face="DejaVu Sans"><font size="2">选项</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">10.4 gdb</font><font face="DejaVu Sans"><font size="2">、</font></font><font size="2">kgdb</font><font face="DejaVu Sans"><font size="2">和</font></font><font size="2">kdb</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">10.5 </font><font face="DejaVu Sans"><font size="2">使用仿真器</font></font></p>
<p style="margin-bottom: 0in;"><font face="宋体, SimSun"><font size="4">_________________________________________________________________</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>课程三：  </strong></font></font><font face="楷体_GB2312, monospace"><strong>Linux</strong></font><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>设备驱动开发（驱动原理、软件架构与设备实例）</strong></font></font></p>
<p style="margin-bottom: 0in;"><font face="宋体, SimSun"><font size="4">_________________________________________________________________</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">11</font><font face="DejaVu Sans"><font size="2">章 </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">字符设备驱动结构</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">11.1 Linux</font><font face="DejaVu Sans"><font size="2">字符设备驱动结构</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">11.2 globalmem</font><font face="DejaVu Sans"><font size="2">虚拟设备实例描述</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">11.3 globalmem</font><font face="DejaVu Sans"><font size="2">设备驱动</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">11.3.1</font><font face="DejaVu Sans"><font size="2">加载与卸载设备驱动</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">11.3.2</font><font face="DejaVu Sans"><font size="2">打开与释放函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">11.3.3</font><font face="DejaVu Sans"><font size="2">读写函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">11.3.4 seek</font><font face="DejaVu Sans"><font size="2">函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">11.3.5 ioctl</font><font face="DejaVu Sans"><font size="2">函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">11.4 globalmem</font><font face="DejaVu Sans"><font size="2">驱动的编译与加载</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">11.5 globalmem</font><font face="DejaVu Sans"><font size="2">驱动在用户空间的验证</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">12</font><font face="DejaVu Sans"><font size="2">章  </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">设备驱动中的并发控制</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">12.1</font><font face="DejaVu Sans"><font size="2">并发控制的概念</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">12.2</font><font face="DejaVu Sans"><font size="2">何时需要并发控制</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">12.3</font><font face="DejaVu Sans"><font size="2">自旋锁</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">12.3.1</font><font face="DejaVu Sans"><font size="2">自旋锁的概念</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">12.3.2</font><font face="DejaVu Sans"><font size="2">自旋锁相关数据结构与函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">12.4</font><font face="DejaVu Sans"><font size="2">信号量</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">12.4.1</font><font face="DejaVu Sans"><font size="2">信号量的概念</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">12.4.2</font><font face="DejaVu Sans"><font size="2">信号量与同步</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">12.4.3</font><font face="DejaVu Sans"><font size="2">信号量与互斥</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">12.4.4</font><font face="DejaVu Sans"><font size="2">信号量相关数据结构与函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">12.5</font><font face="DejaVu Sans"><font size="2">增加并发控制后的</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">驱动</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">12.5.1</font><font face="DejaVu Sans"><font size="2">在</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">驱动中增加并发控制</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">12.5.2</font><font face="DejaVu Sans"><font size="2">在用户空间验证</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">设备的并发控制</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">13</font><font face="DejaVu Sans"><font size="2">章  </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">设备驱动中的阻塞与非阻塞</font></font><font size="2">I/O</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">13.1</font><font face="DejaVu Sans"><font size="2">阻塞与非阻塞</font></font><font size="2">I/O</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">13.2 poll</font><font face="DejaVu Sans"><font size="2">操作的概念</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">13.3</font><font face="DejaVu Sans"><font size="2">何时需要</font></font><font size="2">poll</font><font face="DejaVu Sans"><font size="2">操作</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">13.4</font><font face="DejaVu Sans"><font size="2">等待队列</font></font><font size="2">waitqueues</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">13.5 Linux poll</font><font face="DejaVu Sans"><font size="2">操作相关数据结构与函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">13.5.1</font><font face="DejaVu Sans"><font size="2">应用程序中的</font></font><font size="2">poll</font><font face="DejaVu Sans"><font size="2">相关数据结构与函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">13.5.2</font><font face="DejaVu Sans"><font size="2">设备驱动中的</font></font><font size="2">poll</font><font face="DejaVu Sans"><font size="2">相关数据结构与函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">13.6</font><font face="DejaVu Sans"><font size="2">支持</font></font><font size="2">poll</font><font face="DejaVu Sans"><font size="2">操作的</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">驱动</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">13.6.1</font><font face="DejaVu Sans"><font size="2">在</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">驱动中增加</font></font><font size="2">poll</font><font face="DejaVu Sans"><font size="2">操作</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">13.6.2</font><font face="DejaVu Sans"><font size="2">在用户空间验证</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">设备的</font></font><font size="2">poll</font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">14</font><font face="DejaVu Sans"><font size="2">章  </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">设备驱动中的异步通知</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">14.1</font><font face="DejaVu Sans"><font size="2">异步通知的概念</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">14.2</font><font face="DejaVu Sans"><font size="2">何时需要异步通知</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">14.3 Linux</font><font face="DejaVu Sans"><font size="2">异步通知相关数据结构与函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">14.4</font><font face="DejaVu Sans"><font size="2">支持异步通知的</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">驱动</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">14.4.1</font><font face="DejaVu Sans"><font size="2">在</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">驱动中增加异步通知</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">14.4.2</font><font face="DejaVu Sans"><font size="2">在用户空间验证</font></font><font size="2">globalmem</font><font face="DejaVu Sans"><font size="2">的异步通知</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">15</font><font face="DejaVu Sans"><font size="2">章  硬件和综合因素：中断、</font></font><font size="2">IO</font><font face="DejaVu Sans"><font size="2">访问、驱动分层结构</font></font></p>
<p style="margin-bottom: 0in;"><font size="2">	15.1 </font><font face="DejaVu Sans"><font size="2">以触摸屏驱动为例剖析</font></font><font size="2">IO</font><font face="DejaVu Sans"><font size="2">访问</font></font></p>
<p style="margin-bottom: 0in;"><font size="2">	15.2 </font><font face="DejaVu Sans"><font size="2">以触摸屏驱动为例剖析中断的使用</font></font></p>
<p style="margin-bottom: 0in;"> <font size="2">	15.3 </font><font face="DejaVu Sans"><font size="2">以音频驱动为例剖析剖析</font></font><font size="2">DMA</font><font face="DejaVu Sans"><font size="2">的使用</font></font></p>
<p style="margin-bottom: 0in;"><font size="2">	15.4 </font><font face="DejaVu Sans"><font size="2">范举多个驱动子系统剖析</font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">驱动的框架结构</font></font></p>
<p style="margin-bottom: 0in;"> </p>
<p align="center" style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="4"><strong>第四天</strong></font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">16</font><font face="DejaVu Sans"><font size="2">章  </font></font><font size="2">Linux</font><font face="DejaVu Sans"><font size="2">块设备驱动</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">16.1</font><font face="DejaVu Sans"><font size="2">块设备的</font></font><font size="2">I/O</font><font face="DejaVu Sans"><font size="2">操作特点</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">16.2 Linux</font><font face="DejaVu Sans"><font size="2">块设备驱动结构</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">16.3</font><font face="DejaVu Sans"><font size="2">块设备驱动注册与注销</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">16.4</font><font face="DejaVu Sans"><font size="2">块设备的打开与释放</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">16.5</font><font face="DejaVu Sans"><font size="2">块设备驱动的</font></font><font size="2">ioctl</font><font face="DejaVu Sans"><font size="2">函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">16.6</font><font face="DejaVu Sans"><font size="2">块设备</font></font><font size="2">I/O</font><font face="DejaVu Sans"><font size="2">请求队列</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">16.6.1</font><font face="DejaVu Sans"><font size="2">请求队列的概念</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">16.6.2</font><font face="DejaVu Sans"><font size="2">请求队列的相关数据结构与函数</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;">     <font size="2">16.6.3</font><font face="DejaVu Sans"><font size="2">请求队列的保护机制</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">16.7</font><font face="DejaVu Sans"><font size="2">块设备的读写流程</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">16.8</font><font face="DejaVu Sans"><font size="2">实例：硬盘设备驱动</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">17</font><font face="DejaVu Sans"><font size="2">章  </font></font><font size="2">Linux Ethernet</font><font face="DejaVu Sans"><font size="2">设备驱动</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.1 Linux</font><font face="DejaVu Sans"><font size="2">网络设备驱动结构</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.2</font><font face="DejaVu Sans"><font size="2">网络设备驱动注册与注销</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.3</font><font face="DejaVu Sans"><font size="2">网络设备初始化</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.4</font><font face="DejaVu Sans"><font size="2">网络设备打开与释放</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.5</font><font face="DejaVu Sans"><font size="2">数据发送流程</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.6</font><font face="DejaVu Sans"><font size="2">数据接收流程</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.7</font><font face="DejaVu Sans"><font size="2">网络连接状态</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.8</font><font face="DejaVu Sans"><font size="2">参数设置和统计数据</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">17.9</font><font face="DejaVu Sans"><font size="2">实例：</font></font><font size="2">CS8900</font><font face="DejaVu Sans"><font size="2">网卡设备驱动</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">18</font><font face="DejaVu Sans"><font size="2">章  </font></font><font size="2">Linux PCI</font><font face="DejaVu Sans"><font size="2">设备驱动</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.1 PCI</font><font face="DejaVu Sans"><font size="2">的</font></font><font size="2">I/O</font><font face="DejaVu Sans"><font size="2">空间、存储空间和配置空间</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.2 Linux PCI</font><font face="DejaVu Sans"><font size="2">设备驱动架构</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.3 PCI</font><font face="DejaVu Sans"><font size="2">设备驱动注册与注销</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.4 PCI</font><font face="DejaVu Sans"><font size="2">设备初始化</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.5 PCI</font><font face="DejaVu Sans"><font size="2">设备的</font></font><font size="2">probe</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.6 PCI</font><font face="DejaVu Sans"><font size="2">设备打开与释放</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.7 PCI</font><font face="DejaVu Sans"><font size="2">设备数据读写与控制</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.8 PCI</font><font face="DejaVu Sans"><font size="2">设备驱动中断处理</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">18.8</font><font face="DejaVu Sans"><font size="2">实例：</font></font><font size="2">NE2000 PCI</font><font face="DejaVu Sans"><font size="2">网卡驱动</font></font></p>
<p style="margin-bottom: 0in;"><font face="宋体, SimSun"><font size="4">_________________________________________________________________</font></font></p>
<p style="margin-bottom: 0in;"><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>课程四：  </strong></font></font><font face="楷体_GB2312, monospace"><strong>Linux</strong></font><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>内核移植（</strong></font></font><font face="楷体_GB2312, monospace"><strong>BSP</strong></font><font face="DejaVu Sans"><font face="楷体_GB2312, monospace"><strong>构建）</strong></font></font></p>
<p style="margin-bottom: 0in;"><font face="宋体, SimSun"><font size="4">_________________________________________________________________</font></font></p>
<p align="left" style="margin-bottom: 0in; widows: 2; orphans: 2;"><font face="DejaVu Sans"><font size="2">第</font></font><font size="2">19</font><font face="DejaVu Sans"><font size="2">章  </font></font><font size="2">Linux BSP</font><font face="DejaVu Sans"><font size="2">构建</font></font></p>
<p align="left" style="margin-bottom: 0in; widows: 2; orphans: 2;"><font face="宋体, SimSun"><font size="2">19.1 BSP</font></font><font face="DejaVu Sans"><font size="2">的组成部分</font></font></p>
<p align="left" style="margin-bottom: 0in; widows: 2; orphans: 2;"><font face="宋体, SimSun"><font size="2">19.2 plat/mach</font></font><font face="DejaVu Sans"><font size="2">各组件的实现</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">19.2.1 </font><font face="DejaVu Sans"><font size="2">内核节拍</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">19.2.2</font><font face="DejaVu Sans"><font size="2">中断管理</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">19.2.3 </font><font face="DejaVu Sans"><font size="2">时钟</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">19.2.4 GPIO</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">19.2.5 DMA</font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">19.2.6 IO</font><font face="DejaVu Sans"><font size="2">内存映射</font></font></p>
<p align="left" style="margin-bottom: 0in; widows: 2; orphans: 2;"><font face="宋体, SimSun"><font size="2">19.3</font></font><font face="DejaVu Sans"><font size="2">设备与资源</font></font></p>
<p style="margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">19.3.1 platform device</font><font face="DejaVu Sans"><font size="2">、</font></font><font size="2">resource</font><font face="DejaVu Sans"><font size="2">和</font></font><font size="2">plarform data</font></p>
<p style="border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(0, 0, 0); border-width: medium medium 1pt; padding: 0in 0in 0.01in; margin-left: 0.29in; text-indent: 0.3in; margin-bottom: 0in;"> <font size="2">19.3.2 uart/spi/i2c</font><font face="DejaVu Sans"><font size="2">等设备板级</font></font><font size="2">resource</font></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/16/1581867.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>对四方继保实施嵌入式Linux开发培训</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/16/1581866.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/16/1581866.aspx#comments</comments>
		<pubDate>Sat, 16 Jan 2010 15:03:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[3.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/16/1581866.aspx</guid>
		<description><![CDATA[四方公司系我国电力行业和北京市中关村科技园区的知名企业，2009年10月23-25日对该企业进行了18课时的企业培训，感谢四方公司工作同志的支持。]]></description>
			<content:encoded><![CDATA[<p>四方公司系我国电力行业和北京市中关村科技园区的知名企业，2009年10月23-25日对该企业进行了18课时的企业培训，感谢四方公司工作同志的支持。<br />培训大纲：</p>
<p>第一天</p>
<p>1. Linux 系统开发的总述<br />1.1 Linux 开发环境及Linux 系统的组成<br />1.2 从VxWorks 过渡到Linux<br />1.3 MontaVista Linux 的主要工作<br />2. 构建嵌入式Linux 系统<br />2.1 工具链<br />2.2 内核编译与裁减<br />2.3 根文件系统<br />2.4 应用和库裁减<br />3. Linux 内核各组成部分介绍及内核编程基础<br />3.1 内核组成及各部分关系<br />3.2 内核编程API<br />3.3 内核模块编程</p>
<p>第二天</p>
<p>4. Linux 进程调度与实时性<br />4.1 Linux 进程调度机理<br />4.2 Linux 内核线程<br />4.3 Linux 线程模型<br />4.4 实时任务<br />4.5 硬实时Linux<br />5. Linux 中断和定时器<br />5.1 中断之悖论<br />5.2 顶半部与底半部<br />5.3 中断线程化<br />5.4 Linux 内核定时器<br />6. Linux 设备驱动结构<br />6.1 Linux 字符设备驱动<br />6.2 Linux 块设备驱动<br />6.3 Linux TTY 子系统与串口驱动<br />6.4 VxWorks 与Linux 驱动对比分析<br />7. Linux 网络设备驱动<br />7.1 Linux 网络设备驱动结构<br />7.2 Linux 网络设备数据流程<br />7.3 Linux 网络协议栈的结构</p>
<p>第三天</p>
<p>8. Linux 启动过程<br />8.1 u-boot<br />8.2 Linux 启动过程流程分析<br />8.3 Linux 快速启动<br />9. Linux 内核的移植<br />9.1 嵌入式设备上的BSP 开发<br />9.2 驱动移植和目录组织<br />9.3 内核程序的可移植性<br />10. Linux 应用编程核心<br />10.1 Linux 系统调用<br />10.2 Linux 多进程编程与进程间通信<br />10.3 Linux 多线程编程与线程间通信<br />11. Linux 调试技巧<br />11.1 gdb<br />11.2 内核与驱动调试<br />11.3 应用调试<br />11.4 内核和应用崩溃转储</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/16/1581866.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2009年11月14日上海讲座-S3C6410 ARM11开发板Linux BSP构建</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/16/1581862.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/16/1581862.aspx#comments</comments>
		<pubDate>Sat, 16 Jan 2010 15:02:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[3.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/16/1581862.aspx</guid>
		<description><![CDATA[BSP的组成部分
plat/mach各组件的实现
内核节拍
中断管理
时钟
GPIO
DMA
IO内存映射
设备与资源
platform device、resource和plarform data
uart/spi/i2c等设备板级resource
]]></description>
			<content:encoded><![CDATA[<div><strong>BSP的组成部分</strong><br /><strong>plat/mach各组件的实现</strong><br />内核节拍<br />中断管理<br />时钟<br />GPIO<br />DMA<br />IO内存映射<br /><strong>设备与资源</strong><br />platform device、resource和plarform data<br />uart/spi/i2c等设备板级resource</div>
<div>下载地址：</div>
<div><a href="http://img1.51cto.com/attachment/200911/109393_1258256558.pdf">http://img1.51cto.com/attachment/200911/109393_1258256558.pdf</a></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/16/1581862.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2009年11月14日上海讲座-Linux网络设备驱动PPT</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/16/1581861.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/16/1581861.aspx#comments</comments>
		<pubDate>Sat, 16 Jan 2010 15:01:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[3.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/16/1581861.aspx</guid>
		<description><![CDATA[Linux网络设备驱动架构
Linux网络设备驱动数据流程
NON-NAPI模式数据接收流程
NAPI模式数据接收流程
数据发送流程
Linux网络协议栈的实现
TCP/UDP/IP/MAC各层数据传递
网络系统调用与socket]]></description>
			<content:encoded><![CDATA[<div><strong>Linux网络设备驱动架构<br />Linux网络设备驱动数据流程</strong><br />NON-NAPI模式数据接收流程<br />NAPI模式数据接收流程<br />数据发送流程<br /><strong>Linux网络协议栈的实现<br /></strong>TCP/UDP/IP/MAC各层数据传递<br />网络系统调用与socket</div>
<div>下载地址：</div>
<div><a href="http://img1.51cto.com/attachment/200911/109393_1258256315.pdf">http://img1.51cto.com/attachment/200911/109393_1258256315.pdf</a></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/16/1581861.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2009年11月14日上海讲座-Linux触摸屏驱动PPT</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/16/1581860.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/16/1581860.aspx#comments</comments>
		<pubDate>Sat, 16 Jan 2010 15:00:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[3.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/16/1581860.aspx</guid>
		<description><![CDATA[1.触摸屏的硬件原理
阻性触摸屏
容性触摸屏
多点触摸
2.Linux触摸屏驱动
Linux Input层
input event报告
Linux多点触摸
3.触摸屏的用户空间编程
input层接口
坐标校正]]></description>
			<content:encoded><![CDATA[<h1 style="" class="subject"><strong><strong>2009年11月14日上海讲座-Linux触摸屏驱动PPT  </strong></strong></h1>
<div><strong>1.触摸屏的硬件原理</strong><br />阻性触摸屏<br />容性触摸屏<br />多点触摸<br /><strong>2.Linux触摸屏驱动</strong><br />Linux Input层<br />input event报告<br />Linux多点触摸<br /><strong>3.触摸屏的用户空间编程<br /></strong>input层接口<br />坐标校正</div>
<div>下载地址：</div>
<div><a href="http://img1.51cto.com/attachment/200911/109393_1258255867.pdf">http://img1.51cto.com/attachment/200911/109393_1258255867.pdf</a></div>
<div>&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/16/1581860.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用skyeye进行ARM内核及内核模块源代码级调试</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/16/1581856.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/16/1581856.aspx#comments</comments>
		<pubDate>Sat, 16 Jan 2010 14:57:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[3.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/16/1581856.aspx</guid>
		<description><![CDATA[使用skyeye进行内核源代码级调试并调试内核模块（以globalfifo为例）。]]></description>
			<content:encoded><![CDATA[<h1><a name="配置和编译内核">配置和编译内核</a></h1>
<p><a name="配置和编译内核">在linux-2.6.31下运行<tt>make menuconfig</tt>，选中内核的如下栏目: </a></p>
<pre class="prettyprint"><a name="配置和编译内核"><span class="typ">Kernel</span><span class="pln"> hacking &nbsp;</span><span class="pun">---&gt;</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">[*]</span><span class="pln"> </span><span class="typ">Compile</span><span class="pln"> the kernel </span><span class="kwd">with</span><span class="pln"> debug info </span></a></pre>
<p><a name="配置和编译内核">make vmlinux得到新的包含符号信息的内核。 </a></p>
<h1><a name="启动skyeye为debug模式运行vmlinux">启动skyeye为debug模式运行vmlinux</a></h1>
<pre class="prettyprint"><a name="启动skyeye为debug模式运行vmlinux"><span class="pln">bhsong@bhsong</span><span class="pun">-</span><span class="pln">laptop</span><span class="pun">:~/</span><span class="pln">develop</span><span class="pun">/</span><span class="pln">training</span><span class="pun">/</span><span class="pln">skyeye</span><span class="pun">/</span><span class="pln">training</span><span class="pun">-</span><span class="pln">simulation</span><span class="pun">-</span><span class="kwd">with</span><span class="pun">-</span><span class="pln">debconf udo skyeye </span><span class="pun">-</span><span class="pln">d </span><span class="pun">-</span><span class="pln">e vmlinux </span><span class="pun">-</span><span class="pln">c skyeye</span><span class="pun">-</span><span class="pln">standalone</span><span class="pun">.</span><span class="pln">cbig_endian </span><span class="kwd">is</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">.</span><span class="pln">arch</span><span class="pun">:</span><span class="pln"> armcpu info</span><span class="pun">:</span><span class="pln"> armv4</span><span class="pun">,</span><span class="pln"> arm920t</span><span class="pun">,</span><span class="pln"> </span><span class="lit">41009200</span><span class="pun">,</span><span class="pln"> ff00fff0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> mach info</span><span class="pun">:</span><span class="pln"> name s3c2410x</span><span class="pun">,</span><span class="pln"> mach_init addr </span><span class="lit">0x805f030</span><span class="pln">ethmod num</span><span class="pun">=</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> mac addr</span><span class="pun">=</span><span class="lit">0</span><span class="pun">:</span><span class="lit">4</span><span class="pun">:</span><span class="lit">3</span><span class="pun">:</span><span class="lit">2</span><span class="pun">:</span><span class="lit">1</span><span class="pun">:</span><span class="pln">f</span><span class="pun">,</span><span class="pln"> hostip</span><span class="pun">=</span><span class="lit">10.0</span><span class="pun">.</span><span class="lit">0.1</span><span class="pln">lcd_mod</span><span class="pun">:</span><span class="lit">1</span><span class="pln">uart_mod</span><span class="pun">:</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> desc_in</span><span class="pun">:,</span><span class="pln"> desc_out</span><span class="pun">:,</span><span class="pln"> converter</span><span class="pun">:</span><span class="pln">SKYEYE</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> arm920t mmu ops</span><span class="typ">Loaded</span><span class="pln"> RAM &nbsp; </span><span class="pun">./</span><span class="pln">initrd</span><span class="pun">.</span><span class="pln">imgstart addr </span><span class="kwd">is</span><span class="pln"> </span><span class="kwd">set</span><span class="pln"> to </span><span class="lit">0xc0008000</span><span class="pln"> </span><span class="kwd">by</span><span class="pln"> </span><span class="kwd">exec</span><span class="pln"> file</span><span class="pun">.</span><span class="pln">debugmode</span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> filename </span><span class="pun">=</span><span class="pln"> skyeye</span><span class="pun">-</span><span class="pln">standalone</span><span class="pun">.</span><span class="pln">conf</span><span class="pun">,</span><span class="pln"> server TCP port </span><span class="kwd">is</span><span class="pln"> </span><span class="lit">12345</span></a></pre>
<h1><a name="通过arm-linux-gdb连接_localhost:12345">通过arm-linux-gdb连接<tt>localhost:12345</tt></a></h1>
<pre class="prettyprint"><a name="通过arm-linux-gdb连接_localhost:12345"><span class="pln">root@bhsong</span><span class="pun">-</span><span class="pln">laptop</span><span class="pun">:~/</span><span class="pln">develop</span><span class="pun">/</span><span class="pln">svn</span><span class="pun">/</span><span class="pln">ldd6410</span><span class="pun">/</span><span class="pln">linux</span><span class="pun">-</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">31</span><span class="com"># arm-linux-gdb vmlinux</span><span class="pln">GNU gdb </span><span class="lit">6.6</span><span class="pln"></span><span class="typ">Copyright</span><span class="pln"> </span><span class="pun">(</span><span class="pln">C</span><span class="pun">)</span><span class="pln"> </span><span class="lit">2006</span><span class="pln"> </span><span class="typ">Free</span><span class="pln"> </span><span class="typ">Software</span><span class="pln"> </span><span class="typ">Foundation</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Inc</span><span class="pun">.</span><span class="pln">GDB </span><span class="kwd">is</span><span class="pln"> free software</span><span class="pun">,</span><span class="pln"> covered </span><span class="kwd">by</span><span class="pln"> the GNU </span><span class="typ">General</span><span class="pln"> </span><span class="typ">Public</span><span class="pln"> </span><span class="typ">License</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> you arewelcome to change it </span><span class="kwd">and</span><span class="pun">/</span><span class="kwd">or</span><span class="pln"> distribute copies of it under certain conditions</span><span class="pun">.</span><span class="pln"></span><span class="typ">Type</span><span class="pln"> </span><span class="str">&quot;show copying&quot;</span><span class="pln"> to see the conditions</span><span class="pun">.</span><span class="pln"></span><span class="typ">There</span><span class="pln"> </span><span class="kwd">is</span><span class="pln"> absolutely </span><span class="kwd">no</span><span class="pln"> warranty </span><span class="kwd">for</span><span class="pln"> GDB</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="typ">Type</span><span class="pln"> </span><span class="str">&quot;show warranty&quot;</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> details</span><span class="pun">.</span><span class="pln"></span><span class="typ">This</span><span class="pln"> GDB was configured </span><span class="kwd">as</span><span class="pln"> </span><span class="str">&quot;--host=/usr/local/arm/4.2.2-eabi/usr/bin/ --target=arm-linux&quot;</span><span class="pun">...</span><span class="pln"></span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> target remote localhost</span><span class="pun">:</span><span class="lit">12345</span><span class="pln"></span><span class="typ">Remote</span><span class="pln"> debugging </span><span class="kwd">using</span><span class="pln"> localhost</span><span class="pun">:</span><span class="lit">12345</span><span class="pln">warning</span><span class="pun">:</span><span class="pln"> shared library handler failed to enable breakpointstext </span><span class="pun">()</span><span class="pln"> at arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">kernel</span><span class="pun">/</span><span class="pln">head</span><span class="pun">.</span><span class="pln">S</span><span class="pun">:</span><span class="lit">79</span><span class="pln"></span><span class="lit">79</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;msr &nbsp; &nbsp; cpsr_c</span><span class="pun">,</span><span class="pln"> </span><span class="com">#PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode</span><span class="pln"></span><span class="typ">Current</span><span class="pln"> language</span><span class="pun">:</span><span class="pln"> &nbsp;</span><span class="kwd">auto</span><span class="pun">;</span><span class="pln"> currently </span><span class="kwd">asm</span></a></pre>
<p><a name="通过arm-linux-gdb连接_localhost:12345">使用gdb进行源代码级调试： </a></p>
<pre class="prettyprint"><a name="通过arm-linux-gdb连接_localhost:12345"><span class="pun">设置断点在</span><span class="pln">start_kernel</span><span class="pun">：</span><span class="pln"></span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> b start_kernel</span><span class="typ">Breakpoint</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> at </span><span class="lit">0xc0008914</span><span class="pun">:</span><span class="pln"> file init</span><span class="pun">/</span><span class="pln">main</span><span class="pun">.</span><span class="pln">c</span><span class="pun">,</span><span class="pln"> line </span><span class="lit">560.</span><span class="pln">

</span><span class="pun">继续运行：</span><span class="pln"></span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> c</span><span class="typ">Continuing</span><span class="pun">.</span><span class="pln">

</span><span class="typ">Program</span><span class="pln"> received signal SIGHUP</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Hangup</span><span class="pun">.</span><span class="pln">start_kernel </span><span class="pun">()</span><span class="pln"> at init</span><span class="pun">/</span><span class="pln">main</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="lit">560</span><span class="pln"></span><span class="lit">560</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; smp_setup_processor_id</span><span class="pun">();</span><span class="pln"></span><span class="typ">Current</span><span class="pln"> language</span><span class="pun">:</span><span class="pln"> &nbsp;</span><span class="kwd">auto</span><span class="pun">;</span><span class="pln"> currently c

</span><span class="pun">查看变量：</span><span class="pln"></span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> p</span><span class="pun">/</span><span class="pln">x jiffies$1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xffff15a0</span><span class="pln">

</span><span class="pun">查看上下文源码：</span><span class="pln"></span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> l</span><span class="lit">551</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pgtable_cache_init</span><span class="pun">();</span><span class="pln"></span><span class="lit">552</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vmalloc_init</span><span class="pun">();</span><span class="pln"></span><span class="lit">553</span><span class="pln"> &nbsp; &nbsp; </span><span class="pun">}</span><span class="pln"></span><span class="lit">554</span><span class="pln"> &nbsp; &nbsp; </span><span class="lit">555</span><span class="pln"> &nbsp; &nbsp; asmlinkage </span><span class="kwd">void</span><span class="pln"> __init start_kernel</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln"></span><span class="lit">556</span><span class="pln"> &nbsp; &nbsp; </span><span class="pun">{</span><span class="pln"></span><span class="lit">557</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> command_line</span><span class="pun">;</span><span class="pln"></span><span class="lit">558</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">extern</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> kernel_param __start___param</span><span class="pun">[],</span><span class="pln"> __stop___param</span><span class="pun">[];</span><span class="pln"></span><span class="lit">559</span><span class="pln"> &nbsp; &nbsp; </span><span class="lit">560</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; smp_setup_processor_id</span><span class="pun">();</span><span class="pln"></span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> </span></a></pre>
<h1><a name="调试内核模块">调试内核模块</a></h1>
<p><a name="调试内核模块">在目标机上加载globalfifo模块并创建设备结点： </a></p>
<pre class="prettyprint"><a name="调试内核模块"><span class="com"># modprobe globalfifo globalfifo_major=252</span><span class="pln"></span><span class="com"># mknod /dev/globalfifo c 252 0</span><span class="pln"></span><span class="com"># </span></a></pre>
<p><a name="调试内核模块">在 目标机上获得globalfifo运行时地址信息： # cd /sys/module/globalfifo/sections/ # cat .bss 0xc1c07160 # cat .data 0xc1c07024 # cat .text 0xc1c06000 在主机调试器上添加globalfifo的符号，添加符号时所用section地址皆来源于目标机： </a></p>
<pre class="prettyprint"><a name="调试内核模块"><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> add</span><span class="pun">-</span><span class="pln">symbol</span><span class="pun">-</span><span class="pln">file drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="pln">globalfifo</span><span class="pun">.</span><span class="pln">ko </span><span class="lit">0xc1c06000</span><span class="pln"> </span><span class="pun">-</span><span class="pln">s </span><span class="pun">.</span><span class="pln">bss </span><span class="lit">0xc1c07160</span><span class="pln"> </span><span class="pun">-</span><span class="pln">s </span><span class="pun">.</span><span class="pln">data </span><span class="lit">0xc1c06000</span><span class="pln">add symbol table </span><span class="kwd">from</span><span class="pln"> file </span><span class="str">&quot;drivers/char/driver_examples/globalfifo.ko&quot;</span><span class="pln"> at&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">text_addr </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xc1c06000</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">bss_addr </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xc1c07160</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">.</span><span class="pln">data_addr </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xc1c06000</span><span class="pln"></span><span class="pun">(</span><span class="pln">y </span><span class="kwd">or</span><span class="pln"> n</span><span class="pun">)</span><span class="pln"> y</span><span class="typ">Reading</span><span class="pln"> symbols </span><span class="kwd">from</span><span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">bhsong</span><span class="pun">/</span><span class="pln">develop</span><span class="pun">/</span><span class="pln">svn</span><span class="pun">/</span><span class="pln">ldd6410</span><span class="pun">/</span><span class="pln">linux</span><span class="pun">-</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">31</span><span class="pun">/</span><span class="pln">drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="pln">globalfifo</span><span class="pun">.</span><span class="pln">ko</span><span class="pun">...</span><span class="kwd">done</span><span class="pun">.</span><span class="pln"></span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> </span></a></pre>
<p><a name="调试内核模块">调试模块： 在主机调试器上设置在globalfifo_read处断点： </a></p>
<pre class="prettyprint"><a name="调试内核模块"><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> b globalfifo_read</span><span class="typ">Breakpoint</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> at </span><span class="lit">0xc1c06444</span><span class="pun">:</span><span class="pln"> file drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="pln">globalfifo</span><span class="pun">.</span><span class="pln">c</span><span class="pun">,</span><span class="pln"> line </span><span class="lit">104.</span></a></pre>
<p><a name="调试内核模块">目标机读取/dev/globalfifo： </a></p>
<pre class="prettyprint"><a name="调试内核模块"><span class="com"># cat /dev/globalfifo</span></a></pre>
<p><a name="调试内核模块">调试主机上进入了断点： </a></p>
<pre class="prettyprint"><a name="调试内核模块"><span class="typ">Program</span><span class="pln"> received signal SIGHUP</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Hangup</span><span class="pun">.</span><span class="pln">globalfifo_read </span><span class="pun">(</span><span class="pln">filp</span><span class="pun">=</span><span class="lit">0xc1c2f2a0</span><span class="pun">,</span><span class="pln"> buf</span><span class="pun">=</span><span class="lit">0xbea5bac8</span><span class="pln"> </span><span class="str">&quot;&quot;</span><span class="pun">,</span><span class="pln"> count</span><span class="pun">=</span><span class="lit">4096</span><span class="pun">,</span><span class="pln"> ppos</span><span class="pun">=</span><span class="lit">0xc182bf88</span><span class="pun">)</span><span class="pln">&nbsp; &nbsp; at drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="pln">globalfifo</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="lit">104</span><span class="pln"></span><span class="lit">104</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="kwd">struct</span><span class="pln"> globalfifo_dev </span><span class="pun">*</span><span class="pln">dev </span><span class="pun">=</span><span class="pln"> filp</span><span class="pun">-&gt;</span><span class="pln">private_data</span><span class="pun">;</span><span class="pln"> </span><span class="typ">Current</span><span class="pln"> language</span><span class="pun">:</span><span class="pln"> &nbsp;</span><span class="kwd">auto</span><span class="pun">;</span><span class="pln"> currently c</span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> </span></a></pre>
<p><a name="调试内核模块">进行调试： </a></p>
<pre class="prettyprint"><a name="调试内核模块"><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> l</span><span class="lit">99</span><span class="pln"> &nbsp; &nbsp; &nbsp;</span><span class="com">/* globalfifo read */</span><span class="pln"></span><span class="lit">100</span><span class="pln"> &nbsp; &nbsp; </span><span class="kwd">static</span><span class="pln"> ssize_t globalfifo_read</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> file </span><span class="pun">*</span><span class="pln">filp</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> __user </span><span class="pun">*</span><span class="pln">buf</span><span class="pun">,</span><span class="pln"> size_t count</span><span class="pun">,</span><span class="pln"></span><span class="lit">101</span><span class="pln"> &nbsp; &nbsp; &nbsp; loff_t </span><span class="pun">*</span><span class="pln">ppos</span><span class="pun">)</span><span class="pln"></span><span class="lit">102</span><span class="pln"> &nbsp; &nbsp; </span><span class="pun">{</span><span class="pln"></span><span class="lit">103</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="kwd">int</span><span class="pln"> ret</span><span class="pun">;</span><span class="pln"></span><span class="lit">104</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="kwd">struct</span><span class="pln"> globalfifo_dev </span><span class="pun">*</span><span class="pln">dev </span><span class="pun">=</span><span class="pln"> filp</span><span class="pun">-&gt;</span><span class="pln">private_data</span><span class="pun">;</span><span class="pln"> </span><span class="lit">105</span><span class="pln"> &nbsp; &nbsp; &nbsp; DECLARE_WAITQUEUE</span><span class="pun">(</span><span class="pln">wait</span><span class="pun">,</span><span class="pln"> current</span><span class="pun">);</span><span class="pln"> </span><span class="lit">106</span><span class="pln"> &nbsp; &nbsp; </span><span class="lit">107</span><span class="pln"> &nbsp; &nbsp; &nbsp; down</span><span class="pun">(&amp;</span><span class="pln">dev</span><span class="pun">-&gt;</span><span class="pln">sem</span><span class="pun">);</span><span class="pln"> </span><span class="lit">108</span><span class="pln"> &nbsp; &nbsp; &nbsp; add_wait_queue</span><span class="pun">(&amp;</span><span class="pln">dev</span><span class="pun">-&gt;</span><span class="pln">r_wait</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">wait</span><span class="pun">);</span><span class="pln"> </span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> n

</span><span class="typ">Program</span><span class="pln"> received signal SIGHUP</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Hangup</span><span class="pun">.</span><span class="pln">globalfifo_read </span><span class="pun">(</span><span class="pln">filp</span><span class="pun">=</span><span class="lit">0xc1c2f2a0</span><span class="pun">,</span><span class="pln"> buf</span><span class="pun">=</span><span class="lit">0xbea5bac8</span><span class="pln"> </span><span class="str">&quot;&quot;</span><span class="pun">,</span><span class="pln"> count</span><span class="pun">=</span><span class="lit">4096</span><span class="pun">,</span><span class="pln"> ppos</span><span class="pun">=</span><span class="lit">0xc182bf88</span><span class="pun">)</span><span class="pln">&nbsp; &nbsp; at drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="pln">globalfifo</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="lit">105</span><span class="pln"></span><span class="lit">105</span><span class="pln"> &nbsp; &nbsp; &nbsp; DECLARE_WAITQUEUE</span><span class="pun">(</span><span class="pln">wait</span><span class="pun">,</span><span class="pln"> current</span><span class="pun">);</span><span class="pln"> </span><span class="pun">(</span><span class="pln">gdb</span><span class="pun">)</span><span class="pln"> n</span><span class="typ">Can</span><span class="str">'t send signals to this remote system. &nbsp;SIGHUP not sent.

Program received signal SIGHUP, Hangup.globalfifo_read (filp=0xc1c2f2a0, buf=0xbea5bac8 &quot;&quot;, count=4096, ppos=0xc182bf88)&nbsp; &nbsp; at /home/bhsong/develop/svn/ldd6410/linux-2.6.31/arch/arm/include/asm/thread_info.h:9797 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return (struct thread_info *)(sp &amp; ~(THREAD_SIZE - 1));(gdb) p *dev$1 = {cdev = {kobj = {name = 0x0, entry = {next = 0xc0618004, prev = 0xc0618004}, parent = 0x0, kset = 0x0, &nbsp; &nbsp; &nbsp; ktype = 0xc029f5ec, sd = 0x0, kref = {refcount = {counter = 2}}, state_initialized = 1, state_in_sysfs = 0, &nbsp; &nbsp; &nbsp; state_add_uevent_sent = 0, state_remove_uevent_sent = 0, uevent_suppress = 0}, owner = 0xc1c07028, ops = 0xc1c065f0, &nbsp; &nbsp; list = {next = 0xc1c7532c, prev = 0xc1c7532c}, dev = 264241152, count = 1}, current_len = 0, &nbsp; mem = '</span><span class="pun">\</span><span class="lit">0</span><span class="str">' &lt;repeats 4095 times&gt;, sem = {lock = {raw_lock = {&lt;No data fields&gt;}}, count = 1, wait_list = {next = 0xc0619044, &nbsp; &nbsp; &nbsp; prev = 0xc0619044}}, r_wait = {lock = {raw_lock = {&lt;No data fields&gt;}}, task_list = {next = 0xc061904c, &nbsp; &nbsp; &nbsp; prev = 0xc061904c}}, w_wait = {lock = {raw_lock = {&lt;No data fields&gt;}}, task_list = {next = 0xc0619054, &nbsp; &nbsp; &nbsp; prev = 0xc0619054}}}(gdb) </span></a></pre>
<p><a name="调试内核模块">本文中所有相关内核及实例源代码可以通过svn获取：</a></p>
<p><a name="调试内核模块"><tt id="checkoutcmd">svn checkout <strong><em>http</em></strong>://ldd6410.googlecode.com/svn/trunk/ ldd6410-read-only</tt></a></p>
<p><a name="调试内核模块">已经做好的，可直接进行内核和内核模块调试实验的包位于： </a><a rel="nofollow" href="http://ldd6410.googlecode.com/files/ldd6410-skyeye-pack-with-debug.tar.gz">http://ldd6410.googlecode.com/files/ldd6410-skyeye-pack-with-debug.tar.gz</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/16/1581856.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用skyeye运行《Linux设备驱动开发详解》的实例</title>
		<link>http://blog.donews.com/21cnbao/archive/2010/01/16/1581855.aspx</link>
		<comments>http://blog.donews.com/21cnbao/archive/2010/01/16/1581855.aspx#comments</comments>
		<pubDate>Sat, 16 Jan 2010 14:54:00 +0000</pubDate>
		<dc:creator>宋宝华</dc:creator>
				<category><![CDATA[3.嵌入式系统]]></category>

		<guid isPermaLink="false">http://blog.donews.com/21cnbao/archive/2010/01/16/1581855.aspx</guid>
		<description><![CDATA[将hello world、globalmem、globalfifo放入linux 2.6.31，并使用skyeye运行。]]></description>
			<content:encoded><![CDATA[<h1><a name="添加代码、Kconfig和Makefile"></a></h1>
<h1><a name="添加代码、Kconfig和Makefile"></a></h1>
<h1><a name="添加代码、Kconfig和Makefile">添加代码、Kconfig和Makefile</a></h1>
<p><a name="添加代码、Kconfig和Makefile">在linux-2.6.31/drivers/char目录下建立子目录： </a></p>
<pre class="prettyprint"><a name="添加代码、Kconfig和Makefile"><span class="pln">bhsong@bhsong</span><span class="pun">-</span><span class="pln">laptop</span><span class="pun">:~/</span><span class="pln">develop</span><span class="pun">/</span><span class="pln">svn</span><span class="pun">/</span><span class="pln">ldd6410</span><span class="pun">/</span><span class="pln">linux</span><span class="pun">-</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">31</span><span class="pun">/</span><span class="pln">drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pln">$ mkdir driver_examples</span></a></pre>
<p><a name="添加代码、Kconfig和Makefile">将三个驱动hello.c、globalmem.c、globalfifo.c拷入driver_examples目录： </a></p>
<pre class="prettyprint"><a name="添加代码、Kconfig和Makefile"><span class="pln">cd driver_examples</span><span class="pun">/</span><span class="pln">cp </span><span class="pun">../../../../</span><span class="pln">training</span><span class="pun">/</span><span class="pln">kernel</span><span class="pun">/</span><span class="pln">drivers</span><span class="pun">/</span><span class="pln">hello</span><span class="pun">/</span><span class="pln">hello</span><span class="pun">.</span><span class="pln">c </span><span class="pun">./</span><span class="pln">cp </span><span class="pun">../../../../</span><span class="pln">training</span><span class="pun">/</span><span class="pln">kernel</span><span class="pun">/</span><span class="pln">drivers</span><span class="pun">/</span><span class="pln">globalmem</span><span class="pun">/</span><span class="pln">globalmem</span><span class="pun">.</span><span class="pln">c </span><span class="pun">./</span><span class="pln">cp </span><span class="pun">../../../../</span><span class="pln">training</span><span class="pun">/</span><span class="pln">kernel</span><span class="pun">/</span><span class="pln">drivers</span><span class="pun">/</span><span class="pln">globalmem</span><span class="pun">/</span><span class="pln">globalfifo</span><span class="pun">.</span><span class="pln">c </span><span class="pun">./</span></a></pre>
<p><a name="添加代码、Kconfig和Makefile">修改drivers/char下面的Kconfig和Makefile导入driver_examples目录： </a></p>
<ul>
<li><a name="添加代码、Kconfig和Makefile">在drivers/char/Kconfig中添加： </a></li>
<pre class="prettyprint"><a name="添加代码、Kconfig和Makefile"><span class="pln">source </span><span class="str">&quot;drivers/char/driver_examples/Kconfig&quot;</span></a></pre>
<li><a name="添加代码、Kconfig和Makefile">添加drivers/char/driver_examples/Kconfig文件： </a></li>
<pre class="prettyprint"><a name="添加代码、Kconfig和Makefile"><span class="com">#</span><span class="pln"></span><span class="com"># driver examples configuration</span><span class="pln"></span><span class="com">#</span><span class="pln">

menuconfig DRIVER_EXAMPLE&nbsp; &nbsp; tristate </span><span class="str">&quot;driver examples in 'Explain Linux Device Drivers in detail'&quot;</span><span class="pln">&nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln">&nbsp; &nbsp; &nbsp; say </span><span class="typ">Yes</span><span class="pln"> to build</span><span class="pun">-</span><span class="kwd">in</span><span class="pln"> hello world</span><span class="pun">,</span><span class="pln"> globalmem</span><span class="pun">,</span><span class="pln"> globalfifo</span><span class="pun">,</span><span class="pln"> say M to </span><span class="kwd">get</span><span class="pln"> &nbsp; &nbsp; &nbsp; those kernel modules

</span><span class="kwd">if</span><span class="pln"> DRIVER_EXAMPLE

config HELLO_WORLD&nbsp; &nbsp; tristate </span><span class="str">&quot;Hello World&quot;</span><span class="pln">&nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln">&nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be&nbsp; &nbsp; &nbsp; called hello</span><span class="pun">.</span><span class="pln">mem

config GLOBALMEM&nbsp; &nbsp; tristate </span><span class="str">&quot;globalmem&quot;</span><span class="pln">&nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln">&nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> &nbsp;compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be&nbsp; &nbsp; &nbsp; called globalmem</span><span class="pun">.</span><span class="pln">

config GLOBALFIFO&nbsp; &nbsp; tristate </span><span class="str">&quot;globalfifo&quot;</span><span class="pln">&nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln">&nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> &nbsp;compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be&nbsp; &nbsp; &nbsp; called globalfifo</span><span class="pun">.</span><span class="pln">

endif </span><span class="com"># DRIVER_EXAMPLE</span></a></pre>
</ul>
<p><a name="添加代码、Kconfig和Makefile">这将形成如下菜单： </a></p>
<pre class="prettyprint"><a name="添加代码、Kconfig和Makefile"><span class="pln">&nbsp;driver examples </span><span class="kwd">in</span><span class="pln"> </span><span class="str">'Explain Linux Device Drivers in detail'</span><span class="pln"> </span><span class="pun">─────────────────────────────┐</span><span class="pln">&nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;</span><span class="typ">Arrow</span><span class="pln"> keys navigate the menu</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="pun">&lt;</span><span class="typ">Enter</span><span class="pun">&gt;</span><span class="pln"> selects submenus </span><span class="pun">---&gt;.</span><span class="pln"> &nbsp;</span><span class="typ">Highlighted</span><span class="pln"> letters are hotkeys</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="typ">Pressing</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">Y</span><span class="pun">&gt;</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;includes</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">N</span><span class="pun">&gt;</span><span class="pln"> excludes</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">M</span><span class="pun">&gt;</span><span class="pln"> modularizes features</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="typ">Press</span><span class="pln"> </span><span class="pun">&lt;</span><span class="typ">Esc</span><span class="pun">&gt;&lt;</span><span class="typ">Esc</span><span class="pun">&gt;</span><span class="pln"> to </span><span class="kwd">exit</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&lt;?&gt;</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> </span><span class="typ">Help</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&lt;/&gt;</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> </span><span class="typ">Search</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="typ">Legend</span><span class="pun">:</span><span class="pln"> &nbsp;</span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;</span><span class="pun">[*]</span><span class="pln"> built</span><span class="pun">-</span><span class="kwd">in</span><span class="pln"> &nbsp;</span><span class="pun">[</span><span class="pln"> </span><span class="pun">]</span><span class="pln"> excluded &nbsp;</span><span class="pun">&lt;</span><span class="pln">M</span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">module</span><span class="pln"> &nbsp;</span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">module</span><span class="pln"> capable &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">---</span><span class="pln"> driver examples </span><span class="kwd">in</span><span class="pln"> </span><span class="str">'Explain Linux Device Drivers in detail'</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> &nbsp; </span><span class="typ">Hello</span><span class="pln"> </span><span class="typ">World</span><span class="pln"> </span><span class="pun">(</span><span class="pln">NEW</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> &nbsp; globalmem </span><span class="pun">(</span><span class="pln">NEW</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> &nbsp; globalfifo </span><span class="pun">(</span><span class="pln">NEW</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span></a></pre>
<ul>
<li><a name="添加代码、Kconfig和Makefile">在drivers/char/Makefile中添加： </a></li>
<pre class="prettyprint"><a name="添加代码、Kconfig和Makefile"><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_DRIVER_EXAMPLE</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">+=</span><span class="pln"> driver_examples</span><span class="pun">/</span></a></pre>
<li><a name="添加代码、Kconfig和Makefile">添加drivers/char/driver_examples/Makefile文件： </a></li>
<pre class="prettyprint"><a name="添加代码、Kconfig和Makefile"><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_HELLO_WORLD</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">+=</span><span class="pln"> hello</span><span class="pun">.</span><span class="pln">oobj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_GLOBALMEM</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">+=</span><span class="pln"> globalmem</span><span class="pun">.</span><span class="pln">oobj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_GLOBALFIFO</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">+=</span><span class="pln"> globalfifo</span><span class="pun">.</span><span class="pln">o</span></a></pre>
</ul>
<p><a name="添加代码、Kconfig和Makefile">相关的Kconfig和Makefile patch如下： </a></p>
<pre class="prettyprint"><a name="添加代码、Kconfig和Makefile"><span class="typ">Index</span><span class="pun">:</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">revision </span><span class="lit">87</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">working copy</span><span class="pun">)</span><span class="typ">Index</span><span class="pun">:</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">revision </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">revision </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pln"> </span><span class="pun">+</span><span class="lit">1</span><span class="pun">,</span><span class="lit">3</span><span class="pln"> </span><span class="lit">@@</span><span class="pln"></span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_HELLO_WORLD</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">+=</span><span class="pln"> hello</span><span class="pun">.</span><span class="pln">o</span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_GLOBALMEM</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">+=</span><span class="pln"> globalmem</span><span class="pun">.</span><span class="pln">o</span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_GLOBALFIFO</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">+=</span><span class="pln"> globalfifo</span><span class="pun">.</span><span class="pln">o</span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1110</span><span class="pun">,</span><span class="lit">5</span><span class="pln"> </span><span class="pun">+</span><span class="lit">1110</span><span class="pun">,</span><span class="lit">7</span><span class="pln"> </span><span class="lit">@@</span><span class="pln">&nbsp;&nbsp;source </span><span class="str">&quot;drivers/s390/char/Kconfig&quot;</span><span class="pln">&nbsp;</span><span class="pun">+</span><span class="pln">source </span><span class="str">&quot;drivers/char/driver_examples/Kconfig&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln">&nbsp;endmenu&nbsp;</span><span class="typ">Index</span><span class="pun">:</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">revision </span><span class="lit">87</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">working copy</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">111</span><span class="pun">,</span><span class="lit">6</span><span class="pln"> </span><span class="pun">+</span><span class="lit">111</span><span class="pun">,</span><span class="lit">8</span><span class="pln"> </span><span class="lit">@@</span><span class="pln">&nbsp;obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_JS_RTC</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">+=</span><span class="pln"> js</span><span class="pun">-</span><span class="pln">rtc</span><span class="pun">.</span><span class="pln">o&nbsp;js</span><span class="pun">-</span><span class="pln">rtc</span><span class="pun">-</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> rtc</span><span class="pun">.</span><span class="pln">o&nbsp;</span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_DRIVER_EXAMPLE</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">+=</span><span class="pln"> driver_examples</span><span class="pun">/</span><span class="pln"></span><span class="pun">+</span><span class="pln">&nbsp;</span><span class="com"># Files generated that shall be removed upon make clean</span><span class="pln">&nbsp;clean</span><span class="pun">-</span><span class="pln">files </span><span class="pun">:=</span><span class="pln"> consolemap_deftbl</span><span class="pun">.</span><span class="pln">c defkeymap</span><span class="pun">.</span><span class="pln">c&nbsp;</span><span class="typ">Index</span><span class="pun">:</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">revision </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">revision </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pln"> </span><span class="pun">+</span><span class="lit">1</span><span class="pun">,</span><span class="lit">31</span><span class="pln"> </span><span class="lit">@@</span><span class="pln"></span><span class="pun">+</span><span class="com">#</span><span class="pln"></span><span class="pun">+</span><span class="com"># driver examples configuration</span><span class="pln"></span><span class="pun">+</span><span class="com">#</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">menuconfig DRIVER_EXAMPLE</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; tristate </span><span class="str">&quot;driver examples in 'Explain Linux Device Drivers in detail'&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; say </span><span class="typ">Yes</span><span class="pln"> to build</span><span class="pun">-</span><span class="kwd">in</span><span class="pln"> hello world</span><span class="pun">,</span><span class="pln"> globalmem</span><span class="pun">,</span><span class="pln"> globalfifo</span><span class="pun">,</span><span class="pln"> say M to </span><span class="kwd">get</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; those kernel modules</span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="kwd">if</span><span class="pln"> DRIVER_EXAMPLE</span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">config HELLO_WORLD</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; tristate </span><span class="str">&quot;Hello World&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; called hello</span><span class="pun">.</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">config GLOBALMEM</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; tristate </span><span class="str">&quot;globalmem&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> &nbsp;compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; called globalmem</span><span class="pun">.</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">config GLOBALFIFO</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; tristate </span><span class="str">&quot;globalfifo&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> &nbsp;compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; called globalfifo</span><span class="pun">.</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">endif </span><span class="com"># DRIVER_EXAMPLE</span><span class="pln"></span><span class="pun">+</span><span class="typ">Index</span><span class="pun">:</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">revision </span><span class="lit">87</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">working copy</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1110</span><span class="pun">,</span><span class="lit">5</span><span class="pln"> </span><span class="pun">+</span><span class="lit">1110</span><span class="pun">,</span><span class="lit">7</span><span class="pln"> </span><span class="lit">@@</span><span class="pln">&nbsp;&nbsp;source </span><span class="str">&quot;drivers/s390/char/Kconfig&quot;</span><span class="pln">&nbsp;</span><span class="pun">+</span><span class="pln">source </span><span class="str">&quot;drivers/char/driver_examples/Kconfig&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln">&nbsp;endmenu&nbsp;</span><span class="typ">Index</span><span class="pun">:</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">revision </span><span class="lit">87</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">working copy</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">111</span><span class="pun">,</span><span class="lit">6</span><span class="pln"> </span><span class="pun">+</span><span class="lit">111</span><span class="pun">,</span><span class="lit">8</span><span class="pln"> </span><span class="lit">@@</span><span class="pln">&nbsp;obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_JS_RTC</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">+=</span><span class="pln"> js</span><span class="pun">-</span><span class="pln">rtc</span><span class="pun">.</span><span class="pln">o&nbsp;js</span><span class="pun">-</span><span class="pln">rtc</span><span class="pun">-</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> rtc</span><span class="pun">.</span><span class="pln">o&nbsp;</span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_DRIVER_EXAMPLE</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">+=</span><span class="pln"> driver_examples</span><span class="pun">/</span><span class="pln"></span><span class="pun">+</span><span class="pln">&nbsp;</span><span class="com"># Files generated that shall be removed upon make clean</span><span class="pln">&nbsp;clean</span><span class="pun">-</span><span class="pln">files </span><span class="pun">:=</span><span class="pln"> consolemap_deftbl</span><span class="pun">.</span><span class="pln">c defkeymap</span><span class="pun">.</span><span class="pln">c&nbsp;</span><span class="typ">Index</span><span class="pun">:</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">revision </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Kconfig</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">revision </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pln"> </span><span class="pun">+</span><span class="lit">1</span><span class="pun">,</span><span class="lit">31</span><span class="pln"> </span><span class="lit">@@</span><span class="pln"></span><span class="pun">+</span><span class="com">#</span><span class="pln"></span><span class="pun">+</span><span class="com"># driver examples configuration</span><span class="pln"></span><span class="pun">+</span><span class="com">#</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">menuconfig DRIVER_EXAMPLE</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; tristate </span><span class="str">&quot;driver examples in 'Explain Linux Device Drivers in detail'&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; say </span><span class="typ">Yes</span><span class="pln"> to build</span><span class="pun">-</span><span class="kwd">in</span><span class="pln"> hello world</span><span class="pun">,</span><span class="pln"> globalmem</span><span class="pun">,</span><span class="pln"> globalfifo</span><span class="pun">,</span><span class="pln"> say M to </span><span class="kwd">get</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; those kernel modules</span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="kwd">if</span><span class="pln"> DRIVER_EXAMPLE</span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">config HELLO_WORLD</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; tristate </span><span class="str">&quot;Hello World&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; called hello</span><span class="pun">.</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">config GLOBALMEM</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; tristate </span><span class="str">&quot;globalmem&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> &nbsp;compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; called globalmem</span><span class="pun">.</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">config GLOBALFIFO</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; tristate </span><span class="str">&quot;globalfifo&quot;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">---</span><span class="pln">help</span><span class="pun">---</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="typ">To</span><span class="pln"> &nbsp;compile </span><span class="kwd">this</span><span class="pln"> driver </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> choose M here</span><span class="pun">;</span><span class="pln"> the </span><span class="kwd">module</span><span class="pln"> will be</span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; called globalfifo</span><span class="pun">.</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln">endif </span><span class="com"># DRIVER_EXAMPLE</span><span class="pln"></span><span class="typ">Index</span><span class="pun">:</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"></span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">revision </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> drivers</span><span class="pun">/</span><span class="kwd">char</span><span class="pun">/</span><span class="pln">driver_examples</span><span class="pun">/</span><span class="typ">Makefile</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">(</span><span class="pln">revision </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pln"> </span><span class="pun">+</span><span class="lit">1</span><span class="pun">,</span><span class="lit">3</span><span class="pln"> </span><span class="lit">@@</span><span class="pln"></span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_HELLO_WORLD</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">+=</span><span class="pln"> hello</span><span class="pun">.</span><span class="pln">o</span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_GLOBALMEM</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">+=</span><span class="pln"> globalmem</span><span class="pun">.</span><span class="pln">o</span><span class="pun">+</span><span class="pln">obj</span><span class="pun">-</span><span class="pln">$</span><span class="pun">(</span><span class="pln">CONFIG_GLOBALFIFO</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">+=</span><span class="pln"> globalfifo</span><span class="pun">.</span><span class="pln">o</span></a></pre>
<h1><a name="编译和安装">编译和安装</a></h1>
<p><a name="编译和安装">选中三个模块： </a></p>
<pre class="prettyprint"><a name="编译和安装"><span class="pun">───</span><span class="pln"> driver examples </span><span class="kwd">in</span><span class="pln"> </span><span class="str">'Explain Linux Device Drivers in detail'</span><span class="pln"> </span><span class="pun">─────────────────────────────┐</span><span class="pln">&nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;</span><span class="typ">Arrow</span><span class="pln"> keys navigate the menu</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="pun">&lt;</span><span class="typ">Enter</span><span class="pun">&gt;</span><span class="pln"> selects submenus </span><span class="pun">---&gt;.</span><span class="pln"> &nbsp;</span><span class="typ">Highlighted</span><span class="pln"> letters are hotkeys</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="typ">Pressing</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">Y</span><span class="pun">&gt;</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;includes</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">N</span><span class="pun">&gt;</span><span class="pln"> excludes</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">M</span><span class="pun">&gt;</span><span class="pln"> modularizes features</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="typ">Press</span><span class="pln"> </span><span class="pun">&lt;</span><span class="typ">Esc</span><span class="pun">&gt;&lt;</span><span class="typ">Esc</span><span class="pun">&gt;</span><span class="pln"> to </span><span class="kwd">exit</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&lt;?&gt;</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> </span><span class="typ">Help</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&lt;/&gt;</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> </span><span class="typ">Search</span><span class="pun">.</span><span class="pln"> &nbsp;</span><span class="typ">Legend</span><span class="pun">:</span><span class="pln"> &nbsp;</span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;</span><span class="pun">[*]</span><span class="pln"> built</span><span class="pun">-</span><span class="kwd">in</span><span class="pln"> &nbsp;</span><span class="pun">[</span><span class="pln"> </span><span class="pun">]</span><span class="pln"> excluded &nbsp;</span><span class="pun">&lt;</span><span class="pln">M</span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">module</span><span class="pln"> &nbsp;</span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="kwd">module</span><span class="pln"> capable &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">---</span><span class="pln"> driver examples </span><span class="kwd">in</span><span class="pln"> </span><span class="str">'Explain Linux Device Drivers in detail'</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">&lt;</span><span class="pln">M</span><span class="pun">&gt;</span><span class="pln"> &nbsp; </span><span class="typ">Hello</span><span class="pln"> </span><span class="typ">World</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">&lt;</span><span class="pln">M</span><span class="pun">&gt;</span><span class="pln"> &nbsp; globalmem &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">&lt;</span><span class="pln">M</span><span class="pun">&gt;</span><span class="pln"> &nbsp; globalfifo &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp;&nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">│</span><span class="pln"> </span><span class="pun">│</span><span class="pln"> </span></a></pre>
<p><a name="编译和安装">在linux-2.6.31下运行： </a></p>
<pre class="prettyprint"><a name="编译和安装"><span class="pln">bhsong@bhsong</span><span class="pun">-</span><span class="pln">laptop</span><span class="pun">:~/</span><span class="pln">develop</span><span class="pun">/</span><span class="pln">svn</span><span class="pun">/</span><span class="pln">ldd6410</span><span class="pun">/</span><span class="pln">linux</span><span class="pun">-</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">31</span><span class="pln">$ make modules</span></a></pre>
<p><a name="编译和安装">以loopback方式mount根文件系统，譬如对于skyeye的initrd.img运行如下命令： </a></p>
<pre class="prettyprint"><a name="编译和安装"><span class="pun">...</span><span class="pln">skyeye</span><span class="pun">/</span><span class="pln">training</span><span class="pun">-</span><span class="pln">simulation$ sudo mount </span><span class="pun">-</span><span class="pln">o loop initrd</span><span class="pun">.</span><span class="pln">img initrd</span></a></pre>
<p><a name="编译和安装">将所有模块安装到根文件系统： </a></p>
<pre class="prettyprint"><a name="编译和安装"><span class="pln">make INSTALL_MOD_PATH</span><span class="pun">=</span><span class="str">/home/</span><span class="pln">bhsong</span><span class="pun">/</span><span class="pln">develop</span><span class="pun">/</span><span class="pln">training</span><span class="pun">/</span><span class="pln">skyeye</span><span class="pun">/</span><span class="pln">training</span><span class="pun">-</span><span class="pln">simulation</span><span class="pun">/</span><span class="pln">initrd modules_install</span></a></pre>
<p><a name="编译和安装">请根据你的路径，正确的设置INSTALL_MOD_PATH。安装之后，所有模块以及模块间依赖关系进入根文件系统： </a></p>
<pre class="prettyprint"><a name="编译和安装"><span class="pln">initrd</span><span class="pun">/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">modules$ tree</span><span class="pun">.</span><span class="pln"></span><span class="str">`-- 2.6.31.6-svn79&nbsp; &nbsp; |-- build -&gt; /home/bhsong/develop/svn/ldd6410/linux-2.6.31&nbsp; &nbsp; |-- kernel&nbsp; &nbsp; | &nbsp; |-- drivers&nbsp; &nbsp; | &nbsp; | &nbsp; |-- cdrom&nbsp; &nbsp; | &nbsp; | &nbsp; | &nbsp; `</span><span class="pun">--</span><span class="pln"> cdrom</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> </span><span class="kwd">char</span><span class="pln">&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="str">`-- driver_examples&nbsp; &nbsp; | &nbsp; | &nbsp; | &nbsp; &nbsp; &nbsp; |-- globalfifo.ko&nbsp; &nbsp; | &nbsp; | &nbsp; | &nbsp; &nbsp; &nbsp; |-- globalmem.ko&nbsp; &nbsp; | &nbsp; | &nbsp; | &nbsp; &nbsp; &nbsp; `</span><span class="pun">--</span><span class="pln"> hello</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> input&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="str">`-- gameport&nbsp; &nbsp; | &nbsp; | &nbsp; | &nbsp; &nbsp; &nbsp; `</span><span class="pun">--</span><span class="pln"> gameport</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="str">`-- scsi&nbsp; &nbsp; | &nbsp; | &nbsp; &nbsp; &nbsp; |-- ch.ko&nbsp; &nbsp; | &nbsp; | &nbsp; &nbsp; &nbsp; |-- scsi_wait_scan.ko&nbsp; &nbsp; | &nbsp; | &nbsp; &nbsp; &nbsp; |-- sr_mod.ko&nbsp; &nbsp; | &nbsp; | &nbsp; &nbsp; &nbsp; `</span><span class="pun">--</span><span class="pln"> st</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> lib&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ts_bm</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ts_fsm</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="str">`-- ts_kmp.ko&nbsp; &nbsp; | &nbsp; `</span><span class="pun">--</span><span class="pln"> net&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> ipv4&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> netfilter&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> arp_tables</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> arpt_mangle</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> arptable_filter</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ip_queue</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ip_tables</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_ECN</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_LOG</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_MASQUERADE</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_NETMAP</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_REDIRECT</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_REJECT</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_ULOG</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_addrtype</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_ah</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> ipt_ecn</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> iptable_filter</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> iptable_mangle</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> iptable_nat</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> iptable_raw</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_ipv4</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_defrag_ipv4</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_amanda</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_ftp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_h323</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_irc</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_pptp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_proto_gre</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_proto_udplite</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_sip</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_nat_snmp_basic</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="str">`-- nf_nat_tftp.ko&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; | &nbsp; |-- tcp_bic.ko&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; | &nbsp; |-- tcp_htcp.ko&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; | &nbsp; `</span><span class="pun">--</span><span class="pln"> tcp_westwood</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="str">`-- netfilter&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |-- ipvs&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; `</span><span class="pun">--</span><span class="pln"> ip_vs</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_amanda</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_ftp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_h323</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_irc</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_netbios_ns</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_netlink</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_pptp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_proto_gre</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_proto_udplite</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_sip</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nf_conntrack_tftp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nfnetlink</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nfnetlink_log</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> nfnetlink_queue</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> x_tables</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_CLASSIFY</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_CONNMARK</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_HL</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_MARK</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_NFLOG</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_NFQUEUE</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_RATEEST</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_TCPMSS</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_cluster</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_comment</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_connbytes</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_connlimit</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_connmark</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_conntrack</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_dccp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_dscp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_esp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_hashlimit</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_helper</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_hl</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_iprange</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_length</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_limit</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_mac</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_mark</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_multiport</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_owner</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_pkttype</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_policy</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_quota</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_rateest</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_realm</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_recent</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_state</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_statistic</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_string</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_tcpmss</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_tcpudp</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">|--</span><span class="pln"> xt_time</span><span class="pun">.</span><span class="pln">ko&nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="str">`-- xt_u32.ko&nbsp; &nbsp; |-- modules.alias&nbsp; &nbsp; |-- modules.ccwmap&nbsp; &nbsp; |-- modules.dep&nbsp; &nbsp; |-- modules.ieee1394map&nbsp; &nbsp; |-- modules.inputmap&nbsp; &nbsp; |-- modules.isapnpmap&nbsp; &nbsp; |-- modules.ofmap&nbsp; &nbsp; |-- modules.order&nbsp; &nbsp; |-- modules.pcimap&nbsp; &nbsp; |-- modules.seriomap&nbsp; &nbsp; |-- modules.symbols&nbsp; &nbsp; |-- modules.usbmap&nbsp; &nbsp; `</span><span class="pun">--</span><span class="pln"> source </span><span class="pun">-&gt;</span><span class="pln"> </span><span class="str">/home/</span><span class="pln">bhsong</span><span class="pun">/</span><span class="pln">develop</span><span class="pun">/</span><span class="pln">svn</span><span class="pun">/</span><span class="pln">ldd6410</span><span class="pun">/</span><span class="pln">linux</span><span class="pun">-</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">31</span><span class="pln">

</span><span class="lit">17</span><span class="pln"> directories</span><span class="pun">,</span><span class="pln"> </span><span class="lit">116</span><span class="pln"> files</span></a></pre>
<h1><a name="运行">运行</a></h1>
<p><a name="运行">启动Linux，对于skyeye为： </a></p>
<pre class="prettyprint"><a name="运行"><span class="pln">sudo skyeye </span><span class="pun">-</span><span class="pln">e vmlinux </span><span class="pun">-</span><span class="pln">c skyeye</span><span class="pun">-</span><span class="pln">standalone</span><span class="pun">.</span><span class="pln">conf</span><span class="pun">...</span><span class="pln"></span><span class="typ">Welcome</span><span class="pln"> to&nbsp; &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp;_____ &nbsp; &nbsp; &nbsp;__ &nbsp; __ &nbsp; &nbsp;_ &nbsp; &nbsp; &nbsp;_&nbsp; &nbsp; </span><span class="pun">/</span><span class="pln"> </span><span class="pun">\</span><span class="pln"> &nbsp; &nbsp;</span><span class="pun">/</span><span class="pln"> &nbsp;__ </span><span class="pun">\</span><span class="pln"> &nbsp; &nbsp;</span><span class="pun">/</span><span class="pln"> &nbsp;</span><span class="pun">\</span><span class="pln">_</span><span class="pun">/</span><span class="pln"> &nbsp;</span><span class="pun">\</span><span class="pln"> &nbsp;</span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp;</span><span class="pun">|</span><span class="pln">_</span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="str">/ _ \ &nbsp; | | &nbsp;| | &nbsp;/</span><span class="pln"> </span><span class="pun">/\</span><span class="pln"> &nbsp; </span><span class="pun">/\</span><span class="pln"> </span><span class="pun">\</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; _ ____ &nbsp;_ &nbsp; _ &nbsp;_ &nbsp;_ &nbsp; </span><span class="str">/ /</span><span class="pln">_</span><span class="pun">\</span><span class="pln"> </span><span class="pun">\</span><span class="pln"> &nbsp;</span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln">__</span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> &nbsp;</span><span class="pun">\</span><span class="pln">_</span><span class="pun">/</span><span class="pln"> &nbsp;</span><span class="pun">\</span><span class="pln"> </span><span class="pun">\|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp;</span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> &nbsp;_ </span><span class="pun">\|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="pun">|\</span><span class="pln"> </span><span class="pun">\</span><span class="str">/ /</span><span class="pln">&nbsp;</span><span class="pun">/</span><span class="pln"> </span><span class="pun">/</span><span class="pln">___</span><span class="pun">\</span><span class="pln"> </span><span class="pun">\</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln">__</span><span class="pun">\</span><span class="pln"> </span><span class="pun">\</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">|</span><span class="pln">___ </span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln">_</span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln">_</span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="str">/ &nbsp; &nbsp;\/</span><span class="pln">_</span><span class="pun">/</span><span class="pln"> &nbsp; &nbsp; </span><span class="pun">\</span><span class="pln">_</span><span class="pun">\|</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> &nbsp; </span><span class="pun">\</span><span class="pln">_</span><span class="pun">\|</span><span class="pln">_</span><span class="pun">|</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="pun">|</span><span class="pln">_</span><span class="pun">||</span><span class="pln">_____</span><span class="pun">||</span><span class="pln">_</span><span class="pun">|</span><span class="pln">_</span><span class="pun">|</span><span class="pln"> </span><span class="pun">|</span><span class="pln">_</span><span class="pun">|\</span><span class="pln">____</span><span class="pun">|\</span><span class="pln">_</span><span class="pun">/\</span><span class="pln">_</span><span class="pun">/</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="typ">ARMLinux</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> </span><span class="typ">Lihacker</span><span class="pln"> LDD6410

</span><span class="typ">For</span><span class="pln"> further information please check</span><span class="pun">:</span><span class="pln">http</span><span class="pun">:</span><span class="com">//www.lihacker.com/</span><span class="pln">http</span><span class="pun">:</span><span class="com">//www.linuxdriver.cn/</span><span class="pln"></span><span class="typ">For</span><span class="pln"> technical support</span><span class="pun">,</span><span class="pln"> please subscribe mail list linuxdriver@googlegroups</span><span class="pun">.</span><span class="pln">com </span><span class="kwd">and</span><span class="pln"> post there</span><span class="pun">.</span><span class="pln"></span><span class="typ">The</span><span class="pln"> url </span><span class="kwd">is</span><span class="pln"> http</span><span class="pun">:</span><span class="com">//groups.google.com/group/linuxdriver.</span><span class="pln"></span><span class="com"># </span></a></pre>
<p><a name="运行">加载模块： </a></p>
<pre class="prettyprint"><a name="运行"><span class="pln">modprobe hellomodprobe globalmem &nbsp;globalmem_major</span><span class="pun">=</span><span class="lit">250</span><span class="pln">modprobe globalfifo globalfifo_major</span><span class="pun">=</span><span class="lit">251</span></a></pre>
<p><a name="运行">skyeye对insmod的支持有些问题，加载模块时会出现： </a></p>
<pre class="prettyprint"><a name="运行"><span class="com"># modprobe hello</span><span class="pln"></span><span class="typ">Unable</span><span class="pln"> to handle kernel paging request at </span><span class="kwd">virtual</span><span class="pln"> address bf000000pgd </span><span class="pun">=</span><span class="pln"> c05f0000</span><span class="pun">[</span><span class="pln">bf000000</span><span class="pun">]</span><span class="pln"> </span><span class="pun">*</span><span class="pln">pgd</span><span class="pun">=</span><span class="lit">00000000</span><span class="pln"></span><span class="typ">Internal</span><span class="pln"> error</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Oops</span><span class="pun">:</span><span class="pln"> </span><span class="lit">807</span><span class="pln"> </span><span class="pun">[</span><span class="com">#1]</span><span class="pln"></span><span class="typ">Modules</span><span class="pln"> linked </span><span class="kwd">in</span><span class="pun">:</span><span class="pln">CPU</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> &nbsp; &nbsp;</span><span class="typ">Not</span><span class="pln"> tainted &nbsp;</span><span class="pun">(</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">31.6</span><span class="pun">-</span><span class="pln">svn79 </span><span class="com">#21)</span><span class="pln">PC </span><span class="kwd">is</span><span class="pln"> at __memzero</span><span class="pun">+</span><span class="lit">0x24</span><span class="pun">/</span><span class="lit">0x80</span><span class="pln">LR </span><span class="kwd">is</span><span class="pln"> at </span><span class="lit">0x0</span><span class="pln">pc </span><span class="pun">:</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="pln">c0107404</span><span class="pun">&gt;]</span><span class="pln"> &nbsp; &nbsp;lr </span><span class="pun">:</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="lit">00000000</span><span class="pun">&gt;]</span><span class="pln"> &nbsp; &nbsp;psr</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20000013</span><span class="pln">sp </span><span class="pun">:</span><span class="pln"> c182bf0c &nbsp;ip </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> &nbsp;fp </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000005</span><span class="pln">r10</span><span class="pun">:</span><span class="pln"> c2807230 &nbsp;r9 </span><span class="pun">:</span><span class="pln"> c2807000 &nbsp;r8 </span><span class="pun">:</span><span class="pln"> c2807388r7 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000004</span><span class="pln"> &nbsp;r6 </span><span class="pun">:</span><span class="pln"> c2807168 &nbsp;r5 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000012</span><span class="pln"> &nbsp;r4 </span><span class="pun">:</span><span class="pln"> bf000000r3 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> &nbsp;r2 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> &nbsp;r1 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000464</span><span class="pln"> &nbsp;r0 </span><span class="pun">:</span><span class="pln"> bf000000</span><span class="typ">Flags</span><span class="pun">:</span><span class="pln"> nzCv &nbsp;</span><span class="typ">IRQs</span><span class="pln"> on &nbsp;</span><span class="typ">FIQs</span><span class="pln"> on &nbsp;</span><span class="typ">Mode</span><span class="pln"> SVC_32 &nbsp;ISA ARM &nbsp;</span><span class="typ">Segment</span><span class="pln"> user</span><span class="typ">Control</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0000317f</span><span class="pln"> &nbsp;</span><span class="typ">Table</span><span class="pun">:</span><span class="pln"> c05f0000 &nbsp;DAC</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000015</span><span class="pln"></span><span class="typ">Process</span><span class="pln"> modprobe </span><span class="pun">(</span><span class="pln">pid</span><span class="pun">:</span><span class="pln"> </span><span class="lit">795</span><span class="pun">,</span><span class="pln"> stack limit </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xc182a270</span><span class="pun">)</span><span class="pln"></span><span class="typ">Stack</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0xc182bf0c</span><span class="pln"> to </span><span class="lit">0xc182c000</span><span class="pun">)</span><span class="pln">bf00</span><span class="pun">:</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c005fba0 </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> c2807518 c2807608 bf20</span><span class="pun">:</span><span class="pln"> c28072dc c1139e60 c28078a0 </span><span class="lit">00000010</span><span class="pln"> </span><span class="lit">000000c5</span><span class="pln"> c2807388 c182a000 c2807630 bf40</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> c008c178 </span><span class="lit">00000171</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">0015ec79</span><span class="pln"> </span><span class="lit">00000287</span><span class="pln"> </span><span class="lit">00000001</span><span class="pln"> </span><span class="lit">00000008</span><span class="pln"> bf60</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">0015e300</span><span class="pln"> c002bf48 c182a000 </span><span class="lit">00000000</span><span class="pln"> bf80</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> c0060878 c1c1a2c0 c1c2f3a0 </span><span class="lit">00000003</span><span class="pln"> </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">0015dfa8</span><span class="pln"> bfa0</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000080</span><span class="pln"> c002bda0 </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">0015e300</span><span class="pln"> </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> bfc0</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">0015dfa8</span><span class="pln"> </span><span class="lit">00000080</span><span class="pln"> </span><span class="lit">0015e2a0</span><span class="pln"> </span><span class="lit">0015dfbc</span><span class="pln"> </span><span class="lit">00000001</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> bfe0</span><span class="pun">:</span><span class="pln"> bea65958 bea65948 </span><span class="lit">000177f8</span><span class="pln"> </span><span class="lit">00009350</span><span class="pln"> </span><span class="lit">20000010</span><span class="pln"> </span><span class="lit">0015e300</span><span class="pln"> ab081000 </span><span class="lit">11000006</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="pln">c0107404</span><span class="pun">&gt;]</span><span class="pln"> </span><span class="pun">(</span><span class="pln">__memzero</span><span class="pun">+</span><span class="lit">0x24</span><span class="pun">/</span><span class="lit">0x80</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="lit">00000000</span><span class="pun">&gt;]</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0x0</span><span class="pun">)</span><span class="pln"></span><span class="typ">Code</span><span class="pun">:</span><span class="pln"> e52de004 e1a0c002 e1a0e002 e2511040 </span><span class="pun">(</span><span class="pln">a8a0500c</span><span class="pun">)</span><span class="pln"> </span><span class="pun">---[</span><span class="pln"> </span><span class="kwd">end</span><span class="pln"> trace </span><span class="lit">1e19dcbb1e19dcba</span><span class="pln"> </span><span class="pun">]---</span><span class="pln"></span><span class="typ">Segmentation</span><span class="pln"> fault</span></a></pre>
<p><a name="运行">详见bug: </a><a rel="nofollow" href="http://sourceforge.net/tracker/?func=detail&amp;aid=2897905&amp;group_id=85554&amp;atid=576533">http://sourceforge.net/tracker/?func=detail&amp;aid=2897905&amp;group_id=85554&amp;atid=576533</a> 我们使用strace去寻找死在哪个系统调用： </p>
<pre class="prettyprint"><span class="com"># strace modprobe hello</span><span class="pln">execve</span><span class="pun">(</span><span class="str">&quot;/sbin/modprobe&quot;</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="str">&quot;modprobe&quot;</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;hello&quot;</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="com">/* 7 vars */</span><span class="pun">])</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">uname</span><span class="pun">({</span><span class="pln">sys</span><span class="pun">=</span><span class="str">&quot;Linux&quot;</span><span class="pun">,</span><span class="pln"> node</span><span class="pun">=</span><span class="str">&quot;lihacker&quot;</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...})</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">brk</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x15d000</span><span class="pln">brk</span><span class="pun">(</span><span class="lit">0x15dd02</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x15dd02</span><span class="pln">set_tls</span><span class="pun">(</span><span class="lit">0x15d4a0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0x1573c0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0x1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0x15d4a0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">brk</span><span class="pun">(</span><span class="lit">0x17ed02</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x17ed02</span><span class="pln">brk</span><span class="pun">(</span><span class="lit">0x17f000</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x17f000</span><span class="pln">getuid32</span><span class="pun">()</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">chdir</span><span class="pun">(</span><span class="str">&quot;/lib/modules&quot;</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">uname</span><span class="pun">({</span><span class="pln">sys</span><span class="pun">=</span><span class="str">&quot;Linux&quot;</span><span class="pun">,</span><span class="pln"> node</span><span class="pun">=</span><span class="str">&quot;lihacker&quot;</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...})</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">chdir</span><span class="pun">(</span><span class="str">&quot;2.6.31.6-svn79&quot;</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">open</span><span class="pun">(</span><span class="str">&quot;/proc/modules&quot;</span><span class="pun">,</span><span class="pln"> O_RDONLY</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pln">fstat64</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">st_mode</span><span class="pun">=</span><span class="pln">S_IFREG</span><span class="pun">|</span><span class="lit">0444</span><span class="pun">,</span><span class="pln"> st_size</span><span class="pun">=</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...})</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">mmap2</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4096</span><span class="pun">,</span><span class="pln"> PROT_READ</span><span class="pun">|</span><span class="pln">PROT_WRITE</span><span class="pun">,</span><span class="pln"> MAP_PRIVATE</span><span class="pun">|</span><span class="pln">MAP_ANONYMOUS</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x40000000</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">close</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">munmap</span><span class="pun">(</span><span class="lit">0x40000000</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4096</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">lstat64</span><span class="pun">(</span><span class="str">&quot;/etc/modprobe.conf&quot;</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xbe846880</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> ENOENT </span><span class="pun">(</span><span class="typ">No</span><span class="pln"> such file </span><span class="kwd">or</span><span class="pln"> directory</span><span class="pun">)</span><span class="pln">lstat64</span><span class="pun">(</span><span class="str">&quot;/etc/modprobe.d&quot;</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xbe846880</span><span class="pun">)</span><span class="pln"> &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> ENOENT </span><span class="pun">(</span><span class="typ">No</span><span class="pln"> such file </span><span class="kwd">or</span><span class="pln"> directory</span><span class="pun">)</span><span class="pln">open</span><span class="pun">(</span><span class="str">&quot;modules.dep&quot;</span><span class="pun">,</span><span class="pln"> O_RDONLY</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pln">fstat64</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">st_mode</span><span class="pun">=</span><span class="pln">S_IFREG</span><span class="pun">|</span><span class="lit">0644</span><span class="pun">,</span><span class="pln"> st_size</span><span class="pun">=</span><span class="lit">17141</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...})</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">mmap2</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4096</span><span class="pun">,</span><span class="pln"> PROT_READ</span><span class="pun">|</span><span class="pln">PROT_WRITE</span><span class="pun">,</span><span class="pln"> MAP_PRIVATE</span><span class="pun">|</span><span class="pln">MAP_ANONYMOUS</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x40001000</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;/lib/modules/2.6.31.6-svn79/kerne&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;nel/net/netfilter/x_tables.ko\n/li&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;/lib/modules/2.6.31.6-svn79/kerne&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;/net/netfilter/xt_esp.ko: /lib/mo&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;ables.ko /lib/modules/2.6.31.6-sv&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;es/2.6.31.6-svn79/kernel/net/netf&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;.6-svn79/kernel/net/netfilter/nf_&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;b/modules/2.6.31.6-svn79/kernel/n&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;etfilter/nf_conntrack_ipv4.ko /li&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;.6.31.6-svn79/kernel/net/netfilte&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;defrag_ipv4.ko\n/lib/modules/2.6.3&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;tfilter/nf_conntrack_ipv4.ko /lib&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;.6-svn79/kernel/net/ipv4/netfilte&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;1.6-svn79/kernel/net/netfilter/x_&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;ib/modules/2.6.31.6-svn79/kernel/&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;ib/modules/2.6.31.6-svn79/kernel/&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;o:\n/lib/modules/2.6.31.6-svn79/ke&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">757</span><span class="pln">close</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">munmap</span><span class="pun">(</span><span class="lit">0x40001000</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4096</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">open</span><span class="pun">(</span><span class="str">&quot;/lib/modules/2.6.31.6-svn79/kernel/drivers/char/driver_examples/hello.ko&quot;</span><span class="pun">,</span><span class="pln"> O_RDONLY</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pln">fstat64</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">st_mode</span><span class="pun">=</span><span class="pln">S_IFREG</span><span class="pun">|</span><span class="lit">0644</span><span class="pun">,</span><span class="pln"> st_size</span><span class="pun">=</span><span class="lit">2425</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...})</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\1\0(\0\1\0\0\0\0\0\0\0\0\0\0\0\210&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">3072</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2425</span><span class="pln">read</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;&quot;</span><span class="pun">...,</span><span class="pln"> </span><span class="lit">647</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">close</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">init_module</span><span class="pun">(</span><span class="lit">0x15e300</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2425</span><span class="pun">,</span><span class="pln"> </span><span class="str">&quot;&quot;</span><span class="typ">Unable</span><span class="pln"> to handle kernel paging request at </span><span class="kwd">virtual</span><span class="pln"> address bf000000pgd </span><span class="pun">=</span><span class="pln"> c0620000</span><span class="pun">[</span><span class="pln">bf000000</span><span class="pun">]</span><span class="pln"> </span><span class="pun">*</span><span class="pln">pgd</span><span class="pun">=</span><span class="lit">00000000</span><span class="pln"></span><span class="typ">Internal</span><span class="pln"> error</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Oops</span><span class="pun">:</span><span class="pln"> </span><span class="lit">807</span><span class="pln"> </span><span class="pun">[</span><span class="com">#1]</span><span class="pln"></span><span class="typ">Modules</span><span class="pln"> linked </span><span class="kwd">in</span><span class="pun">:</span><span class="pln">CPU</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> &nbsp; &nbsp;</span><span class="typ">Not</span><span class="pln"> tainted &nbsp;</span><span class="pun">(</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">31.6</span><span class="pun">-</span><span class="pln">svn79 </span><span class="com">#21)</span><span class="pln">PC </span><span class="kwd">is</span><span class="pln"> at __memzero</span><span class="pun">+</span><span class="lit">0x24</span><span class="pun">/</span><span class="lit">0x80</span><span class="pln">LR </span><span class="kwd">is</span><span class="pln"> at </span><span class="lit">0x0</span><span class="pln">pc </span><span class="pun">:</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="pln">c0107404</span><span class="pun">&gt;]</span><span class="pln"> &nbsp; &nbsp;lr </span><span class="pun">:</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="lit">00000000</span><span class="pun">&gt;]</span><span class="pln"> &nbsp; &nbsp;psr</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20000013</span><span class="pln">sp </span><span class="pun">:</span><span class="pln"> c069ff0c &nbsp;ip </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> &nbsp;fp </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000005</span><span class="pln">r10</span><span class="pun">:</span><span class="pln"> c2807230 &nbsp;r9 </span><span class="pun">:</span><span class="pln"> c2807000 &nbsp;r8 </span><span class="pun">:</span><span class="pln"> c2807388r7 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000004</span><span class="pln"> &nbsp;r6 </span><span class="pun">:</span><span class="pln"> c2807168 &nbsp;r5 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000012</span><span class="pln"> &nbsp;r4 </span><span class="pun">:</span><span class="pln"> bf000000r3 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> &nbsp;r2 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> &nbsp;r1 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000464</span><span class="pln"> &nbsp;r0 </span><span class="pun">:</span><span class="pln"> bf000000</span><span class="typ">Flags</span><span class="pun">:</span><span class="pln"> nzCv &nbsp;</span><span class="typ">IRQs</span><span class="pln"> on &nbsp;</span><span class="typ">FIQs</span><span class="pln"> on &nbsp;</span><span class="typ">Mode</span><span class="pln"> SVC_32 &nbsp;ISA ARM &nbsp;</span><span class="typ">Segment</span><span class="pln"> user</span><span class="typ">Control</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0000317f</span><span class="pln"> &nbsp;</span><span class="typ">Table</span><span class="pun">:</span><span class="pln"> c0620000 &nbsp;DAC</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000015</span><span class="pln"></span><span class="typ">Process</span><span class="pln"> modprobe </span><span class="pun">(</span><span class="pln">pid</span><span class="pun">:</span><span class="pln"> </span><span class="lit">796</span><span class="pun">,</span><span class="pln"> stack limit </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xc069e270</span><span class="pun">)</span><span class="pln"></span><span class="typ">Stack</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0xc069ff0c</span><span class="pln"> to </span><span class="lit">0xc06a0000</span><span class="pun">)</span><span class="pln">ff00</span><span class="pun">:</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c005fba0 </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> c2807518 c2807608 ff20</span><span class="pun">:</span><span class="pln"> c28072dc c1139240 c28078a0 </span><span class="lit">00000010</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> c2807388 </span><span class="lit">00000000</span><span class="pln"> c2807630 ff40</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> ff60</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">0015e300</span><span class="pln"> c002bf48 c069e000 </span><span class="lit">00000000</span><span class="pln"> ff80</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> c0060878 be846958 c002dbe0 </span><span class="lit">00000000</span><span class="pln"> </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">0015dfa8</span><span class="pln"> ffa0</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000080</span><span class="pln"> c002bf0c </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">0015e300</span><span class="pln"> </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> ffc0</span><span class="pun">:</span><span class="pln"> </span><span class="lit">00000979</span><span class="pln"> </span><span class="lit">0015e2f0</span><span class="pln"> </span><span class="lit">0015dfa8</span><span class="pln"> </span><span class="lit">00000080</span><span class="pln"> </span><span class="lit">0015e2a0</span><span class="pln"> </span><span class="lit">0015dfbc</span><span class="pln"> </span><span class="lit">00000001</span><span class="pln"> </span><span class="lit">00000000</span><span class="pln"> ffe0</span><span class="pun">:</span><span class="pln"> be846958 be846948 </span><span class="lit">000177f8</span><span class="pln"> </span><span class="lit">00009350</span><span class="pln"> </span><span class="lit">20000010</span><span class="pln"> </span><span class="lit">0015e300</span><span class="pln"> ebff1fc9 e3500000 </span><span class="pun">[&lt;</span><span class="pln">c0107404</span><span class="pun">&gt;]</span><span class="pln"> </span><span class="pun">(</span><span class="pln">__memzero</span><span class="pun">+</span><span class="lit">0x24</span><span class="pun">/</span><span class="lit">0x80</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="lit">00000000</span><span class="pun">&gt;]</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0x0</span><span class="pun">)</span><span class="pln"></span><span class="typ">Code</span><span class="pun">:</span><span class="pln"> e52de004 e1a0c002 e1a0e002 e2511040 </span><span class="pun">(</span><span class="pln">a8a0500c</span><span class="pun">)</span><span class="pln"> </span><span class="pun">---[</span><span class="pln"> </span><span class="kwd">end</span><span class="pln"> trace </span><span class="lit">1e19dcbb1e19dcba</span><span class="pln"> </span><span class="pun">]---</span><span class="pln">&nbsp;</span><span class="pun">&lt;</span><span class="pln">unfinished </span><span class="pun">...&gt;</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> killed </span><span class="kwd">by</span><span class="pln"> SIGSEGV </span><span class="pun">+++</span></pre>
<p>很明显，死在内核的linux-2.6.31/kernel/module.c的init_module()函数中,加上几个printk: </p>
<pre class="prettyprint"><span class="lit">2453</span><span class="pln"> SYSCALL_DEFINE3</span><span class="pun">(</span><span class="pln">init_module</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> __user </span><span class="pun">*,</span><span class="pln"> umod</span><span class="pun">,</span><span class="pln"></span><span class="lit">2454</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pun">,</span><span class="pln"> len</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> __user </span><span class="pun">*,</span><span class="pln"> uargs</span><span class="pun">)</span><span class="pln"></span><span class="lit">2455</span><span class="pln"> </span><span class="pun">{</span><span class="pln"></span><span class="lit">2456</span><span class="pln"> &nbsp; &nbsp; </span><span class="kwd">struct</span><span class="pln"> </span><span class="kwd">module</span><span class="pln"> </span><span class="pun">*</span><span class="pln">mod</span><span class="pun">;</span><span class="pln"></span><span class="lit">2457</span><span class="pln"> &nbsp; &nbsp; </span><span class="kwd">int</span><span class="pln"> ret </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"></span><span class="lit">2458</span><span class="pln"> </span><span class="lit">2459</span><span class="pln"> &nbsp; &nbsp; printk</span><span class="pun">(</span><span class="str">&quot;%s %d\n&quot;</span><span class="pun">,</span><span class="pln"> __func__</span><span class="pun">,</span><span class="pln"> __LINE__</span><span class="pun">);</span><span class="pln"></span><span class="lit">2460</span><span class="pln"> </span><span class="lit">2461</span><span class="pln"> &nbsp; &nbsp; </span><span class="com">/* Must have permission */</span><span class="pln"></span><span class="lit">2462</span><span class="pln"> &nbsp; &nbsp; </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">capable</span><span class="pun">(</span><span class="pln">CAP_SYS_MODULE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> modules_disabled</span><span class="pun">)</span><span class="pln"></span><span class="lit">2463</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">-</span><span class="pln">EPERM</span><span class="pun">;</span><span class="pln"></span><span class="lit">2464</span><span class="pln"> </span><span class="lit">2465</span><span class="pln"> &nbsp; &nbsp; </span><span class="pun">+</span><span class="pln">printk</span><span class="pun">(</span><span class="str">&quot;%s %d\n&quot;</span><span class="pun">,</span><span class="pln"> __func__</span><span class="pun">,</span><span class="pln"> __LINE__</span><span class="pun">);</span><span class="pln"></span><span class="lit">2466</span><span class="pln"> &nbsp; &nbsp; </span><span class="lit">2467</span><span class="pln"> &nbsp; &nbsp; </span><span class="com">/* Only one module load at a time, please */</span><span class="pln"></span><span class="lit">2468</span><span class="pln"> &nbsp; &nbsp; </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mutex_lock_interruptible</span><span class="pun">(&amp;</span><span class="pln">module_mutex</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"></span><span class="lit">2469</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">-</span><span class="pln">EINTR</span><span class="pun">;</span><span class="pln"></span><span class="lit">2470</span><span class="pln"> </span><span class="lit">2471</span><span class="pln"> &nbsp; &nbsp; </span><span class="pun">+</span><span class="pln">printk</span><span class="pun">(</span><span class="str">&quot;%s %d\n&quot;</span><span class="pun">,</span><span class="pln"> __func__</span><span class="pun">,</span><span class="pln"> __LINE__</span><span class="pun">);</span><span class="pln"></span><span class="lit">2472</span><span class="pln"> &nbsp; &nbsp; </span><span class="lit">2473</span><span class="pln"> &nbsp; &nbsp; </span><span class="com">/* Do all the hard work */</span><span class="pln"></span><span class="lit">2474</span><span class="pln"> &nbsp; &nbsp; mod </span><span class="pun">=</span><span class="pln"> load_module</span><span class="pun">(</span><span class="pln">umod</span><span class="pun">,</span><span class="pln"> len</span><span class="pun">,</span><span class="pln"> uargs</span><span class="pun">);</span><span class="pln"></span><span class="lit">2475</span><span class="pln"> &nbsp; &nbsp; </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">IS_ERR</span><span class="pun">(</span><span class="pln">mod</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"></span><span class="lit">2476</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; mutex_unlock</span><span class="pun">(&amp;</span><span class="pln">module_mutex</span><span class="pun">);</span><span class="pln"></span><span class="lit">2477</span><span class="pln"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">return</span><span class="pln"> PTR_ERR</span><span class="pun">(</span><span class="pln">mod</span><span class="pun">);</span><span class="pln"></span><span class="lit">2478</span><span class="pln"> &nbsp; &nbsp; </span><span class="pun">}</span><span class="pln"></span><span class="lit">2479</span><span class="pln"> </span><span class="lit">2480</span><span class="pln"> &nbsp; &nbsp; </span><span class="pun">+</span><span class="pln">printk</span><span class="pun">(</span><span class="str">&quot;%s %d\n&quot;</span><span class="pun">,</span><span class="pln"> __func__</span><span class="pun">,</span><span class="pln"> __LINE__</span><span class="pun">);</span><span class="pln"></span><span class="lit">2481</span><span class="pln"> &nbsp; &nbsp; </span></pre>
<p>再次运行: </p>
<pre class="prettyprint"><span class="com"># modprobe hello</span><span class="pln">sys_init_module </span><span class="lit">2459</span><span class="pln">sys_init_module </span><span class="lit">2465</span><span class="pln">sys_init_module </span><span class="lit">2471</span><span class="pln"></span><span class="typ">Unable</span><span class="pln"> to handle kernel paging request at </span><span class="kwd">virtual</span><span class="pln"> address bf000000pgd </span><span class="pun">=</span><span class="pln"> c05f0000</span><span class="pun">[</span><span class="pln">bf000000</span><span class="pun">]</span><span class="pln"> </span><span class="pun">*</span><span class="pln">pgd</span><span class="pun">=</span><span class="lit">00000000</span><span class="pln"></span><span class="typ">Internal</span><span class="pln"> error</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Oops</span><span class="pun">:</span><span class="pln"> </span><span class="lit">807</span><span class="pln"> </span><span class="pun">[</span><span class="com">#1]</span><span class="pln"></span><span class="typ">Modules</span><span class="pln"> linked </span><span class="kwd">in</span><span class="pun">:</span></pre>
<p>从打印信息可以看出，panic发生在load_module函数，既然&quot;sys_init_module 2471&quot;被打印而&quot;sys_init_module 2480&quot;未打印。 继续跟进load_module()，直到最后发现内核崩溃在<tt>memset(ptr, 0, mod-&gt;core_size);</tt>： </p>
<pre class="prettyprint"><span class="kwd">static</span><span class="pln"> noinline </span><span class="kwd">struct</span><span class="pln"> </span><span class="kwd">module</span><span class="pln"> </span><span class="pun">*</span><span class="pln">load_module</span><span class="pun">(</span><span class="kwd">void</span><span class="pln"> __user </span><span class="pun">*</span><span class="pln">umod</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> len</span><span class="pun">,</span><span class="pln">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> __user </span><span class="pun">*</span><span class="pln">uargs</span><span class="pun">)</span><span class="pln"></span><span class="pun">{</span><span class="pln"></span><span class="pun">...</span><span class="pln">&nbsp; &nbsp; &nbsp;ptr </span><span class="pun">=</span><span class="pln"> module_alloc_update_bounds</span><span class="pun">(</span><span class="pln">mod</span><span class="pun">-&gt;</span><span class="pln">core_size</span><span class="pun">);</span><span class="pln"></span><span class="pun">...</span><span class="pln">&nbsp; &nbsp; &nbsp;kmemleak_not_leak</span><span class="pun">(</span><span class="pln">ptr</span><span class="pun">);</span><span class="pln"></span><span class="pun">...</span><span class="pln">&nbsp; &nbsp; &nbsp;memset</span><span class="pun">(</span><span class="pln">ptr</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> mod</span><span class="pun">-&gt;</span><span class="pln">core_size</span><span class="pun">);</span></pre>
<p>一路跟踪源代码，发现ARM的Kernel会将模块的内存申请在3G-16M到3G的区域，而skyeye在内核空间处理3G以下地址的时候，会发生错误: </p>
<pre class="prettyprint"><span class="str">&quot;Unable to handle kernel paging request at virtual address bf000000&quot;</span></pre>
<p>因此，workaround掉这个bug: </p>
<pre class="prettyprint"><span class="typ">Index</span><span class="pun">:</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">kernel</span><span class="pun">/</span><span class="kwd">module</span><span class="pun">.</span><span class="pln">c</span><span class="pun">===================================================================</span><span class="pln"></span><span class="pun">---</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">kernel</span><span class="pun">/</span><span class="kwd">module</span><span class="pun">.</span><span class="pln">c &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">revision </span><span class="lit">87</span><span class="pun">)</span><span class="pln"></span><span class="pun">+++</span><span class="pln"> arch</span><span class="pun">/</span><span class="pln">arm</span><span class="pun">/</span><span class="pln">kernel</span><span class="pun">/</span><span class="kwd">module</span><span class="pun">.</span><span class="pln">c &nbsp; &nbsp;</span><span class="pun">(</span><span class="pln">working copy</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">38</span><span class="pun">,</span><span class="lit">7</span><span class="pln"> </span><span class="pun">+</span><span class="lit">38</span><span class="pun">,</span><span class="lit">7</span><span class="pln"> </span><span class="lit">@@</span><span class="pln">&nbsp;</span><span class="com">#ifdef CONFIG_MMU</span><span class="pln">&nbsp;</span><span class="kwd">void</span><span class="pln"> </span><span class="pun">*</span><span class="pln">module_alloc</span><span class="pun">(</span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> size</span><span class="pun">)</span><span class="pln">&nbsp;</span><span class="pun">{</span><span class="pln"></span><span class="pun">-</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="kwd">struct</span><span class="pln"> vm_struct </span><span class="pun">*</span><span class="pln">area</span><span class="pun">;</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="com">/*struct vm_struct *area;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; size = PAGE_ALIGN(size);&nbsp; &nbsp; &nbsp; &nbsp; if (!size)@@ -49,6 +49,9 @@&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return NULL;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC);+*/</span><span class="pln"></span><span class="pun">+</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; </span><span class="kwd">return</span><span class="pln"> size </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> NULL </span><span class="pun">:</span><span class="pln"> kmalloc</span><span class="pun">(</span><span class="pln">size</span><span class="pun">,</span><span class="pln"> GFP_KERNEL</span><span class="pun">);</span><span class="pln">&nbsp;</span><span class="pun">}</span><span class="pln">&nbsp;</span><span class="com">#else /* CONFIG_MMU */</span><span class="pln">&nbsp;</span><span class="kwd">void</span><span class="pln"> </span><span class="pun">*</span><span class="pln">module_alloc</span><span class="pun">(</span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> size</span><span class="pun">)</span><span class="pln"></span><span class="lit">@@</span><span class="pln"> </span><span class="pun">-</span><span class="lit">59</span><span class="pun">,</span><span class="lit">7</span><span class="pln"> </span><span class="pun">+</span><span class="lit">62</span><span class="pun">,</span><span class="lit">7</span><span class="pln"> </span><span class="lit">@@</span><span class="pln">&nbsp;&nbsp;</span><span class="kwd">void</span><span class="pln"> module_free</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> </span><span class="kwd">module</span><span class="pln"> </span><span class="pun">*</span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">*</span><span class="pln">region</span><span class="pun">)</span><span class="pln">&nbsp;</span><span class="pun">{</span><span class="pln"></span><span class="pun">-</span><span class="pln"> &nbsp; &nbsp; &nbsp; vfree</span><span class="pun">(</span><span class="pln">region</span><span class="pun">);</span><span class="pln"></span><span class="pun">+</span><span class="pln"> &nbsp; &nbsp; &nbsp; kfree</span><span class="pun">(</span><span class="pln">region</span><span class="pun">);</span><span class="pln">&nbsp;</span><span class="pun">}</span><span class="pln">&nbsp;&nbsp;</span><span class="kwd">int</span><span class="pln"> module_frob_arch_sections</span><span class="pun">(</span><span class="typ">Elf_Ehdr</span><span class="pln"> </span><span class="pun">*</span><span class="pln">hdr</span><span class="pun">,</span></pre>
<p>由 于此workaround使用了kmalloc，如果内核模块很大，kmalloc申请的内存不够存放，则可以修改： include/linux/slab.h中的KMALLOC_SHIFT_HIGH宏定义。另外，此workaround成立的条件是mem=32M或 小于32M。 现在我们可以自由地加载模块了，看看结果： </p>
<pre class="prettyprint"><span class="pun">加载模块：</span><span class="pln"></span><span class="com"># modprobe hello</span><span class="pln"></span><span class="typ">Hello</span><span class="pln"> </span><span class="typ">World</span><span class="pln"> enter</span><span class="com"># modprobe globalmem &nbsp;globalmem_major=250</span><span class="pln"></span><span class="com"># modprobe globalfifo globalfifo_major=251</span><span class="pln">

</span><span class="pun">查看加载的模块:</span><span class="pln"></span><span class="com"># lsmod</span><span class="pln">&nbsp; &nbsp; </span><span class="typ">Not</span><span class="pln"> taintedglobalmem </span><span class="lit">3356</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="typ">Live</span><span class="pln"> </span><span class="lit">0xc0f66000</span><span class="pln">hello </span><span class="lit">1188</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="typ">Live</span><span class="pln"> </span><span class="lit">0xc1128000</span><span class="pln">globalfifo </span><span class="lit">4292</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="typ">Live</span><span class="pln"> </span><span class="lit">0xc182a000</span><span class="pln">

</span><span class="pun">查看设备：</span><span class="pln"></span><span class="com"># cat /proc/devices </span><span class="pln"></span><span class="typ">Character</span><span class="pln"> devices</span><span class="pun">:</span><span class="pln">&nbsp; </span><span class="lit">1</span><span class="pln"> mem&nbsp; </span><span class="lit">2</span><span class="pln"> pty&nbsp; </span><span class="lit">3</span><span class="pln"> ttyp&nbsp; </span><span class="lit">4</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">vc</span><span class="pun">/</span><span class="lit">0</span><span class="pln">&nbsp; </span><span class="lit">4</span><span class="pln"> tty&nbsp; </span><span class="lit">4</span><span class="pln"> ttyS&nbsp; </span><span class="lit">5</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">tty&nbsp; </span><span class="lit">5</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">console&nbsp; </span><span class="lit">5</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ptmx&nbsp; </span><span class="lit">7</span><span class="pln"> vcs&nbsp;</span><span class="lit">10</span><span class="pln"> misc&nbsp;</span><span class="lit">13</span><span class="pln"> input&nbsp;</span><span class="lit">21</span><span class="pln"> sg&nbsp;</span><span class="lit">29</span><span class="pln"> fb</span><span class="lit">128</span><span class="pln"> ptm</span><span class="lit">136</span><span class="pln"> pts</span><span class="lit">204</span><span class="pln"> s3c2410_serial</span><span class="lit">250</span><span class="pln"> globalmem</span><span class="lit">251</span><span class="pln"> globalfifo

</span><span class="pun">建立结点：</span><span class="pln"></span><span class="com"># mknod /dev/globalmem c 250 0</span><span class="pln"></span><span class="com"># mknod /dev/globalfifo c 251 0</span><span class="pln"></span><span class="com"># </span><span class="pln"></span><span class="pun">读写设备文件：</span><span class="pln"></span><span class="com"># echo &quot;hello, cisco&quot; &gt; /dev/globalmem</span><span class="pln">written </span><span class="lit">13</span><span class="pln"> bytes</span><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> </span><span class="lit">0</span><span class="pln"></span><span class="com"># cat /dev/globalmem </span><span class="pln">read </span><span class="lit">4096</span><span class="pln"> bytes</span><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> </span><span class="lit">0</span><span class="pln">hello</span><span class="pun">,</span><span class="pln"> cisco

</span><span class="com"># cat /dev/globalfifo &amp;</span><span class="pln"></span><span class="com"># echo &quot;hello,linux, I love you&quot; &gt; /dev/globalfifo </span><span class="pln">written </span><span class="lit">24</span><span class="pln"> bytes</span><span class="pun">(</span><span class="pln">s</span><span class="pun">),</span><span class="pln">current_len</span><span class="pun">:</span><span class="lit">24</span><span class="pln"></span><span class="com"># read 24 bytes(s),current_len:0</span><span class="pln">hello</span><span class="pun">,</span><span class="pln">linux</span><span class="pun">,</span><span class="pln"> I love you</span></pre>
<p>本文用到的所有代码可通过svn获取：</p>
<p><tt id="checkoutcmd">svn checkout <strong><em>http</em></strong>://ldd6410.googlecode.com/svn/trunk/ ldd6410-read-only</tt>    </p>
<p>本文实验已经做好的包位于： <a rel="nofollow" href="http://ldd6410.googlecode.com/files/ldd6410-skyeye-pack-with-module.tar.gz">http://ldd6410.googlecode.com/files/ldd6410-skyeye-pack-with-module.tar.gz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/21cnbao/archive/2010/01/16/1581855.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.356 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-02-10 09:29:04 -->
<!-- Compression = gzip -->