你了解linux驱动的入口?.doc

上传人:白大夫 文档编号:3381545 上传时间:2019-08-20 格式:DOC 页数:2 大小:17KB
返回 下载 相关 举报
你了解linux驱动的入口?.doc_第1页
第1页 / 共2页
亲,该文档总共2页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《你了解linux驱动的入口?.doc》由会员分享,可在线阅读,更多相关《你了解linux驱动的入口?.doc(2页珍藏版)》请在三一文库上搜索。

1、你了解linux驱动的入口?以module_init(Demo_init);为例定义文件:includelinuxinit.h#define module_init(x)_initcall(x);#define _initcall(fn) device_initcall(fn)#define device_initcall(fn)_define_initcall(6,fn,6)#define _define_initcall(level,fn,id) static initcall_t _initcall_#fn#id _attribute_used_ _attribute_(_secTIon

2、_(.initcall level .init) = fn展开为staTIc initcall_t _initcall_Demo_init6 _attribute_used_attribute_(_secTIon_(.initcall6.init) =Demo_init;typedef int (*initcall_t)(void);这里typedef int (init_fnc_t)(void);定义一种函数类型typedef int (*init_fnc_t) (void);定义一种类型的函数指针所以展开的宏定义就是定义名为_initcall_Demo_init6的函数指针属性有两个:1.

3、在gcc 3.4之前的编译器被展开成_attribute_(unused)来禁止编译器弹出有关函数没有被用到的的警告信息在gcc 3.4之后被展开成_attribute_(used)功能一样2.加载到段.initcall6.init,其地址为Demo_init的地址段的分布顺序在链接脚本中有编译内核后,会有vmlinux.lds的打印信息,里面有各段位置_initcall_start = .;*(.initcallearly.init) _early_initcall_end = .;*(.initcall0.init)*(.initcall0s.init)*(.initcall1.init)

4、*(.initcall1s.init)*(.initcall2.init)*(.initcall2s.init)*(.initcall3.init)*(.initcall3s.init)*(.initcall4.init)*(.initcall4s.init)*(.initcall5.init)*(.initcall5s.init)*(.initcallrootfs.init)*(.initcall6.init)*(.initcall6s.init)*(.initcall7.init)*(.initcall7s.init)_initcall_end = .;当insmod的时候,内核从initcall6.init段中读取到驱动入口地址,然后跳转到该地址去执行入口函数,一般入口函数会进行注册驱动,例如register_chrdev(unsigned int major, const char * name, const struct file_operaTIons * fops)usb_register(struct usb_driver * driver)spi_register_driver(struct spi_driver * sdrv)等等注册函数,再依次调用相应设备结构体中的ioctl或者直接调用file_operations结构体

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1