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

怎样做网站开发网络营销顾问

怎样做网站开发,网络营销顾问,网页设计与制作服务公司,wordpress postgresqllinux版本: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.ds6.com.cn/news/12735.html

相关文章:

  • 朔州做网站的幽默广告软文案例
  • 网站独立ip如何做301重定向seo技术培训岳阳
  • 怎样自己动手做微官网站google谷歌搜索
  • 驻马店手机网站制作百度网页版浏览器入口
  • 分阶段建设网站seo北京
  • 怎么做非法网站企业seo排名优化
  • 家庭电脑做网站1688自然排名怎么做好
  • ui设计是什么软件做的合肥搜索引擎优化
  • 网站建设要什么软件有哪些b2b网站源码
  • 湖南网站建设哪家有厦门seo外包公司
  • 苏州网站建设空间天津百度推广排名
  • 北京做网站设计西安seo优化培训机构
  • 网站seo优化心得公司营销网站建设
  • 政府网站建设存在的问题爱站工具包
  • 平顶山疫情防控最新消息南京seo优化培训
  • 男的做直播哪个网站100个经典创意营销方案
  • 邯郸做网站的友情链接交易平台
  • 网站举报查询进度深圳网络营销信息推荐
  • 网站建设预期达到的效果线上广告推广平台
  • 做免费网站教程抖音seo排名软件哪个好
  • 营销网站建设联系方式百度手机助手app下载
  • 特价锦州网站建设景区营销案例100例
  • app是网站吗互联网销售
  • 商品展示网站模板seo优化排名方法
  • 网站建设项目前景seo网站排名
  • 做批发上哪个网站好seo优化
  • 定制企业网站有哪些企业推广宣传文案
  • 网站开发时投票选项数量受限制bt磁力猫
  • 台州网站专业制作公众号seo排名
  • 郑州网站公司排名青岛seo杭州厂商