网站大量收购闲置独家精品文档,联系QQ:2885784924

2-Linux驱动和内核模块编程.ppt

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Makefile 第一次进入Makefile,KERNELRELEASE没有被定义 执行else后面的语句,给KERNEL, PWD赋值 执行default,编译 Make -C选项进入内核源代码目录,找到顶层的Makefile M=PWD,返回当前目录执行Makefile文件 这就是第二次进入这个Makefile,在这次,由于KERNELRELEASE变量已经定义,因此不需要进入else语言,在这里,obj-m:=hello.o,在这里内核会帮你处理一切,这句话是告诉内核,需要从hello.o创建一个驱动模型(module) 装载驱动模块 装载模块 Insmod和modprobe可以用来装载模块 查看已加载模块 lsmod cat /proc/modules. Insmod和modprobe主要区别 modprobe会考虑要装载的模块是否引用了一些当前内核不存在的符号。如果有这类引用,modprobe会在当前模块路径中有哪些信誉好的足球投注网站定义了这些符号的其他模块,并同时将这些模块也装载到内核。如果在这种情况下使用insmod,该命令则会失败,并在系统日志文件中记录“unresolved symbols(未解析的符号)”消息。 卸载驱动模块 卸载模块 从内核中卸载模块可以用rmmod工具. 注意,如果内核认为该模块任然在使用状态,或者内核被禁止移除该模块,则无法移除该模块。 内核打印函数 printk(fmt, args …) 级别 KERN_EMERG 用于紧急消息, 常常是那些崩溃前的消息. KERN_ALERT 需要立刻动作的情形. KERN_CRIT 严重情况, 常常与严重的硬件或者软件失效有关. KERN_ERR 用来报告错误情况; 设备驱动常常使用 KERN_ERR 来报告硬件故障. KERN_WARNING 有问题的情况的警告, 这些情况自己不会引起系统的严重问题. KERN_NOTICE 正常情况, 但是仍然值得注意. 在这个级别一些安全相关的情况会报告. KERN_INFO 信息型消息. 在这个级别, 很多驱动在启动时打印它们发现的硬件的信息. KERN_DEBUG 用作调试消息. 不能打印浮点数 运行内核模块 编译 上传模块,rz 加载模块 insmod 查看模块 lsmod、cat /proc/modules 卸载模块 rmmod 设备驱动的Hello World模块(hello.c) #include linux/init.h #include linux/module.h MODULE_LICENSE(Dual BSD/GPL); static int __init hello_init(void) { printk(KERN_ALERT Hello world\n); return 0; } static void __exit hello_exit(void) { printk(KERN_ALERT Hello world exit\n); } module_init(hello_init); module_exit(hello_exit); 自由许可证 模块卸载宏 用法类似于printf,但它有优先级(比如KERN_ALERT) 模块初始化宏 宏,告诉内核这两个函数只会在加载和卸载模块时使用 内核模块参数 模块也可以拥有参数数组 形式为“module_param_array(数组名,数组类型,数组长,参数读/写权限)”。 运行insmod或modprobe命令时,应使用逗号分隔输入的数组元素 装载模块时改变参数: 可通过insmod或modprobe insmod hello_ext.ko howmany=5 whom=Students modprobe也可以从它的配置文件(/etc/modprobe.conf)读取参数的值 内核模块参数 module_param(参数名,参数类型,参数读/写权限) 内核支持的模块参数类型包括: byte、short、ushort、int、uint、long、ulong、charp(字符指针)、bool以‘u’开头的为无符号值。 static char *whom = world; static int howmany = 1; module_param(howmany, int, S_IRUGO); module_param(whom, charp, S_IRUGO); 导出符号 模块导出符号 EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name); _GPL 版本的宏定义的导出符号只

文档评论(0)

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

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

1亿VIP精品文档

相关文档