当前位置: 首页 > news >正文

庐阳网站快速排名营销型企业网站建设方案

庐阳网站快速排名,营销型企业网站建设方案,网页设计与制作代码,免费的分销applinux版本:4.19 module_init()与module_exit()用于驱动的加载,分别是驱动的入口与退出函数 module_init():内核启动时或动态插入模块时调用module_exit():驱动移除时调用 本篇文章介绍module_init() module_init() module_init…

linux版本:4.19
module_init()与module_exit()用于驱动的加载,分别是驱动的入口与退出函数

  • module_init():内核启动时或动态插入模块时调用
  • module_exit():驱动移除时调用
    本篇文章介绍module_init()

module_init()

module_init()是驱动的入口函数,该函数定义在include\linux\module.h文件

/*** module_init() - driver initialization entry point* @x: function to be run at kernel boot time or module insertion** module_init() will either be called during do_initcalls() (if* builtin) or at module insertion time (if a module).  There can only* be one per module.*/
#define module_init(x)	__initcall(x);

__initcall(x)函数定义在include\linux\init.h文件里面

#define __initcall(fn) device_initcall(fn)

device_initcall(fn)定义也在include\linux\init.h文件里面

#define device_initcall(fn)		__define_initcall(fn, 6)

__define_initcall(fn, 6)定义也在include\linux\init.h文件里面

#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)

___define_initcall(fn, id, .initcall##id)定义也在include\linux\init.h文件里面

/** initcalls are now grouped by functionality into separate* subsections. Ordering inside the subsections is determined* by link order. * For backwards compatibility, initcall() puts the call in * the device init subsection.** The `id' arg to __define_initcall() is needed so that multiple initcalls* can point at the same handler without causing duplicate-symbol build errors.** Initcalls are run by placing pointers in initcall sections that the* kernel iterates at runtime. The linker can do dead code / data elimination* and remove that completely, so the initcall sections have to be marked* as KEEP() in the linker script.*/#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
#define ___define_initcall(fn, id, __sec)			\__ADDRESSABLE(fn)					\asm(".section	\"" #__sec ".init\", \"a\"	\n"	\"__initcall_" #fn #id ":			\n"	\".long	" #fn " - .			\n"	\".previous					\n");
#else
#define ___define_initcall(fn, id, __sec) \static initcall_t __initcall_##fn##id __used \__attribute__((__section__(#__sec ".init"))) = fn;
#endif

综上module_init调用顺序如下:

module_init()--->__initcall()--->device_initcall()--->__define_initcall()--->___define_initcall()

对___define_initcall()函数进行分析
首先了解一下#与##的作用

符号作用举例
##“##”符号可以是连接的意思例如initcall_##fn##id为initcall_fnid,假设fn为fbmem_init,id=6时,initcall_##fn##id为initcall_fbmem_init6
#"#"符号可以是字符串的意思例如#id为“id”,id=6时,#id为“6”

所以module_init(fbmem_init)函数,相当于

static initcall_t __initcall_fbmem_init6 __used __attribute__((__section__(".initcall6.init"))) =fbmem_init

这行代码定义了一个静态变量__initcall_fbmem_init6,变量类型为initcall_t(是一个函数指针类型,用于表示内核的初始化函数),__used 用于告诉编译器不要将“__initcall_fbmem_Init6”变量视为未使用的变量,避免编译器优化移除它。
attribute((section(“.initcall6.init”))),编译器指令,告诉编译器将“__initcall_fbmem_init6”变量放置在‘.initcall6.init’的代码段中(这个代码段通常用于存放内核的初始化函数,在启动的时候按顺序执行,.initcall1.init、.initcall2.init 。。。)
‘= fbmem_init’ 这将’__initcall_fbmem_init6’初始化为指向‘fbmem_init’函数的指针。
  总之,这段代码的作用是将‘fbmem_init’函数注册为一个初始化函数,使其在内核启动的时候执行。
对于编译成模块,执行sudo insmod的时候,是如何加载的,等我知道后再来写

http://www.15wanjia.com/news/161318.html

相关文章:

  • 用flash做的网站欣赏开发板和单片机的区别
  • 网站后台图片传不上去怎么办自助建站免费建站
  • 自己制作网站的方法商丘互联网公司
  • 网站图片设置隐私保护怎么下载单品商城网站源码
  • 做碳循环的网站心知天气Wordpress
  • 越南做网站服务器wordpress 主题 更改
  • dedecms物流企业网站模板(适合快递京东网站怎么做
  • 帝国cms获取网站地址远憬建站
  • 上海当地网站怎样建立一个公司网站
  • 无锡网站商城建设设备网站模板
  • 广州北京网站建设电商网站开发建设
  • 佛山网站搜索引擎优化php企业网站程序
  • 导航 网站 分析帮人做彩票网站
  • 网站运营工资业余学做衣服上哪个网站
  • 阿里云做网站官网网站本科
  • 网站流量渠道百度站长自动推送wordpress
  • 帮建网站开封搜索引擎优化
  • 网站网页设计引言网站营销案例展示
  • 做最好的在线中文绅士本子阅读网站6百度网站入口特效词
  • 资海网站建设网页设计与制作的岗位职责
  • 空间商指定的网站目录好的摄影网站推荐
  • 企业网站源码搜一品资源计算机网络技术网站开发
  • 网站模块结构图网页qq登录空间
  • 白云手机网站开发营业推广策略
  • 外贸led网站建设辽宁网站备案要多久
  • 网站运营与管理的心得体会东莞网站制作网站
  • 墨子网站建设网站使用cookies
  • 旅游网站开发意义网站打开速度影响因素
  • 安贞做网站公司wordpress线下安装教程视频
  • 中交路桥建设网站涟水网站开发公司点击查看