<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=\"{"mod":"popu_626","con":"字符设备"}\" class=\"tag- \" href=\"http://so.csdn.net/so/search/s.do?q=字符设备&t=blog\" target=\"_blank\">字符设备 </a><a data-track-click=\"{"mod":"popu_626","con":"cdev"}\" class=\"tag- \" href=\"http://so.csdn.net/so/search/s.do?q=cdev&t=blog\" target=\"_blank\">cdev </a><a data-track-click=\"{"mod":"popu_626","con":"__register_chrdev_re"}\" class=\"tag- \" href=\"http://so.csdn.net/so/search/s.do?q=__register_chrdev_re&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;\"> </span><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\">在 2.4 的内核我们使用 register_chrdev(0, \"hello\", &hello_fops) 来进行字符设备设备节点的分配,这种方式每一个主设备号只能存放一种设备,它们使用相同的 file_operation 结构体,也就是说内核最多支持 256
个字符设备驱动程序。</span></span></p>
<p><span style=\"font-size:14px;\"><span style=\"font-family:\'Courier New\';\"> 在 2.6 的内核之后,新增了一个 register_chrdev_region 函数,它支持将同一个主设备号下的次设备号进行分段,每一段供给一个字符设备驱动程序使用,使得资源利用率大大提升,同时,2.6 的内核保留了原有的 register_chrdev 方法。在 2.6 的内核中这两种方法都会调用到 __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\';\"> </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\';\"> </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->owner = fops->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->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(&cdev->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->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->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->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\';\"> 它调用了 __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 < 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 > 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;\"> 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(&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 > <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->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-> 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->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->name, name, <span class=\"hljs-keyword\">sizeof</span>(cd->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->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)->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)->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 == &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 = &chrdevs[i]; *cp; cp = &(*cp)->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)->major > 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)->major == major && </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)-> minor >= minor) || ((*cp)-> minor + (*cp)->minorct > 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 && (*cp)->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)-> 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)-> minor + (*cp)->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 >= old_min && new_max <= 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 <= old_max && new_min >= 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->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(&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\';\"> 直接分析代码有些吃力,拿个例子来分析。</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(&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->major, cd-> 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>第一次 </strong><br>
alloc_chrdev_region(&devid, 0, 2, \"hello\"); <br>
major = MAJOR(devid); <br>
__register_chrdev_region(unsigned int major = 0, unsigned int minor = 0,int minorct = 2, const char *name)<br>
chrdevs[i] == null<br>
cp = &chrdevs[i] -> *cp == chrdevs[i] == null<br>
cd->next = *cp == null (*cp 内容是空的,它的内容是别人的地址)<br>
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>
register_chrdev_region(devid, 1, \"hello2\");<br>
__register_chrdev_region(unsigned int major = 0, unsigned int minor = 2,int minorct = 1, const char *name)<br>
if 语句条件不成立,因此,cp = &(*cp)->next ,*cp == (*cp)->next == chrdevs[i]->next == null 跳出 for 循环<br>
cp = &chrdevs[i] -> (*cp) == chrdevs[i] -> (*cp)->next == chrdevs[i]->next == null<br>
cd->next = *cp; cd->next 指向了上一次分配的实例<br>
cp = cd -> 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\';\"> 相当于从链表头部插入了一个节点,此时,再来看这个图应该更清晰了。</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\"><linux/module.h></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\"><linux/kernel.h></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\"><linux/fs.h></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\"><linux/init.h></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\"><linux/delay.h></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\"><linux/irq.h></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\"><asm/uaccess.h></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\"><asm/irq.h></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\"><asm/io.h></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\"><asm/arch/regs-gpio.h></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\"><asm/hardware.h></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\"><linux/poll.h></span></span></div></div></li><li><div class=\"hljs-ln-numbers\"><div class=\"h