- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
应用程序与驱动程序通过设备文件进行通信
每个设备文件都有主设备号与次设备号 主设备号表示设备的类型 次设备号表示具体的设备
在内核中 就是根据主设备号来调用相应的驱动程序 驱动根据次设备号分辩具体设备以区分操作
主设备号由 linux 统一分配 但是也可以使用临时设备 在注册驱动时把主设备号输入为 0 则由内核自动分配
设备的类型:
主要类型有下面三种
字符设备:它的保存是以字符流的形式保存
块设备:它的保存是以块为单位保存,提供和字符驱动一样的接口,当然有自己块操作的接口,如 mount,同时支持像字符设备那样的访问方式,
上面两个都是映射到一个设备文件,设备文件通常保存在/dev/目录下,当然你可以保存在任意地方
网络接口:用于进行网络通信,可能针对某个硬件,如网卡,或是纯软件,如 loopback,网络接口只是面向数据包而不是数据流,所以内核的处理也不同,没有映射成任何设备文件,而是按 unix 标准给它们分配一个唯一的名字
驱动开发时注意点:
只提供机制,不限制策略,调用者可以按照自己的要求自己订制策略
权限的判断, 应该尽量让系统管理员决定而不是在驱动中指定,除非这个设备对整个系统有影响
安全编程,从用户进程得到的输入必须检查,返回给用户进程的内存必须初始化(如果这块内存刚好保存
口令信息 或是其它就会破坏系统安全性)
内核不连接 libc,所以不可以使用 libc 里面的函数 如 printf 等,必须使用内核自己提供的函数,如果你不
知道有哪些函数,那看看内核头文件是不错的选择
避免名字空间污染,不需要输出的符号就不输出 如果你的符号被其它模块引用,那使用EXPORT_SYMBLE 声明被输出,要输出的模块最好加上模块名前缀 避免冲突 . 不对外开放的使用 static 限制在本地使用
注意可重入性问题,必须考虑到执行到某步时任务切换或是中断处理时应该怎样处理.
在 2.6 下开发简单的驱动
2.6 驱动的开发相对以前各版本来说有了很大的改变 先是初始化与退出函数
以前使用init_module 函数来声明模块初始化过程 使用cleanup_module 来定义模块退出时的清除过程而在 2.6 中 必须使用 module_init 标志来说明初始化函数 使用 module_exit 来说明清理函数
在 2.4 中,可以单独编译一个模块 而在 2.6 中,一个模块的编译,必须编译全部所有模块
下面是一个 2.6 内核的模板#define MODULE #include linux/module.h
#include linux/config.h #include linux/init.h
static int init name_of_initialization_routine(void) {
/*
* code here
*/
}
static void exit name_of_cleanup_routine(void) {
/*
* code here
*/
}
module_init(name_of_initialization_routine); module_exit(name_of_cleanup_routine);
MODULE 宏也不再是必须的了,在编译时可不定义
编译过程的区别
2.4 的编译过程如下
gcc -D KERNEL -DMODULE -I/usr/src/linux-2.4.21/include -O2 -c testmod.c
要定义 KERNEL 是因为在内核头文件中,某些符号只在定义这个宏后才会公开
2.6 的编译过程
写一个简单的 Makefile 只有一行
obj-m := testmod.o
然后使用如下命令编译
make -C /usr/src/linux-2.6.1 SUBDIRS=$WD modules
$WD 是你的内核模块所在的目录 使用如上命令时会自动重编译系统的内核模块与你的模块所以 保存内核源目录中的版本号与配置文件与你当前运行内核相同是必要的
一个简单的例子:
testmod.c
#define MODULE
#include linux/module.h #include linux/config.h #include linux/init.h
static int init testmod_init(void)
{
printk(1hello world\n); return 0;
}
static void exit testmod_cleanup(void)
{
printk(1exit module\n);
}
module_init(testmod_init); module_exit(testmod_cleanup);
您可能关注的文档
- 塑料颗粒的种类和用途.docx
- 塑料线盘的特点.docx
- 塑料中英文名称对对照.docx
- 塑性变形力学计算.docx
- 酸 雨分析和总结.docx
- 酸碱盐在水溶液中的电离.docx
- 酸奶菠萝吐司.docx
- 酸奶市场问卷.docx
- 酸奶中的添加剂对人体有危害吗.docx
- 蒜香萝卜土豆烧肉.docx
- 广东省东莞市2024-2025学年八年级上学期生物期中试题(解析版).pdf
- 非遗剪纸文创产品开发经理岗位招聘考试试卷及答案.doc
- 广东省东莞市2024-2025学年高二上学期期末教学质量检查数学试题.pdf
- 体育安全理论课件图片素材.ppt
- 3.1 公民基本权利 课件-2025-2026学年道德与法治八年级下册 统编版 .pptx
- 广东省潮州市湘桥区城南实验中学等校2024-2025学年八年级上学期期中地理试题(解析版).pdf
- 大数据运维工程师岗位招聘考试试卷及答案.doc
- 广东省深圳市福田区八校2026届数学八年级第一学期期末教学质量检测模拟试题含解析.doc
- 广东省潮州市湘桥区城基初级中学2024-2025学年八年级上学期11月期中考试数学试题(解析版).pdf
- 广东省潮州市湘桥区城西中学2024-2025学年八年级上学期期中地理试题(解析版).pdf
最近下载
- Q-JJJ 9002-2025铁路建设项目安全穿透式管理实施指南(OCR).pdf VIP
- 项目开发总结报告 项目开发总结报告.doc VIP
- (护理学(护理科研方向))护理科研方法试题及答案.doc VIP
- 2026年教育系统校级后备干部选拔考试题及答案.docx VIP
- 2023年北师大版六年级数学下册全单元测试题【及参考答案】.docx VIP
- GT-Power建模流程与校准技巧-湖南大学.ppt VIP
- 项目成本管理研究开题报告.docx VIP
- 2025 年大学生物医学工程(生物医学基础)试题及答案.doc VIP
- 第十届地球小博士高中组试题及答案.docx VIP
- 六上第二单元形状与结构 复习题 选择题和判断题 6.6练习.docx VIP
原创力文档


文档评论(0)