fsdfdsfsd

<!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 class="syntaxhighlighter  cpp ie" 
highlighter="brush: cpp;toolbar:false;">
<TABLE border=0 cellSpacing=0 cellPadding=0>
  <TBODY>
  <TR>
    <TD class=gutter>
      <DIV style="HEIGHT: 16px" class="line number1 index0 alt2">1</DIV>
      <DIV style="HEIGHT: 16px" class="line number2 index1 alt1">2</DIV>
      <DIV style="HEIGHT: 16px" class="line number3 index2 alt2">3</DIV>
      <DIV style="HEIGHT: 16px" class="line number4 index3 alt1">4</DIV>
      <DIV style="HEIGHT: 16px" class="line number5 index4 alt2">5</DIV>
      <DIV style="HEIGHT: 16px" class="line number6 index5 alt1">6</DIV>
      <DIV style="HEIGHT: 16px" class="line number7 index6 alt2">7</DIV>
      <DIV style="HEIGHT: 16px" class="line number8 index7 alt1">8</DIV>
      <DIV style="HEIGHT: 16px" class="line number9 index8 alt2">9</DIV>
      <DIV style="HEIGHT: 16px" class="line number10 index9 alt1">10</DIV>
      <DIV style="HEIGHT: 16px" class="line number11 index10 alt2">11</DIV>
      <DIV style="HEIGHT: 16px" class="line number12 index11 alt1">12</DIV>
      <DIV style="HEIGHT: 16px" class="line number13 index12 alt2">13</DIV>
      <DIV style="HEIGHT: 16px" class="line number14 index13 alt1">14</DIV>
      <DIV style="HEIGHT: 16px" class="line number15 index14 alt2">15</DIV>
      <DIV style="HEIGHT: 16px" class="line number16 index15 alt1">16</DIV>
      <DIV style="HEIGHT: 16px" class="line number17 index16 alt2">17</DIV>
      <DIV style="HEIGHT: 16px" class="line number18 index17 alt1">18</DIV>
      <DIV style="HEIGHT: 16px" class="line number19 index18 alt2">19</DIV>
      <DIV style="HEIGHT: 16px" class="line number20 index19 alt1">20</DIV>
      <DIV style="HEIGHT: 16px" class="line number21 index20 alt2">21</DIV>
      <DIV style="HEIGHT: 16px" class="line number22 index21 alt1">22</DIV>
      <DIV style="HEIGHT: 16px" class="line number23 index22 alt2">23</DIV>
      <DIV style="HEIGHT: 16px" class="line number24 index23 alt1">24</DIV>
      <DIV style="HEIGHT: 16px" class="line number25 index24 alt2">25</DIV>
      <DIV style="HEIGHT: 16px" class="line number26 index25 alt1">26</DIV>
      <DIV style="HEIGHT: 16px" class="line number27 index26 alt2">27</DIV></TD>
    <TD class=code>
      <DIV class=container>
      <DIV style="HEIGHT: 16px" class="line number1 index0 alt2"><CODE 
      class="cpp keyword bold">void</CODE> <CODE 
      class="cpp plain">kobject_init(</CODE><CODE 
      class="cpp keyword bold">struct</CODE> <CODE class="cpp plain">kobject 
      *kobj, </CODE><CODE class="cpp keyword bold">struct</CODE> <CODE 
      class="cpp plain">kobj_type *ktype) </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number2 index1 alt1"><CODE 
      class="cpp plain">{ </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number3 index2 alt2"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp color1 bold">char</CODE> <CODE class="cpp plain">*err_str; 
      </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number4 index3 alt1"><CODE 
      class="cpp spaces"> </CODE> </DIV>
      <DIV style="HEIGHT: 16px" class="line number5 index4 alt2"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp keyword bold">if</CODE> <CODE class="cpp plain">(!kobj) { 
      </CODE><CODE class="cpp comments">//检查kobject变量是否为空 </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number6 index5 alt1"><CODE 
      class="cpp spaces">        </CODE><CODE 
      class="cpp plain">err_str = </CODE><CODE class="cpp string">"invalid 
      kobject pointer!"</CODE><CODE class="cpp plain">; </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number7 index6 alt2"><CODE 
      class="cpp spaces">        </CODE><CODE 
      class="cpp keyword bold">goto</CODE> <CODE class="cpp plain">error; 
      </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number8 index7 alt1"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp plain">} </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number9 index8 alt2"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp keyword bold">if</CODE> <CODE class="cpp plain">(!ktype) { 
      </CODE><CODE class="cpp comments">//检查kobj_type变量是否为空 </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number10 index9 alt1"><CODE 
      class="cpp spaces">        </CODE><CODE 
      class="cpp plain">err_str = </CODE><CODE class="cpp string">"must have a 
      ktype to be initialized properly!\n"</CODE><CODE class="cpp plain">; 
      </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number11 index10 alt2"><CODE 
      class="cpp spaces">        </CODE><CODE 
      class="cpp keyword bold">goto</CODE> <CODE class="cpp plain">error; 
      </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number12 index11 alt1"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp plain">} </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number13 index12 alt2"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp keyword bold">if</CODE> <CODE 
      class="cpp plain">(kobj->state_initialized) { </CODE><CODE 
      class="cpp comments">//是不是已经初始化过了 </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number14 index13 alt1"><CODE 
      class="cpp spaces">        </CODE><CODE 
      class="cpp comments">/* do not error out as sometimes we can recover 
      */</CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number15 index14 alt2"><CODE 
      class="cpp spaces">        </CODE><CODE 
      class="cpp plain">printk(KERN_ERR </CODE><CODE class="cpp string">"kobject 
      (%p): tried to init an initialized "</CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number16 index15 alt1"><CODE 
      class="cpp spaces">               </CODE><CODE 
      class="cpp string">"object, something is seriously wrong.\n"</CODE><CODE 
      class="cpp plain">, kobj); </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number17 index16 alt2"><CODE 
      class="cpp spaces">        </CODE><CODE 
      class="cpp plain">dump_stack(); </CODE><CODE class="cpp comments">//调试用的 
      </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number18 index17 alt1"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp plain">} </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number19 index18 alt2"><CODE 
      class="cpp spaces"> </CODE> </DIV>
      <DIV style="HEIGHT: 16px" class="line number20 index19 alt1"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp plain">kobject_init_internal(kobj); </CODE><CODE 
      class="cpp comments">//进一步初始化 </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number21 index20 alt2"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp plain">kobj->ktype = ktype; </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number22 index21 alt1"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp keyword bold">return</CODE><CODE class="cpp plain">; 
      </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number23 index22 alt2"><CODE 
      class="cpp spaces"> </CODE> </DIV>
      <DIV style="HEIGHT: 16px" class="line number24 index23 alt1"><CODE 
      class="cpp plain">error: </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number25 index24 alt2"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp plain">printk(KERN_ERR </CODE><CODE class="cpp string">"kobject 
      (%p): %s\n"</CODE><CODE class="cpp plain">, kobj, err_str); </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number26 index25 alt1"><CODE 
      class="cpp spaces">    </CODE><CODE 
      class="cpp plain">dump_stack(); </CODE></DIV>
      <DIV style="HEIGHT: 16px" class="line number27 index26 alt2"><CODE 
      class="cpp plain">}</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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值