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

沈阳市网站建设报价龙胜时代大厦 做网站

沈阳市网站建设报价,龙胜时代大厦 做网站,六安网站软件建设,英文 网站 源码写过Linux驱动的人都知道module_init宏#xff0c;因为它声明了一个驱动的入口函数。 除了module_init宏#xff0c;你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数#xff0c;而是看到了许多诸如以下的声明#xff1a; 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 couldnt 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);//遍历所有等级的initcalllevel变量对应等级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[level1]; 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.dnsts.com.cn/news/27675.html

相关文章:

  • 网站开发一个网站洛阳网站公司
  • 金融产品做网站推广创业新项目
  • 注册公司的流程和步骤漯河网站优化
  • 开源网站源码下载wordpress 分页制作
  • 17网站一起做网店不发货建立企业的网站有哪几种方案
  • 学校网站建设主体海曙seo关键词优化方案
  • 做了网站应该如何推广顺德企业网站制作
  • 昆山那个网站推广好wordpress html
  • 建筑公司网站作用西安网站设计公司排名
  • 网站后台打不开的原因seo外链发布工具
  • 网站维护提示代码wordpress page 父页面
  • 学网站开发的培训学校网站怎么建设
  • 建立网站外链常用的渠道有哪些在线签名设计
  • 想开一个网站开发的公司网站需要服务器吗
  • 行业网站大全山西利用模板建站
  • 网站空间推荐wordpress建站系统视频教程
  • 那些网站是针对物流做的换服务器后网站首页不收录
  • 宜昌市网站建设免费婚纱网站模板
  • 地名网站建设方案wordpress id连续插件
  • 17做网站广州沙河地址房地产开发公司网站建设方案模板
  • 私人找人做网站舆情分析师发展前景
  • 有哪些可以做图的网站啊wordpress 视频尺寸
  • 百度收录网站但首页快照不更新网站建设教学视频百度云盘
  • 网站建设与服务技能实训心得体会男生女生做污事网站 localhost
  • 国外做设计赚钱的网站入驻京东需要自己做网站吗
  • 网站空间怎么使用做做网站2023
  • 眼镜网站怎么做竞价李贤威wordpress
  • 公司网站建设p开发江苏建设招标信息网站
  • 门户网站建设意义沈阳做网站优秀公司
  • 秦皇岛网站建设公司介绍怎么写