<div class=\"blog-content-box\" style=\"background-color: rgb(204, 232, 207);\">
	<div class=\"article-header-box\" style=\"background-color: rgb(204, 232, 207);\">
		<div class=\"article-header\">
			<div class=\"article- -box\">
				<span class=\"article-type type-1 float-left\">原</span>				<h1 class=\" -article\">浅析字符设备驱动程序__register_chrdev_region</h1>
			</div>
			<div class=\"article-info-box\">
				<div class=\"article-bar-top\" style=\"height: 26px;\">
																				<span class=\"time\">2016年09月29日 01:15:30</span>
					<a class=\"follow-nickName\" href=\"https://me.csdn.net/lizuobin2\" target=\"_blank\">Linux学习之路</a>
						<span class=\"read-count\">阅读数:7050</span>
						
														<span class=\"tags-box artic-tag-box\">
								<span class=\"label\">标签:</span>
																<a data-track-click=\"{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;字符设备&quot;}\" class=\"tag- \" href=\"http://so.csdn.net/so/search/s.do?q=字符设备&amp;t=blog\" target=\"_blank\">字符设备																</a><a data-track-click=\"{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;cdev&quot;}\" class=\"tag- \" href=\"http://so.csdn.net/so/search/s.do?q=cdev&amp;t=blog\" target=\"_blank\">cdev																</a><a data-track-click=\"{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;__register_chrdev_re&quot;}\" class=\"tag- \" href=\"http://so.csdn.net/so/search/s.do?q=__register_chrdev_re&amp;t=blog\" target=\"_blank\">__register_chrdev_re																</a>
							<span class=\"article_info_click\" style=\"background-color: rgb(204, 232, 207);\">更多</span></span>
																					<div class=\"tags-box space\">
								<span class=\"label\">个人分类:</span>
																<a class=\"tag- \" href=\"https://blog.csdn.net/lizuobin2/article/category/6246869\" target=\"_blank\">Linux Driver																</a>
							</div>
																								</div>
				<div class=\"operating\">
														</div>
			</div>
		</div>
	</div>
	<article class=\"baidu_pl\">
		<div id=\"article_content\" class=\"article_content clearfix csdn-tracking-statistics\" data-pid=\"blog\" data-mod=\"popu_307\" data-dsm=\"post\">
								<div class=\"article-copyright\">
                  					
					版权声明:欢迎转载,转载请注明出处 http://blog.csdn.net/lizuobin2/					https://blog.csdn.net/lizuobin2/article/details/52695533				</div>
								            <  rel=\"stylesheet\" href=\"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-d7e2a68c7c.css\">
						<div class=\"htmledit_views\" id=\"content_views\">
                
