第2章构造和运行模块资料摘要.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Hello World 模块 #include linux/init.h #include linux/module.h #include linux/kernel.h MODULE_LICENSE(Dual BSD/GPL); static int hello_init(void) { printk(KERN_ALERT Hello, world\n); return 0; } static void hello_exit(void) { printk(KERN_ALERT Goodbye, cruel world\n); } module_init(hello_init); module_exit(hello_exit); Hello World 模块 编译 Hello World 模块 模块常用的一些宏 MODULE_AUTHOR(author);声明模块的作者 MODULE_DESCRIPTION(description); 说明模块的用途 MODULE_VERSION(version_string);声明模块的修订号 MODULE_DEVICE_TABLE(table_info); 说明模块所支持的设备 MODULE_ALIAS(alternate_name);说明模块的别名 EXPORT_SYMBOL (symbol); 声明模块导出的符号 EXPORT_SYMBOL_GPL (symbol);声明模块导出的符号 模块与应用程序 应用程序 从头至尾执行单个任务,运行在用户空间 核心模块 可根据需要加载、卸载 加载时初始化并注册自己,然后等待服务于将来的某个请求,类似于事件驱动的编程 退出时必须自己清理现场(撤销初始化函数所做的一切) 只能使用内核导出的符号(函数与变量),不能使用函数库libc 运行在内核空间 模块与应用程序 内核空间和用户空间 模块与应用程序 内核空间和用户空间 模块与应用程序 内核中的并发 内核编程与常见应用程序编程的区别在于对并发的处理,内核代码(包括驱动)必须是可重入的,必须能够同时运行在多个上下文中。 产生并发的原因 Linux是多任务系统,同时运行多个进程 产生中断 内核定时器 对称多处理器(SMP) 2.6内核可抢占,在单处理器上也存在类似多处理器的并发 模块与应用程序 当前进程 由指向当前进程控制块struct task_struct 的指针current可获得当前进程 current-comm:当前进程命令名 current-pid :当前进程ID 早期版本中current为一个全局变量,在2.6中,current 存放在内核栈中 内核栈大小为4096B,由用户进程与内核进程共享,不要声明大的自动变量 模块的编译和装载 编译模块 模块不是独立的可执行程序,需要依赖核心才能工作,需要使用核心导出的符号,例printk() 模块不能单独编译,应该用核心的构造系统来构造,即使用编译核心时所使用的编译器、链接器工具及同样的内核源代码树环境 模块可放在内核源码代码树中构造也可放在内核源代码树外构造 模块的编译和装载 放在内核源代码树中 设备驱动程存放在内核源代码树根目录drivers/的子目录下,例如: 字符设备:drivers/char/ 块设备:drivers/block/ USB设备:drivers/usb/ char下有子目录,也有文件,驱动程序源码是放在该目录下还是创建一个自己的子目录? 模块的编译和装载 放在drivers/char/下 拷贝hello.c到drivers/char/目录下 打开drivers/char/Makefile,在其中增加一行: obj-m +=hello.o 或若有配置选项,增加如下一行: obj-$(CONFIG_HELLO) += hello.o 打开配置文件drivers/char/Kconfig,在其中增加一项: config HELLO tristate “New Hello” make menuconfig make modules 模块的编译和装载 放在drivers/char/下的子目录中 在 drivers/char/下创建子目录hello 拷贝hello.c到drivers/char/hello/目录下 打开drivers/char/Makefile,在其中增加一行: obj-m +=hello/ 或若有配置选项,增加如下一行: obj-$(CONFIG_HELLO) += hello/ 在drivers/char/hello/下新建Makefile,需一行: obj-m += fishing.o 或若有配置选项: obj-$(CONFIG_HELLO) += hell

文档评论(0)

风凰传奇 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档