找回密码
 注册
关于网站域名变更的通知
查看: 177|回复: 1
打印 上一主题 下一主题

介绍一下Linux内核模块文件组成

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-11 14:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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) X
5 o1 s2 i! ]- {# j
5 j9 v+ g/ o. F) ?* a3 |4 I  j
/ j5 Y* ]) I' j

该用户从未签到

2#
发表于 2019-10-11 22:40 | 只看该作者
谢谢分享,学习啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 05:40 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表