<p><span style=\"font-family:SimSun;font-size:18px;\">&nbsp; </span><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">在 2.4 的内核我们使用&nbsp;register_chrdev(0, \"hello\", &amp;hello_fops) 来进行字符设备设备节点的分配,这种方式每一个主设备号只能存放一种设备,它们使用相同的 file_operation 结构体,也就是说内核最多支持 256
 个字符设备驱动程序。</span></span></p>
<p><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">&nbsp; &nbsp;在 2.6 的内核之后,新增了一个&nbsp;register_chrdev_region 函数,它支持将同一个主设备号下的次设备号进行分段,每一段供给一个字符设备驱动程序使用,使得资源利用率大大提升,同时,2.6 的内核保留了原有的&nbsp;register_chrdev 方法。在 2.6 的内核中这两种方法都会调用到&nbsp;__register_chrdev_region 函数,本文将从它入手来分析内核是如何管理字符设备驱动程序的。</span></span></p>
<pre  =\"hljs.copyCode(event)\"><code class=\"language-cpp hljs\"><ol class=\"hljs-ln\"><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">char_device_struct</span> {</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">char_device_struct</span> *<span class=\"hljs- \">next</span>;</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">unsigned</span> <span class=\"hljs-keyword\">int</span> major;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">unsigned</span> <span class=\"hljs-keyword\">int</span>  minor;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">int</span> minorct;</div></div></li><li style=\"background-color: rgb(204, 232, 207);\"><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">char</span> name[<span class=\"hljs-number\">64</span>];</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">cdev</span> *<span class=\"hljs- \">cdev</span>;</span>		<span class=\"hljs-comment\">/* will die */</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];</div></div></li></ol></code><div class=\"hljs-button\" data- =\"复制\" style=\"background-color: rgb(204, 232, 207);\"></div></pre>
<p><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">&nbsp; &nbsp;</span></span><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">内核中的每一个字符设备驱动程序都由一个 char_device_struct 结构体来描述,包含主设备号、起始次设备号、次设备号个数等信息。</span></span></p>
<p><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">&nbsp; &nbsp;</span><span style=\"font-family:\'Courier New\';\">内核使用 chrdevs 这个指针数组来管理所有的字符设备驱动程序,数组范围 0-255 ,看上去好像还是只支持 256 个字符设备驱动程序,其实并不然,每一个 char_device_struct 结构都含有一个 next 指针,它可以指向与其主设备号相同的其它字符设备驱动程序,它们之间主设备号相同,各自的次设备号范围相互不重叠。</span></span></p>
<p style=\"text-align:center;\"><img src=\"https://img-blog.csdn.net/20160929004602761\" alt=\"\"><br></p>
<p style=\"text-align:left;\"><span style=\"font-family:\'Courier New\';color:rgb(255,0,0);\"><strong><span style=\"font-size:18px;\"><br></span></strong></span></p>
<p style=\"text-align:left;\"><span style=\"font-family:\'Courier New\';color:rgb(255,0,0);\"><strong><span style=\"font-size:18px;\">一、register_chrdev</span></strong></span></p>
<pre  =\"hljs.copyCode(event)\"><code class=\"language-cpp hljs\"><ol class=\"hljs-ln\"><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">inline</span> <span class=\"hljs-keyword\">int</span> <span class=\"hljs- \">register_chrdev</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">unsigned</span> <span class=\"hljs-keyword\">int</span> major, <span class=\"hljs-keyword\">const</span> <span class=\"hljs-keyword\">char</span> *name,</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">				  <span class=\"hljs-keyword\">const</span> struct file_operations *fops)</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">{</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">return</span> __register_chrdev(major, <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">256</span>, name, fops);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">}</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">int</span> __register_chrdev(<span class=\"hljs-keyword\">unsigned</span> <span class=\"hljs-keyword\">int</span> major, <span class=\"hljs-keyword\">unsigned</span> <span class=\"hljs-keyword\">int</span>  minor,</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		      <span class=\"hljs-keyword\">unsigned</span> <span class=\"hljs-keyword\">int</span> count, <span class=\"hljs-keyword\">const</span> <span class=\"hljs-keyword\">char</span> *name,</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		      <span class=\"hljs-keyword\">const</span> struct file_operations *fops)</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">{</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">char_device_struct</span> *<span class=\"hljs- \">cd</span>;</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"12\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">cdev</span> *<span class=\"hljs- \">cdev</span>;</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"13\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"14\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cd = __register_chrdev_region(major,  minor, count, name);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"15\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"16\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cdev = cdev_alloc();</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"17\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"18\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cdev-&gt;owner = fops-&gt;owner;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"19\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cdev-&gt;ops = fops;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"20\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	k _set_name(&amp;cdev-&gt;kobj, <span class=\"hljs-string\">\"%s\"</span>, name);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"21\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"22\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	err = cdev_add(cdev, MKDEV(cd-&gt;major,  minor), count);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"23\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"24\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cd-&gt;cdev = cdev;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"25\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"26\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">return</span> major ? <span class=\"hljs-number\">0</span> : cd-&gt;major;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"27\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">}</div></div></li></ol></code><div class=\"hljs-button\" data- =\"复制\" style=\"background-color: rgb(204, 232, 207);\"></div></pre><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">&nbsp; 它调用了&nbsp;__register_chrdev_region 并强制指定了起始次设备号为0,256个,把一个主设备号下的所有次设备号都申请光了。同时它还封装了 cdev_init 和 cdev_add ,倒是很省事。</span></span>
<p></p>
<p style=\"text-align:left;\"><br></p>
<p style=\"text-align:left;\"><span style=\"font-family:\'Courier New\';color:rgb(255,0,0);\"><strong><span style=\"font-size:18px;\">二、register_chrdev_region</span></strong></span></p>
<pre  =\"hljs.copyCode(event)\"><code class=\"language-cpp hljs\"><ol class=\"hljs-ln\"><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">int</span> <span class=\"hljs- \">register_chrdev_region</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">dev_t</span> from, <span class=\"hljs-keyword\">unsigned</span> count, <span class=\"hljs-keyword\">const</span> <span class=\"hljs-keyword\">char</span> *name)</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">{</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">char_device_struct</span> *<span class=\"hljs- \">cd</span>;</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">dev_t</span> to = from + count;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">dev_t</span> n, next;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">for</span> (n = from; n &lt; to; n = next) {</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		next = MKDEV(MAJOR(n)+<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">if</span> (next &gt; to)</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			next = to;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		cd = __register_chrdev_region(MAJOR(n), MINOR(n),</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"12\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			       next - n, name);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"13\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	}</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"14\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"15\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">}</div></div></li></ol></code><div class=\"hljs-button\" data- =\"复制\" style=\"background-color: rgb(204, 232, 207);\"></div></pre><span style=\"font-family:\'Courier New\';font-size:14px;\">&nbsp;&nbsp;register_chrdev_region 则是根据要求的范围进行申请,同时我们需要手动 cdev_init cdev_add 。</span>
<p></p>
<p style=\"text-align:left;\"><span style=\"font-family:\'Courier New\';color:rgb(255,0,0);\"><strong><span style=\"font-size:18px;\">三、__register_chrdev_region</span></strong></span></p>
<pre  =\"hljs.copyCode(event)\"><code class=\"language-cpp hljs\"><ol class=\"hljs-ln\" style=\"width:968px\"><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">char_device_struct</span> *</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-class\">__<span class=\"hljs- \">register_chrdev_region</span>(<span class=\"hljs- \">unsigned</span> <span class=\"hljs- \">int</span> <span class=\"hljs- \">major</span>, <span class=\"hljs- \">unsigned</span> <span class=\"hljs- \">int</span> <span class=\"hljs- \"> minor</span>,</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-class\">			   <span class=\"hljs- \">int</span> <span class=\"hljs- \">minorct</span>, <span class=\"hljs- \">const</span> <span class=\"hljs- \">char</span> *<span class=\"hljs- \">name</span>)</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-class\">{</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-comment\">// **p 是 char_device_struct 类型实例</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-comment\">//  *p 是 char_device_struct 实例的指针</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-comment\">//   p 是 char_device_struct 实例的指针的指针</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">char_device_struct</span> *<span class=\"hljs- \">cd</span>, **<span class=\"hljs- \">cp</span>;</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">int</span> ret = <span class=\"hljs-number\">0</span>;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">int</span> i;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"12\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cd = kzalloc(<span class=\"hljs-keyword\">sizeof</span>(struct char_device_struct), GFP_KERNEL);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"13\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"14\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	mutex_lock(&amp;chrdevs_lock);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"15\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"16\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-comment\"><span class=\"hljs-comment\">/*</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"17\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-comment\">	 * 如果major为0则分配一个没有使用的主设备号</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"18\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-comment\">	 * 注意,从 chrdevs[255] 开始向下查找</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"19\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-comment\">	 */</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"20\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">if</span> (major == <span class=\"hljs-number\">0</span>) {</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"21\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">for</span> (i = ARRAY_SIZE(chrdevs)<span class=\"hljs-number\">-1</span>; i &gt; <span class=\"hljs-number\">0</span>; i--) {</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"22\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			<span class=\"hljs-keyword\">if</span> (chrdevs[i] == <span class=\"hljs-literal\">NULL</span>)</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"23\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">				<span class=\"hljs-keyword\">break</span>;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"24\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		}</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"25\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"26\"></div></div><div class=\"hljs-ln-code\" style=\"background-color: rgb(204, 232, 207);\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">if</span> (i == <span class=\"hljs-number\">0</span>) {</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"27\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			ret = -EBUSY;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"28\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			<span class=\"hljs-keyword\">goto</span> out;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"29\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		}</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"30\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		major = i;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"31\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		ret = major;</div></div></li><li><div class=\"hljs-ln-numbers\" style=\"background-color: rgb(204, 232, 207);\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"32\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	}</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"33\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"34\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cd-&gt;major = major;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"35\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cd-&gt; minor =  minor;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"36\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cd-&gt;minorct = minorct;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"37\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	strlcpy(cd-&gt;name, name, <span class=\"hljs-keyword\">sizeof</span>(cd-&gt;name));</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"38\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"39\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-comment\">// return major % CHRDEV_MAJOR_HASH_SIZE;</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"40\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	i = major_to_index(major);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"41\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"42\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-comment\"><span class=\"hljs-comment\">/*</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"43\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-comment\">	 *  不要分析直接分析 for 循环</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"44\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-comment\">	 *  拿实例来分析不容易晕</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"45\" style=\"background-color: rgb(204, 232, 207);\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-comment\">	 *  </span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"46\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-comment\">	 */</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"47\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	 <span class=\"hljs-comment\">// *(a.next) 是 next 实例</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"48\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	 <span class=\"hljs-comment\">// *(a-&gt;next)</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"49\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	 <span class=\"hljs-comment\">// *((*a)-&gt;next) 是 next 实例</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"50\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	 <span class=\"hljs-comment\">// (*cp)-&gt;next 是 next 实例的指针,这个指针存在于 **cp 中</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"51\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	 <span class=\"hljs-comment\">// cp 是 chrdevs[i] 的指针,chrdevs[i]本身就是个指针</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"52\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	 <span class=\"hljs-comment\">// cp == &amp;chrdevs[i].next</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"53\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">for</span> (cp = &amp;chrdevs[i]; *cp; cp = &amp;(*cp)-&gt;next)</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"54\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">if</span> ((*cp)-&gt;major &gt; major || 	<span class=\"hljs-comment\">// 正常情况下 If 语句不成立</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"55\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	       ((*cp)-&gt;major == major &amp;&amp; </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"56\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		   (((*cp)-&gt; minor &gt;=  minor) || ((*cp)-&gt; minor + (*cp)-&gt;minorct &gt;  minor))) )</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"57\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			<span class=\"hljs-keyword\">break</span>;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"58\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"59\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-comment\">/* 如果有重叠部分,正常情况下应该不重叠  */</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"60\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">if</span> (*cp &amp;&amp; (*cp)-&gt;major == major) {</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"61\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">int</span> old_min = (*cp)-&gt; minor;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"62\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">int</span> old_max = (*cp)-&gt; minor + (*cp)-&gt;minorct - <span class=\"hljs-number\">1</span>;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"63\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">int</span> new_min =  minor;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"64\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">int</span> new_max =  minor + minorct - <span class=\"hljs-number\">1</span>;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"65\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"66\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-comment\">/* New driver overlaps from the left.  */</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"67\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">if</span> (new_max &gt;= old_min &amp;&amp; new_max &lt;= old_max) {</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"68\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			ret = -EBUSY;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"69\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			<span class=\"hljs-keyword\">goto</span> out;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"70\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		}</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"71\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"> </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"72\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-comment\">/* New driver overlaps from the right.  */</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"73\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">if</span> (new_min &lt;= old_max &amp;&amp; new_min &gt;= old_min) {</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"74\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			ret = -EBUSY;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"75\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			<span class=\"hljs-keyword\">goto</span> out;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"76\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		}</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"77\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	}</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"78\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-comment\">// 第一次时 *cp == chrdevs[i] == null</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"79\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cd-&gt;next = *cp;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"80\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	*cp = cd;	<span class=\"hljs-comment\">// 第一次时,*cp == chrdevs[i] 指向 新分配的 char_device_struct 结构</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"81\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	mutex_unlock(&amp;chrdevs_lock);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"82\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">return</span> cd;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"83\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">}</div></div></li></ol></code><div class=\"hljs-button\" data- =\"复制\" style=\"background-color: rgb(204, 232, 207);\"></div></pre><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">&nbsp; 直接分析代码有些吃力,拿个例子来分析。</span></span><pre  =\"hljs.copyCode(event)\"><code class=\"language-cpp hljs\"><ol class=\"hljs-ln\"><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	alloc_chrdev_region(&amp;devid, <span class=\"hljs-number\">0</span>, HELLO_CNT, <span class=\"hljs-string\">\"hello\"</span>);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	major = MAJOR(devid);                     </div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	devid = MKDEV(major, <span class=\"hljs-number\">2</span>);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	register_chrdev_region(devid, <span class=\"hljs-number\">1</span>, <span class=\"hljs-string\">\"hello2\"</span>);</div></div></li></ol></code><div class=\"hljs-button\" data- =\"复制\" style=\"background-color: rgb(204, 232, 207);\"></div></pre><pre  =\"hljs.copyCode(event)\"><code class=\"language-cpp hljs\"><ol class=\"hljs-ln\"><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">int</span> <span class=\"hljs- \">alloc_chrdev_region</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">dev_t</span> *dev, <span class=\"hljs-keyword\">unsigned</span>  minor, <span class=\"hljs-keyword\">unsigned</span> count,</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">			<span class=\"hljs-keyword\">const</span> <span class=\"hljs-keyword\">char</span> *name)</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">{</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct</span> <span class=\"hljs- \">char_device_struct</span> *<span class=\"hljs- \">cd</span>;</span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	cd = __register_chrdev_region(<span class=\"hljs-number\">0</span>,  minor, count, name);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">if</span> (IS_ERR(cd))</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">		<span class=\"hljs-keyword\">return</span> PTR_ERR(cd);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	*dev = MKDEV(cd-&gt;major, cd-&gt; minor);</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">	<span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;</div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\">}</div></div></li></ol></code><div class=\"hljs-button\" data- =\"复制\" style=\"background-color: rgb(204, 232, 207);\"></div></pre><span style=\"font-size:14px;\"><br><span style=\"font-family:\'Courier New\';\"><strong>第一次&nbsp;</strong><br>
&nbsp; alloc_chrdev_region(&amp;devid, 0, 2, \"hello\");&nbsp;<br>
&nbsp; major = MAJOR(devid);&nbsp;<br>
&nbsp; __register_chrdev_region(unsigned int major = 0, unsigned int  minor = 0,int minorct = 2, const char *name)<br>
&nbsp; chrdevs[i] == null<br>
&nbsp; cp = &amp;chrdevs[i] -&gt; *cp == chrdevs[i] == null<br>
&nbsp; cd-&gt;next = *cp == null (*cp 内容是空的,它的内容是别人的地址)<br>
&nbsp; cp == chrdevs[i] = cd (指针和指针赋值,<span style=\"color:rgb(255,0,0);\"><strong>将cd指向的实体的地址赋给 *cp 也就是 chrdevs[i]</strong></span>)</span></span><span style=\"font-family:\'Courier New\';\"><br><br><span style=\"font-size:14px;\"><br><strong>第二次</strong><br>
&nbsp; register_chrdev_region(devid, 1, \"hello2\");<br>
&nbsp; __register_chrdev_region(unsigned int major = 0, unsigned int  minor = 2,int minorct = 1, const char *name)<br>
&nbsp; if 语句条件不成立,因此,cp = &amp;(*cp)-&gt;next ,*cp == (*cp)-&gt;next == chrdevs[i]-&gt;next == null 跳出 for 循环<br>
&nbsp; cp = &amp;chrdevs[i] -&gt; (*cp) == chrdevs[i] -&gt; (*cp)-&gt;next == chrdevs[i]-&gt;next == null<br>
&nbsp; cd-&gt;next = *cp; cd-&gt;next 指向了上一次分配的实例<br>
&nbsp; cp = cd -&gt; chrdevs[i] = cd <span style=\"color:#ff0000;\"><strong>指针和指针之间的赋值,chrdevs[i] 就指向了新分配的实例,新分配的实例.next 指向上一次分配的实例</strong></span><br></span></span>
<p><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">&nbsp; 相当于从链表头部插入了一个节点,此时,再来看这个图应该更清晰了。</span></span></p>
<p><span style=\"font-family:SimSun;font-size:14px;\"><br></span></p>
<p></p>
<p style=\"text-align:left;\"></p>
<div style=\"text-align:center;\"><img src=\"https://img-blog.csdn.net/20160929004602761\" alt=\"\"></div>
<div style=\"text-align:left;\"><span style=\"font-family:\'Courier New\';font-size:18px;\"><br></span></div>
<span style=\"color:rgb(255,0,0);\"><strong><span style=\"font-family:\'Courier New\';font-size:18px;\">四、字符设备驱动程序模板</span></strong></span><br><pre  =\"hljs.copyCode(event)\"><code class=\"language-cpp hljs\"><ol class=\"hljs-ln hundred\"><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;linux/module.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;linux/kernel.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;linux/fs.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;linux/init.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;linux/delay.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;linux/irq.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;asm/uaccess.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;asm/irq.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;asm/io.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;asm/arch/regs-gpio.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;asm/hardware.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"12\"></div></div><div class=\"hljs-ln-code\"><div class=\"hljs-ln-line\"><span class=\"hljs- \">#<span class=\"hljs- -keyword\">include</span> <span class=\"hljs- -string\">&lt;linux/poll.h&gt;</span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"h					
收藏 打印