📄 linux设备驱动程序学习(12)-linux设备模型(底层原理简介) - linux设备驱动程序 - tekkaman ninja.htm
字号:
<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> <SPAN
style="COLOR: #0000ff">if</SPAN> <SPAN
style="COLOR: #0000cc">(</SPAN><SPAN
style="COLOR: #0000cc">!</SPAN>kobj<SPAN
style="COLOR: #0000cc">)</SPAN><BR> <SPAN
style="COLOR: #0000ff">return</SPAN><SPAN
style="COLOR: #0000cc">;</SPAN><BR> kref_init<SPAN
style="COLOR: #0000cc">(</SPAN><SPAN
style="COLOR: #0000cc">&</SPAN>kobj<SPAN
style="COLOR: #0000cc">-</SPAN><SPAN
style="COLOR: #0000cc">></SPAN>kref<SPAN
style="COLOR: #0000cc">)</SPAN><SPAN
style="COLOR: #0000cc">;</SPAN><SPAN
style="COLOR: #ff9900">/*设置引用计数为1*/</SPAN><BR> INIT_LIST_HEAD<SPAN
style="COLOR: #0000cc">(</SPAN><SPAN
style="COLOR: #0000cc">&</SPAN>kobj<SPAN
style="COLOR: #0000cc">-</SPAN><SPAN
style="COLOR: #0000cc">></SPAN>entry<SPAN
style="COLOR: #0000cc">)</SPAN><SPAN
style="COLOR: #0000cc">;</SPAN><SPAN
style="COLOR: #ff9900">/*初始化kobject
之间的双向链表*/</SPAN><BR> init_waitqueue_head<SPAN
style="COLOR: #0000cc">(</SPAN><SPAN
style="COLOR: #0000cc">&</SPAN>kobj<SPAN
style="COLOR: #0000cc">-</SPAN><SPAN
style="COLOR: #0000cc">></SPAN>poll<SPAN
style="COLOR: #0000cc">)</SPAN><SPAN
style="COLOR: #0000cc">;</SPAN><SPAN
style="COLOR: #ff9900">/*初始化等待队列头*/</SPAN><BR> kobj<SPAN
style="COLOR: #0000cc">-</SPAN><SPAN
style="COLOR: #0000cc">></SPAN>kset <SPAN
style="COLOR: #0000cc">=</SPAN> kset_get<SPAN
style="COLOR: #0000cc">(</SPAN>kobj<SPAN
style="COLOR: #0000cc">-</SPAN><SPAN
style="COLOR: #0000cc">></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> atomic_set<SPAN
style="COLOR: #0000cc">(</SPAN><SPAN
style="COLOR: #0000cc">&</SPAN>kref<SPAN
style="COLOR: #0000cc">-</SPAN><SPAN
style="COLOR: #0000cc">></SPAN>refcount<SPAN
style="COLOR: #0000cc">,</SPAN>1<SPAN
style="COLOR: #0000cc">)</SPAN><SPAN
style="COLOR: #0000cc">;</SPAN><BR> 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> <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> <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">&</SPAN>k<SPAN
style="COLOR: #0000cc">-</SPAN><SPAN
style="COLOR: #0000cc">></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> </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 + -