fsdfdsf(fsdfdsfsd[通俗易懂])

发布时间:2025-12-10 19:11:44 浏览次数:7

fsdfdsfsd[通俗易懂]-

fsdfdsfsd[通俗易懂]第九章linux设备驱动模型body{font-family:”MicrosoftYaHeiUI”,”MicrosoftYaHei”,SimSun,”SegoeUI”,Tahoma,Helvetica,Sans-Serif,”MicrosoftYaHei”,Georgia,Helvetica,Arial,sans-serif,宋体,PMingLiU,s

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML xmlns:o = "urn:schemas-microsoft-com:office:office"><HEAD><TITLE>第九章 linux设备驱动模型</TITLE><META content="text/html; charset=unicode" http-equiv=Content-Type><!--defaultCSS--><STYLE id=wiz_custom_css type=text/css>body{font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif;font-size: 10.5pt;line-height: 1.5;}html, body{}h1 {font-size:1.5em;font-weight:bold;}h2 {font-size:1.4em;font-weight:bold;}h3 {font-size:1.3em;font-weight:bold;}h4 {font-size:1.2em;font-weight:bold;}h5 {font-size:1.1em;font-weight:bold;}h6 {font-size:1.0em;font-weight:bold;}img {border:0;max-width: 100%;}blockquote {margin-top:0px;margin-bottom:0px;}</STYLE><META name=GENERATOR content="MSHTML 8.00.6001.18702"><LINK id=syntaxhighlighter_css rel=stylesheet type=text/css href="778fb6ef-6943-4b7d-8ab4-4718884160ee_128_files/shCoreDefault.css"></HEAD><BODY style="HEIGHT: 522px; webkitUserSelect: "><FONT style="BACKGROUND-COLOR: #cce8cf"><DIV><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">2.6<FONT face=宋体>内核中引入设备模型,</FONT></SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">设备模型是一个</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">非常</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">复杂的</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">“网络体系”</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">,通过其间的大量链接而构成一个多层次的体系结构,</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">Linux<FONT face=宋体>设备模型的目的是</FONT></SPAN><SPAN style="FONT-FAMILY: 'Arial'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">为内核建立起一个对系统结构的一般性抽象描述</SPAN><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">,</SPAN><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">有了设备模型,各种复杂的设备以及他们之间的</SPAN><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">层次关系就会变的很明晰。也就是说,设备模型是一种“机制”,把复杂、凌乱的东西分类分层,使之简单容易操作。</SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">9.1 sysfs文件系统</SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">驱动模型底层连接驱动,上层向用户空间提供接口,从用户角度看,设备是一个个文件,对设备的操作就是对文件操作,这个文件就是由sysfs文件系统提供,他是一种机制,底层提供一些“框架”,规定驱动程序怎么编写,上层提供文件接口,供用户空间对设备操作,而中间有很多细节的“链接”,保证众多驱动和文件接口的正确映射。</SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">以前研究过<FONT face="Times New Roman">proc</FONT><FONT face=宋体>虚拟文件系统,它是一种基于</FONT><FONT face="Times New Roman">ram</FONT><FONT face=宋体>(</FONT><FONT face="Times New Roman">ram-base</FONT><FONT face=宋体>)的文件系统,</FONT><FONT face="Times New Roman">proc</FONT><FONT face=宋体>中存放的是系统运行的动态信息,目的在于提供给用户一个接口,让用户能够查看系统的一些状态信息,还可以修改一些状态参数,比如</FONT><FONT face="Times New Roman">printk</FONT><FONT face=宋体>。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">sysfs<FONT face=宋体>也是一种基于</FONT><FONT face="Times New Roman">ram</FONT><FONT face=宋体>的文件系统,它实际取代了proc文,功能远强大与proc文件系统。sysfs一般在制作根文件系统时会挂载到/sys。</FONT></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">如果编译内核时指定了CONFIG_SYSFS选项,在linux系统启动时会初始化一个sysfs文件系统并且注册,这样sysfs文件系统就会包含到内核中,相关函数为:int __init sysfs_init(void).</SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">9.2 kobject和kset</SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">sysfs文件系统是一种机制,向底层提供“框架”,我们看到的就是bus、driver和device,对于不通的设备只有按照这种“框架”去写驱动,sysfs才可以认可,用户空间才可以访问该设备,但是内核有众多设备,相对应的需要提供各个文件供用户操作,sysfs需要用许多“线”才能将设备和对应的文件联系起来。还有,设备有很多种,如果要分类管理的话也许多“线”穿起来才可以。kobject和kset就充当这种“线”的角色。</SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">9.2.1 kobject</SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">在linux kernel中,一个kobject就是一个内核对象,像内核添加一个kobject对象反映到用户空间就是多了创建了一个目录。</SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">kobject源码为:</SPAN></SPAN><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><CODE></P><DIV style="BORDER-BOTTOM: black 1px solid; TEXT-ALIGN: left; BORDER-LEFT: black 1px solid; PADDING-BOTTOM: 3px; BACKGROUND-COLOR: window; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; FONT-FAMILY: Courier New; COLOR: black; MARGIN-LEFT: auto; FONT-SIZE: 12px; BORDER-TOP: black 1px solid; MARGIN-RIGHT: auto; BORDER-RIGHT: black 1px solid; PADDING-TOP: 3px"><DIV><FONT color=#0000ff><B>struct</B></FONT> kobject {<BR><FONT color=#0000ff><B>const</B></FONT> <FONT color=#0000ff><B>char</B></FONT> <FONT color=#333399>*</FONT>name; <FONT color=#333399>//</FONT> kobject对象名,如果添加到内核,name会出现在sysfs文件系统中<BR><FONT color=#0000ff><B>struct</B></FONT> kref kref; <FONT color=#008000>// 应用计数</FONT><BR><FONT color=#0000ff><B>struct</B></FONT> list_head entry;<FONT color=#008000>// 将一系列的内核对象构成链表</FONT><BR><FONT color=#0000ff><B>struct</B></FONT> kobject <FONT color=#333399>*</FONT>parent; <FONT color=#008000>// 父节点, 指向内核对象上层接点</FONT><BR><FONT color=#0000ff><B>struct</B></FONT> kset <FONT color=#333399>*</FONT>kset; <FONT color=#008000>// 当前内核对象所属的 kset 对象的指针</FONT><BR><FONT color=#0000ff><B>struct</B></FONT> kobj_type <FONT color=#333399>*</FONT>ktype; <FONT color=#008000>// 该内核对象的一组 sysfs 文件系统相关的属性和操作函数</FONT><BR><FONT color=#0000ff><B>struct</B></FONT> sysfs_dirent <FONT color=#333399>*</FONT>sd;<FONT color=#008000>// 用来表示该内核对象在 sysfs 文件系统中对应的目录项的实例</FONT><BR><FONT color=#0000ff><B>unsigned</B></FONT> <FONT color=#0000ff><B>int</B></FONT> state_initialized<FONT color=#333399>:</FONT><FONT color=#6e00aa>1</FONT>; <FONT color=#008000>//kobject 是否已初始化(是为 1 ,否则为 0 )</FONT><BR><FONT color=#0000ff><B>unsigned</B></FONT> <FONT color=#0000ff><B>int</B></FONT> state_in_sysfs<FONT color=#333399>:</FONT><FONT color=#6e00aa>1</FONT>;<FONT color=#008000>//kobject 是否已加入 sys 文件系统(是为 1 ,否则为 0 )</FONT><BR><FONT color=#0000ff><B>unsigned</B></FONT> <FONT color=#0000ff><B>int</B></FONT> state_add_uevent_sent<FONT color=#333399>:</FONT><FONT color=#6e00aa>1</FONT>;<BR><FONT color=#0000ff><B>unsigned</B></FONT> <FONT color=#0000ff><B>int</B></FONT> state_remove_uevent_sent<FONT color=#333399>:</FONT><FONT color=#6e00aa>1</FONT>;<BR>};</DIV></DIV></CODE></SPAN><!--EndFragment--></SPAN></SPAN><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">kobject数据结构最通用的用法是嵌入在表示某一对象的数据结构中,比如<SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">cdev<FONT face=宋体>结构里就嵌入了一个</FONT><FONT face="Times New Roman">kobject</FONT><FONT face=宋体>结构体,可以把他连接到内核的整个设备驱动体系结构中。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></SPAN></P><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><CODE><DIV style="BORDER-BOTTOM: black 1px solid; TEXT-ALIGN: left; BORDER-LEFT: black 1px solid; PADDING-BOTTOM: 3px; BACKGROUND-COLOR: window; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; FONT-FAMILY: Courier New; COLOR: black; MARGIN-LEFT: auto; FONT-SIZE: 12px; BORDER-TOP: black 1px solid; MARGIN-RIGHT: auto; BORDER-RIGHT: black 1px solid; PADDING-TOP: 3px"><DIV><FONT color=#0000ff><B>struct</B></FONT> cdev {<BR><FONT color=#0000ff><B>struct</B></FONT> kobject kobj;<BR><FONT color=#0000ff><B>struct</B></FONT> module <FONT color=#333399>*</FONT>owner;<BR><FONT color=#0000ff><B>const</B></FONT> <FONT color=#0000ff><B>struct</B></FONT> file_operations <FONT color=#333399>*</FONT>ops;<BR><FONT color=#0000ff><B>struct</B></FONT> list_head list;<BR>dev_t dev;<BR><FONT color=#0000ff><B>unsigned</B></FONT> <FONT color=#0000ff><B>int</B></FONT> count;<BR>};<BR><FONT color=#0000ff><B>struct</B></FONT> cdev <FONT color=#333399>*</FONT>device <FONT color=#333399>=</FONT> container_of(kg, <FONT color=#0000ff><B>struct</B></FONT> cdev, kobj)<BR><FONT color=#008000>// 得到的是指向包含 kobject 的结构体指针,这里边就是 cdev</DIV></DIV><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'">kobject<FONT face=宋体>的几个操作函数:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></SPAN></P><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><CODE><DIV style="BORDER-BOTTOM: black 1px solid; TEXT-ALIGN: left; BORDER-LEFT: black 1px solid; PADDING-BOTTOM: 3px; BACKGROUND-COLOR: window; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; FONT-FAMILY: Courier New; COLOR: black; MARGIN-LEFT: auto; FONT-SIZE: 12px; BORDER-TOP: black 1px solid; MARGIN-RIGHT: auto; BORDER-RIGHT: black 1px solid; PADDING-TOP: 3px"><DIV><FONT color=#0000ff><B>void</B></FONT> <FONT color=#333399>*</FONT>memset(<FONT color=#0000ff><B>void</B></FONT> <FONT color=#333399>*</FONT>s, <FONT color=#0000ff><B>int</B></FONT> c, size_t count)<BR><FONT color=#008000>// 将整个 kobject 设置为 0</FONT><BR><FONT color=#0000ff><B>int</B></FONT> kobject_init_and_add(<FONT color=#0000ff><B>struct</B></FONT> kobject <FONT color=#333399>*</FONT>kobj, <FONT color=#0000ff><B>struct</B></FONT> kobj_type <FONT color=#333399>*</FONT>ktype,<BR><FONT color=#0000ff><B>struct</B></FONT> kobject <FONT color=#333399>*</FONT>parent, <FONT color=#0000ff><B>const</B></FONT> <FONT color=#0000ff><B>char</B></FONT> <FONT color=#333399>*</FONT>fmt, ...)<BR><FONT color=#008000>//kobject 的初始化,并将其注册到 linux 系统,这里初始化之后应用计数为 1</FONT><BR><FONT color=#0000ff><B>int</B></FONT> kobject_set_name(<FONT color=#0000ff><B>struct</B></FONT> kobject <FONT color=#333399>*</FONT>kobj, <FONT color=#0000ff><B>const</B></FONT> <FONT color=#0000ff><B>char</B></FONT> <FONT color=#333399>*</FONT>name, ...)<BR><FONT color=#008000>// 设置名字</FONT><BR><FONT color=#0000ff><B>void</B></FONT> kobject_del(<FONT color=#0000ff><B>struct</B></FONT> kobject <FONT color=#333399>*</FONT> kobj)<BR><FONT color=#008000>// 从 Linux 系统中删除 kobject 对象</FONT><BR><FONT color=#0000ff><B>struct</B></FONT> kobject <FONT color=#333399>*</FONT>kobject_get(<FONT color=#0000ff><B>struct</B></FONT> kobject <FONT color=#333399>*</FONT>kobj)<BR><FONT color=#008000>// 应用计数加 1</FONT><BR><FONT color=#0000ff><B>void</B></FONT> kobject_put(<FONT color=#0000ff><B>struct</B></FONT> kobject <FONT color=#333399>*</FONT>kobj)<BR><SPAN style="COLOR: #008000">// 应用计数减 1</SPAN></DIV></DIV></CODE></SPAN><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0></CODE></FONT></SPAN></SPAN></SPAN></P><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><P></P><DIV id=highlighter_98034  highlighter="brush: cpp;toolbar:false;"><TABLE border=0 cellSpacing=0 cellPadding=0><TBODY><TR><TD class=gutter><DIV style="HEIGHT: 16px" >1</DIV><DIV style="HEIGHT: 16px" >2</DIV><DIV style="HEIGHT: 16px" >3</DIV><DIV style="HEIGHT: 16px" >4</DIV><DIV style="HEIGHT: 16px" >5</DIV><DIV style="HEIGHT: 16px" >6</DIV><DIV style="HEIGHT: 16px" >7</DIV><DIV style="HEIGHT: 16px" >8</DIV><DIV style="HEIGHT: 16px" >9</DIV><DIV style="HEIGHT: 16px" >10</DIV><DIV style="HEIGHT: 16px" >11</DIV><DIV style="HEIGHT: 16px" >12</DIV><DIV style="HEIGHT: 16px" >13</DIV><DIV style="HEIGHT: 16px" >14</DIV><DIV style="HEIGHT: 16px" >15</DIV><DIV style="HEIGHT: 16px" >16</DIV><DIV style="HEIGHT: 16px" >17</DIV><DIV style="HEIGHT: 16px" >18</DIV><DIV style="HEIGHT: 16px" >19</DIV><DIV style="HEIGHT: 16px" >20</DIV><DIV style="HEIGHT: 16px" >21</DIV><DIV style="HEIGHT: 16px" >22</DIV><DIV style="HEIGHT: 16px" >23</DIV><DIV style="HEIGHT: 16px" >24</DIV><DIV style="HEIGHT: 16px" >25</DIV><DIV style="HEIGHT: 16px" >26</DIV><DIV style="HEIGHT: 16px" >27</DIV></TD><TD class=code><DIV class=container><DIV style="HEIGHT: 16px" ><CODE >void</CODE> <CODE >kobject_init(</CODE><CODE >struct</CODE> <CODE >kobject *kobj, </CODE><CODE >struct</CODE> <CODE >kobj_type *ktype) </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE >{ </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >char</CODE> <CODE >*err_str; </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >if</CODE> <CODE >(!kobj) { </CODE><CODE >//检查kobject变量是否为空 </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >err_str = </CODE><CODE >"invalid kobject pointer!"</CODE><CODE >; </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >goto</CODE> <CODE >error; </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >} </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >if</CODE> <CODE >(!ktype) { </CODE><CODE >//检查kobj_type变量是否为空 </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >err_str = </CODE><CODE >"must have a ktype to be initialized properly!\n"</CODE><CODE >; </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >goto</CODE> <CODE >error; </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >} </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >if</CODE> <CODE >(kobj->state_initialized) { </CODE><CODE >//是不是已经初始化过了 </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >/* do not error out as sometimes we can recover */</CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >printk(KERN_ERR </CODE><CODE >"kobject (%p): tried to init an initialized "</CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >"object, something is seriously wrong.\n"</CODE><CODE >, kobj); </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >dump_stack(); </CODE><CODE >//调试用的 </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >} </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >kobject_init_internal(kobj); </CODE><CODE >//进一步初始化 </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >kobj->ktype = ktype; </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >return</CODE><CODE >; </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE></DIV><DIV style="HEIGHT: 16px" ><CODE >error: </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >printk(KERN_ERR </CODE><CODE >"kobject (%p): %s\n"</CODE><CODE >, kobj, err_str); </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE ></CODE><CODE >dump_stack(); </CODE></DIV><DIV style="HEIGHT: 16px" ><CODE >}</CODE></DIV></DIV></TD></TR></TBODY></TABLE></DIV><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0></P><P></P><P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" class=p0></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; FONT-FAMILY: simsun; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px">.<SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN><SPAN style="LINE-HEIGHT: 0px; DISPLAY: none" id=_baidu_bookmark_start_></SPAN></SPAN></SPAN></SPAN></SPAN> <P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></SPAN></P><P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN></P></SPAN><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"></SPAN><P></P><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><SPAN style="FONT-FAMILY: '宋体'; COLOR: rgb(0,0,0); FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"><!--EndFragment--></SPAN></SPAN></FONT></DIV></BODY></HTML>

是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活CLion DataGrip DataSpell dotCover dotMemory dotTrace GoLand PhpStorm PyCharm ReSharper ReShaC++ Rider RubyMine WebStorm 全家桶 刷新

【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…


需要做网站?需要网络推广?欢迎咨询客户经理 13272073477