浅谈Linux驱动程序 (final)_郑重幻灯片.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
与驱动相关的其他实验 利用动态加载内核模块将特定功能函数插入open及close系统调用处理过程,以记录用户对资源的使用信息 可类同于过滤驱动的实现,将open和close系统调用替换,并统计相关的信息。 设计一个驱动程序实现有名管道。 类似于scull驱动程序,但是要按照有名管道的规则加强读写的控制 谢谢 Thank you very much! file结构图 Owner一般设为THIS_MODULE为了防止设备在使用的时候被卸载 * 浅谈Linux驱动程序编写 郑重 2010-04-27 内容 简单的内核模块Hello world #include linux/init.h #include linux/module.h static int hello_init(void) { printk(Hello, world!\n); return 0; } static int hello_exit(void) { printk(Goodbye!\n); } module_init(hello_init); module_exit(hello_exit); Hello word分析 hello_init 模块装载到内核时调用 hello_exit 模块从内核中移除时调用 module_init(hello_init) 这个宏说明hello_init函数是装载该模块时调用 module_exit(hello_exit); 这个宏说明hello_exit函数是卸载该模块时调用 也就是说,函数名字可以随意,只要用module_init和module_exit宏说明即可。 编译模块的Makefile obj-m := helloworld.o//需要构建的模块名 KDIR := /lib/modules/`uname -r`/build PWD := $(shell pwd) EXTRA_CFLAGS += -ggdb modules: $(MAKE) -C $(KDIR) M=$(PWD) modules 多个文件: helloworld-objs := helloworld1.o helloworld2.o obj-m := helloworld.o 安装模块 编译模块 只需make 装载模块 insmod helloworld.ko 从此helloworld成为内核的一部分 卸载模块 rmmod helloworld helloworld从内核中移除 看看发生了什么 通过dmesg命令查看内核中的输出 内核编程的注意 无C语言提供的类库,只能使用内核函数,幸好一般的C函数在内核中均有对应的内核函数。 printf 和printk fopen和filp_open 根据需要可以Google一下 不能对用户空间的数据直接操作,一般需要copy到内核空间 copy_from_user copy_to_user 内容 scull字符驱动 Simple Character Utility for Loading Localities,区域装载的简单字符工具 操作内存区域的字符设备驱动程序 这片内存区域就相当于一个设备 该驱动不与硬件相关,学习驱动程序的极好例子 Scull初始化 设备号 内核中用一个32位数保存设备编号 dev_t类型 12位表示主设备号 20位表示次设备号 MKDEV(int major, int minor)将主次设备号转化为dev_t类型 MAJOR(dev_t dev) 得到主设备号 MINOR(dev_t dev) 得到次设备号 分配和释放设备号 分配int register_chrdev_region( dev_t first,//分配的设备编号的起始值 unsigned int count,//连续设备编号的个数 char *name)//设备的名称,出现在/proc/decives和sysfs 释放 void unregister_chrdev_region( dev_t first,//分配的设备编号的起始值 unsigned ing count,//连续设备编号的个数 操作设备 我们已经知道,在Linux中对用户来说操作设备和操作文件基本是一样的。 我们的驱动程序需要提供文件的相关操作的函数。 填充file结构中的file_operations类型的f_op字段。 主要需要实现的函数 struct module *owner指向拥有该结构的指针,不是函数。 其他的文件操作函数 read write llseek ………… 自定义需要实现的函数,没实现的在调用时系统会返回默认的错误。 文件操作函数初始化 struct file_operations scull_fops

文档评论(0)

xiaofei2001128 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档