|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
' N5 x; A$ o$ P7 Z, q
Linux驱动开发主要的工作就是编写模块,一个典型的Linux内核模块文件.ko 主要由以下几个部分组成。
) D3 w# z0 m. w% S# F, O! o- u# y* j1 x, ? ^
! T* r$ l7 n: Q; H% K) q! @
模块加载函数(必须)
. l& J* }# `3 }! M; @% y
t% B4 h/ @: `/ x9 m
" V; @ @5 I# W. t# A 当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。1 j6 |" G/ ~3 K y) d; @
: k6 C& y% G5 ~' c3 G Y
( x9 L4 Z) h9 E: f. `5 |) o Linux内核模块加载函数一般用static 关键字声明为内部链接,并以__init 标识。之所以标识为__init ,用途是如果编译内核时模块是以静态方式包含在vmlinux中,则在链接的时候标识为__init 的函数会放在.init.text 这个区,同时还会在.initcall.init 区中保存一份函数指针,在内核初始化阶段会通过这些函数指针调用这些初始化函数,在初始化阶段完成后,这些init区段会被释放以节省内存。
, [7 Z. I) \7 }5 D" P, @7 p
" b. f u7 t: w; U0 B& v
6 O4 {6 [$ t$ \7 j" [ q/ a 模块加载函数必须以module_init(函数名) 的形式被指定。它返回整型值,若初始化成功,返回0。初始化失败时,应该返回错误编码。内核的错误码是一个负数,在中定义,形如ENODEV等。! f; b! p' a$ C" j2 V; q
' n0 e: q* y1 U; {; v
5 w$ q% P; D) Q( B1 J! j* o 示例代码如下:$ F, ~7 d Y1 r# m8 o
! i* u5 |7 H" c, u ~
. S' E7 l9 S! y$ V8 h. Q4 s3 q2 R' u7 ?- M' ~9 \0 x% {
) w; L7 t8 \/ o9 [1 r& G# d' X) X5 o1 s2 i! ]- {# j
5 j9 v+ g/ o. F) ?* a3 |4 I j
/ j5 Y* ]) I' j
|
|