以module_init(Demo_init);为例

定义文件:

include\linux\init.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__(".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.

在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)

*(.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结构体

linux驱动入口函数,你了解linux驱动的入口?相关推荐

  1. linux使用shell函数扩充命令,Linux Shell系列教程之(十五) Shell函数简介 | Linux大学...

    摘要 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高. 高级语言都支持函数,Shell也不例外.今天就为大家介绍下Shell中函数相关用法. 函数可以将一个复杂功能划 ...

  2. linux 创建线程函数吗,[笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include #define CreateThreadEx(tid,threadFun,args) ...

  3. linux驱动获取函数失败信息,linux驱动调试--段错误之栈信息分析

    接着上一篇来分析一下Oops的栈 s3c2440平台 关于调试源码和整个Oops信息请参考上一篇博文,这里只再次贴出关于栈的信息 Stack: (0xc3a61e30 to 0xc3a62000) 1 ...

  4. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)

    1.exit()函数 exit(int n)  其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...

  5. linux文件字节函数,各位大侠:linux/unix下有什么双字节的字符类型及其一整套处理函数? 高分送出,请帮帮小弟!!!!!!...

    linux/unix下小弟需要操作双字节,相对单字节char 有什么双字节的字符类型及其一整套处理函数,如strstr(),strcpy(),strchr等功能相同的双字节操作函数,它用到什么头文件? ...

  6. linux用Lseek函数 拷贝文件,linux系统下lseek函数的详细用法

    前面的文章里面,仔细讲了在linux系统对文件的读写操作以及文件管理,为今天要讲的内容作了铺垫(如果您是刚接触这方面的内容,可以先看我之前写的文章,有错误的地方,还望指出来,在这里先说一声谢谢).好了 ...

  7. linux c sync函数,怎么在Linux中调用fsync函数

    Linux中如何调用fsync函数?针对这个问题,本文详细介绍了相应的分析和解决方法,希望能帮助更多想解决这个问题的伙伴找到更简单易行的方法. 功能描述: 将内存中所有已修改的文件数据同步到存储设备. ...

  8. linux中read函数的用法,Linux中read命令的简介及使用方法

    Linux中read命令的简介及使用方法 发布时间:2020-08-17 16:40:04 来源:亿速云 阅读:107 作者:小新 这篇文章给大家分享的是有关Linux中read命令的简介及使用方法的 ...

  9. Linux中append函数的用法,linux C代码 open函数参数:O_APPEND问题求助

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 没有截图,直接上代码吧. 原代码是这样的: #include #include #include #include #include int main() ...

最新文章

  1. ffmpeg 编译Android
  2. 熬了一晚上,我从零实现了Transformer模型,把代码讲给你听
  3. window.event.srcElement
  4. Bootstrap之Carousel不能自动播放的解决办法(转)
  5. Software Engineering | Factory method pattern
  6. 系统设计:性能指标、伸缩性、扩展性、可用性、安全性
  7. linux 指令引用变量,Linux之变量引用与命令替换
  8. spring cloud + spring boot + springmvc+mybatis分布式微服务云架构
  9. [ETL] Flume 理论与demo(Taildir Source Hdfs Sink)
  10. es的master选举摘要
  11. 20190827 On Java8 第十四章 流式编程
  12. qTip2 精致的jQuery提示信息插件
  13. 单位计算机安全和保密措施,安全管理及保密措施
  14. 起搏器可以用计算机吗,一个计算机化的心脏起搏器随诊系统
  15. Jedis远程连接阿里云 Failed to create socket
  16. 域名dns解析IP 与 本机IP 不匹配 是否继续安装
  17. 《PaddlePaddle从入门到炼丹》十一——自定义图像数据集识别
  18. lucene(11)
  19. Dbg2Excel_Word
  20. session的到底是做什么的?

热门文章

  1. 自己电脑(ThinkPad SL410K 28428VC)硬件信息记录
  2. 15款jQuery带缩略图的图片轮播切换特效代码
  3. zencart php邮件,ZenCart改成前台英文后台中文后订单更新邮件是中文
  4. labview和c语言,到底哪个更好:LabVIEW还是C语言?
  5. 情感计算-基于肢体动作和生理信号的情感识别
  6. 计算机数控机床用英语怎么说,数控机床常用英语词汇
  7. 计算机怎样输入毫米符号,电脑里等号怎么打,乘除符号怎么打
  8. 【PROE】产品建模:PROE与CREO区别详解
  9. 学习Linux命令(19)
  10. 2021-09-01剑指 Offer 38. 字符串的排列