HelloWorld模块内核模块的Makefile.PPT

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
HelloWorld模块内核模块的Makefile

Linux 2.6内核模块设计 内核模块概述 Linux内核是整体式结构,各个子系统联系紧密,作为一个大程序在内核空间运行。 内核模块概述 太多的设备驱动和内核功能集成在内核中,内核过于庞大。如何解决? Linux内核引入内核模块机制。通过动态加载内核模块,使得在运行过程中扩展内核的功能。不需要的时候,卸载该内核模块。 内核模块概述 什么是内核模块? 内核模块是一种没有经过链接,不能独立运行的目标文件,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)。 内核模块可以让操作系统内核在需要时载入和执 行,在不需要时由操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统。 如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜 像来加入新的功能。这还意味着一个臃肿的内核。 内核模块概述 模块机制的优点: 减小内核映像尺寸,增加系统灵活性; 节省开发时间;修改内核,不必重新编译整个内核。 模块的目标代码一旦被链入内核,作用和静态链接的内核目标代码完全等价。 模块机制的缺点: 对系统性能有一定损失; 使用不当时会导致系统崩溃; 内核模块概述 内核模块是如何被调入内核工作的? 当操作系统内核需要的扩展功能不存在时,内核模块管理守护进程kmod执行modprobe去加载内核模块。 modprobe遍历文件/lib/modules/$(version)/modules.dep 来判断是否有其它内核模块需要在该模块加载前被加载。 最后modprobe调用insmod先加载被依赖的模块,然后加载该被内核要求的模块。 内核模块概述 内核模块的卸载 当我们不需要内核模块了,为了减少系统资源的开销,需要卸载时使用命令 #rmmod module_name 或者 #modprobe –r module_name 查看系统已经加载的模块,使用命令 #lsmod 实验:Hello World模块 步骤: 新建模块目录 用编辑器(vi)编辑源文件 用编辑器编辑Makefile 在内核源码树外编译 把模块加到内核源码树并把配置信息同时加入 实验:Hello World模块 #include linux/init.h // for module_init() #include linux/module.h // must be include #include linux/kernel.h // for printk() static int __init hello_init(void) { printk(“Hello world\n”); return 0; } static void __exit hello_exit(void) { printk(“Hello module exit\n”); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE(“GPL”); MODULE_AUTHOR(“hsq”); 实验:Hello World模块 说明: 1) 模块入口函数为hello_init(), 由module_init() 宏指定,在模块被加载的时候被调用向系统 注册, 就象应用程序的main()一样,主要来 完成模块的初始化工作 2) 入口函数的返回值为0表示成功, 非0表示失败 3) 模块的退出函数为hello_exit(),由module_exit()宏 指定,在模块被卸载是被调用向系统注销,主要来完成 资源的清理工作,它被调用完毕后,就模块就被内核清除了 4) 一个模块最少需要有入口和退出函数 实验:Hello World模块 说明: 关于__init和__exit宏 如果该模块被编译进内核,而不是动态加载,则宏 __init的使用会在初始化完成后丢弃该函数并收回所占内存。 如果该模块被编译进内核,宏__exit将忽略“清理收尾”的函数。 这些宏在头文件linux/init.h定义,用来释放内核占用的内存。例如启动时看到的信息“Freeing unused kernel memory: 236k freed”,正是内核释放这些函数所占用空间时的打印信息。 实验:Hello World模块 prin

文档评论(0)

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

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

1亿VIP精品文档

相关文档