⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux设备驱动程序学习(12)-linux设备模型(底层原理简介) - linux设备驱动程序 - tekkaman ninja.htm

📁 Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) - Linux设备驱动程序 .rar
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                              <P>(1)将整个kobject清零,通常使用memset函数。</P>
                              <P>(2)调用kobject_init()函数,设置结构内部一些成员。所做的一件事情是设置kobject的引用计数为1。具体的源码如下: 

                              <TABLE style="BORDER-COLLAPSE: collapse" 
                              borderColor=#999999 cellSpacing=0 cellPadding=0 
                              width="95%" bgColor=#f1f1f1 border=1>
                                <TBODY>
                                <TR>
                                <TD>
                                <P 
                                style="MARGIN: 5px; LINE-HEIGHT: 150%"><CODE><SPAN 
                                style="COLOR: #000000"><FONT face=新宋体><SPAN 
                                style="COLOR: #0000ff">void</SPAN> 
                                kobject_init<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kobject 
                                <SPAN style="COLOR: #0000cc">*</SPAN> kobj<SPAN 
                                style="COLOR: #0000cc">)<SPAN 
                                style="COLOR: #ff9900">/*in <FONT 
                                face="Courier New" 
                                color=#ff9900>kobject.c</FONT>*/</SPAN></SPAN><BR><SPAN 
                                style="COLOR: #0000cc">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN 
                                style="COLOR: #0000ff">if</SPAN> <SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000cc">!</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">)</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN 
                                style="COLOR: #0000ff">return</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;kref_init<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000cc">&amp;</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">-</SPAN><SPAN 
                                style="COLOR: #0000cc">&gt;</SPAN>kref<SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><SPAN 
                                style="COLOR: #ff9900">/*设置引用计数为1*/</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;INIT_LIST_HEAD<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000cc">&amp;</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">-</SPAN><SPAN 
                                style="COLOR: #0000cc">&gt;</SPAN>entry<SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><SPAN 
                                style="COLOR: #ff9900">/*初始化kobject 
                                之间的双向链表*/</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;init_waitqueue_head<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000cc">&amp;</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">-</SPAN><SPAN 
                                style="COLOR: #0000cc">&gt;</SPAN>poll<SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><SPAN 
                                style="COLOR: #ff9900">/*初始化等待队列头*/</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;kobj<SPAN 
                                style="COLOR: #0000cc">-</SPAN><SPAN 
                                style="COLOR: #0000cc">&gt;</SPAN>kset <SPAN 
                                style="COLOR: #0000cc">=</SPAN> kset_get<SPAN 
                                style="COLOR: #0000cc">(</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">-</SPAN><SPAN 
                                style="COLOR: #0000cc">&gt;</SPAN>kset<SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><SPAN 
                                style="COLOR: #ff9900">/*增加所属kset的引用计数(若没有所属的kset,则返回NULL)*/</SPAN><BR><SPAN 
                                style="COLOR: #0000cc">}</SPAN><BR><BR><SPAN 
                                style="COLOR: #0000ff">void</SPAN> 
                                kref_init<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kref <SPAN 
                                style="COLOR: #0000cc">*</SPAN>kref<SPAN 
                                style="COLOR: #0000cc">)<SPAN 
                                style="COLOR: #ff9900">/*in <FONT 
                                face="Courier New" 
                                color=#ff9900>kobject.c</FONT>*/</SPAN></SPAN><BR><SPAN 
                                style="COLOR: #0000cc">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;atomic_set<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000cc">&amp;</SPAN>kref<SPAN 
                                style="COLOR: #0000cc">-</SPAN><SPAN 
                                style="COLOR: #0000cc">&gt;</SPAN>refcount<SPAN 
                                style="COLOR: #0000cc">,</SPAN>1<SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;smp_mb<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><BR><SPAN 
                                style="COLOR: #0000cc">}</SPAN><BR><BR><SPAN 
                                style="COLOR: #0000ff">static</SPAN> <SPAN 
                                style="COLOR: #0000ff">inline</SPAN> <SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kset <SPAN 
                                style="COLOR: #0000cc">*</SPAN> to_kset<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kobject 
                                <SPAN style="COLOR: #0000cc">*</SPAN> kobj<SPAN 
                                style="COLOR: #0000cc">)<SPAN 
                                style="COLOR: #ff9900">/*in <FONT 
                                face="Courier New" 
                                color=#ff9900>kobject.h</FONT>*/</SPAN></SPAN><BR><SPAN 
                                style="COLOR: #0000cc">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN 
                                style="COLOR: #0000ff">return</SPAN> kobj <SPAN 
                                style="COLOR: #0000cc">?</SPAN> 
                                container_of<SPAN 
                                style="COLOR: #0000cc">(</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">,</SPAN><SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kset<SPAN 
                                style="COLOR: #0000cc">,</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">)</SPAN> <SPAN 
                                style="COLOR: #0000cc">:</SPAN> <SPAN 
                                style="COLOR: #ff0000">NULL</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><BR><SPAN 
                                style="COLOR: #0000cc">}</SPAN><BR><BR><SPAN 
                                style="COLOR: #0000ff">static</SPAN> <SPAN 
                                style="COLOR: #0000ff">inline</SPAN> <SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kset <SPAN 
                                style="COLOR: #0000cc">*</SPAN> kset_get<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kset <SPAN 
                                style="COLOR: #0000cc">*</SPAN> k<SPAN 
                                style="COLOR: #0000cc">)<SPAN 
                                style="COLOR: #ff9900">/*in <FONT 
                                face="Courier New" 
                                color=#ff9900>kobject.h</FONT>*/</SPAN></SPAN><BR><SPAN 
                                style="COLOR: #0000cc">{</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN 
                                style="COLOR: #0000ff">return</SPAN> k <SPAN 
                                style="COLOR: #0000cc">?</SPAN> to_kset<SPAN 
                                style="COLOR: #0000cc">(</SPAN>kobject_get<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000cc">&amp;</SPAN>k<SPAN 
                                style="COLOR: #0000cc">-</SPAN><SPAN 
                                style="COLOR: #0000cc">&gt;</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">)</SPAN> <SPAN 
                                style="COLOR: #0000cc">:</SPAN> <SPAN 
                                style="COLOR: #ff0000">NULL</SPAN><SPAN 
                                style="COLOR: #0000cc">;<SPAN 
                                style="COLOR: #ff9900">/*增加引用计数*/</SPAN></SPAN><BR><SPAN 
                                style="COLOR: #0000cc">}</SPAN></FONT></SPAN></CODE></P></TD></TR></TBODY></TABLE></P>
                              <P>(3)设置kobject的名字 
                              <TABLE style="BORDER-COLLAPSE: collapse" 
                              borderColor=#999999 cellSpacing=0 cellPadding=0 
                              width="95%" bgColor=#f1f1f1 border=1>
                                <TBODY>
                                <TR>
                                <TD>
                                <P 
                                style="MARGIN: 5px; LINE-HEIGHT: 150%"><CODE><SPAN 
                                style="COLOR: #000000"><FONT face=新宋体><SPAN 
                                style="COLOR: #0000ff">int</SPAN> 
                                kobject_set_name<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kobject 
                                <SPAN style="COLOR: #0000cc">*</SPAN> kobj<SPAN 
                                style="COLOR: #0000cc">,</SPAN> <SPAN 
                                style="COLOR: #0000ff">const</SPAN> <SPAN 
                                style="COLOR: #0000ff">char</SPAN> <SPAN 
                                style="COLOR: #0000cc">*</SPAN> fmt<SPAN 
                                style="COLOR: #0000cc">,</SPAN> <SPAN 
                                style="COLOR: #0000cc">.</SPAN><SPAN 
                                style="COLOR: #0000cc">.</SPAN><SPAN 
                                style="COLOR: #0000cc">.</SPAN><SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN></FONT></SPAN></CODE></P></TD></TR></TBODY></TABLE></P>
                              <P>(4)直接或间接设置其它成员:<FONT 
                              face=新宋体>ktype、kset和parent。 <FONT 
                              color=#ff0000>(重要)</FONT></FONT></P>
                              <P><FONT face=新宋体></FONT>&nbsp;</P>
                              <P><FONT 
                              color=#0000ff><STRONG>对引用计数的操作</STRONG></FONT></P>
                              <P><FONT color=#000000>kobject 
                              的一个重要函数是为包含它的结构设置引用计数。只要对这个对象的引用计数存在, 这个对象( 
                              和支持它的代码) 必须继续存在。底层控制 kobject 的引用计数的函数有: 
                              <TABLE style="BORDER-COLLAPSE: collapse" 
                              borderColor=#999999 cellSpacing=0 cellPadding=0 
                              width="95%" bgColor=#f1f1f1 border=1>
                                <TBODY>
                                <TR>
                                <TD>
                                <P 
                                style="MARGIN: 5px; LINE-HEIGHT: 150%"><CODE><SPAN 
                                style="COLOR: #000000"><FONT face=新宋体><SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kobject 
                                <SPAN 
                                style="COLOR: #0000cc">*</SPAN>kobject_get<SPAN 
                                style="COLOR: #0000cc">(</SPAN><SPAN 
                                style="COLOR: #0000ff">struct</SPAN> kobject 
                                <SPAN style="COLOR: #0000cc">*</SPAN>kobj<SPAN 
                                style="COLOR: #0000cc">)</SPAN><SPAN 
                                style="COLOR: #0000cc">;</SPAN><SPAN 
                                style="COLOR: #ff9900">/*若成功,递增 kobject 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -