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

淄博易宝网站建设sem推广是什么意思呢

淄博易宝网站建设,sem推广是什么意思呢,网站的后期运营及维护费用,软装公司网站建设写过Linux驱动的人都知道module_init宏,因为它声明了一个驱动的入口函数。 除了module_init宏,你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数,而是看到了许多诸如以下的声明: static int __init qco…

写过Linux驱动的人都知道module_init宏,因为它声明了一个驱动的入口函数。

除了module_init宏,你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数,而是看到了许多诸如以下的声明:

static int __init qcom_iommu_init(void)
{int ret;ret = platform_driver_register(&qcom_iommu_ctx_driver);if (ret)return ret;ret = platform_driver_register(&qcom_iommu_driver);if (ret)platform_driver_unregister(&qcom_iommu_ctx_driver);return ret;
}
device_initcall(qcom_iommu_init);
static int __init ebsa110_init(void)
{arm_pm_idle = ebsa110_idle;return platform_add_devices(ebsa110_devices, ARRAY_SIZE(ebsa110_devices));
}arch_initcall(ebsa110_init);

上述举例的两个驱动入口分别使用了device_initcall()和arch_initcall()来声明驱动入口,这些本质上都是对initcall的调用,module_init也如此。

initcall等级

Linux内核对initcall进行了等级划分,每一种类型的initcall都有对应等级,等级0-7。

路径:include/init/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.*/#define __define_initcall(fn, id) \static initcall_t __initcall_##fn##id __used \__attribute__((__section__(".initcall" #id ".init"))) = fn; \LTO_REFERENCE_INITCALL(__initcall_##fn##id)

id越小等级越高,Linux会按照等级由高到低顺序执行:

/** Early initcalls run before initializing SMP.** Only for built-in code, not modules.*/
#define early_initcall(fn)  __define_initcall(fn, early)/** A "pure" initcall has no dependencies on anything else, and purely* initializes variables that couldn't be statically initialized.** This only exists for built-in code, not for modules.* Keep main.c:initcall_level_names[] in sync.*/
#define pure_initcall(fn)  __define_initcall(fn, 0)#define core_initcall(fn)  __define_initcall(fn, 1)
#define core_initcall_sync(fn)  __define_initcall(fn, 1s)
#define postcore_initcall(fn)  __define_initcall(fn, 2)
#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
#define arch_initcall(fn)  __define_initcall(fn, 3)
#define arch_initcall_sync(fn)  __define_initcall(fn, 3s)
#define subsys_initcall(fn)  __define_initcall(fn, 4)
#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
#define fs_initcall(fn)   __define_initcall(fn, 5)
#define fs_initcall_sync(fn)  __define_initcall(fn, 5s)
#define rootfs_initcall(fn)  __define_initcall(fn, rootfs)
#define device_initcall(fn)  __define_initcall(fn, 6)
#define device_initcall_sync(fn) __define_initcall(fn, 6s)
#define late_initcall(fn)  __define_initcall(fn, 7)
#define late_initcall_sync(fn)  __define_initcall(fn, 7s)#define __initcall(fn) device_initcall(fn)

这么做的目的主要是根据优先级依次对设备进行初始化,例如会先初始化与架构相关的,然后再初始化内核子系统。

资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

Linux对initcall的调用

在Linux启动时,会依次遍历所有等级的initcall,以完成一系列的初始化。

initcall的调用流程:

start_kernel->kernel_init->kernel_init_freeable->do_basic_setup->do_initcalls->do_initcall_level()

在do_initcalls()函数中,会遍历所有等级的initcall,完成初始化。

static void __init do_initcalls(void)
{int level;size_t len = strlen(saved_command_line) + 1;char *command_line;command_line = kzalloc(len, GFP_KERNEL);if (!command_line)panic("%s: Failed to allocate %zu bytes\n", __func__, len);//遍历所有等级的initcall,level变量对应等级for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++) {/* Parser modifies command_line, restore it each time */strcpy(command_line, saved_command_line);do_initcall_level(level, command_line);//执行该等级下的所有函数}kfree(command_line);
}

do_initcall_level()会执行对应等级下的所有函数:

static void __init do_initcall_level(int level, char *command_line)
{initcall_entry_t *fn;parse_args(initcall_level_names[level],command_line, __start___param,__stop___param - __start___param,level, level,NULL, ignore_unknown_bootoption);trace_initcall_level(initcall_level_names[level]);for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)do_one_initcall(initcall_from_entry(fn));
}

module_init等级

module_init宏使用的是device_initcall,等级为6:

#define device_initcall(fn)  __define_initcall(fn, 6)
......
#define __initcall(fn) device_initcall(fn)
......
#define module_init(x) __initcall(x);

在一些内核驱动中,直接使用了device_initcall()来声明驱动入口,其效果与使用module_init是一样的。

 

 

http://www.shuangfujiaoyu.com/news/57587.html

相关文章:

  • 网站建设需要考什么证长沙百度关键词排名
  • 如何查询网站备案信息2021年搜索引擎排名
  • 济宁企业做网站专业提升关键词排名工具
  • 网站如何防注册机百度指数怎么分析
  • erp软件前十名广西seo搜索引擎优化
  • 山东建设兵团网站广州百度推广客服电话多少
  • 网站建设添加背景命令东营网站建设费用
  • 自己做静态网站的步骤windows优化工具
  • 三联网站建设如何建造自己的网站
  • 定制网站系统开发杭州优化公司多少钱
  • 2018年做淘宝客网站还能挣钱吗网址大全浏览器主页
  • 遵化市有做奇麟网站的吗网站不收录怎么办
  • 做网站和做免费推广网站的区别线上推广平台
  • 网站怎么产品做推广兰州seo技术优化排名公司
  • 2015微信网站设计视频号推广方法
  • 网站广告条动画 怎么做网站快速排名优化价格
  • 棋牌网站开发需要多少钱律师网络推广
  • 网站建设报价清单石家庄网络推广优化
  • 网站设计的原则有哪些网店运营工资一般多少
  • 做网站哪家好哪家好公众号软文素材
  • 网站价值排行百家联盟推广部电话多少
  • 想自己做淘宝有什么网站吗seo推广方案
  • 海淀区网站建设seo必备工具
  • 网站备案号怎么看滨州网站seo
  • wordpress加cdn如何快速优化网站排名
  • 做网站建设挣钱吗百度推广是干什么的
  • 长春移动端网站设计今日新闻头条最新消息
  • 浦江县建设局网站完整的社群营销方案
  • 长沙网站搭建seo信息流广告优化师培训
  • 用php做的网站软件网络营销案例分析论文