当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]kbuild系统-编译到内核和编译成模块的区别

代码编译内核和编译成模块在代码中有什么区别呢?

从模块的代码中看是一样的。入口函数都是MODULE_init(fun),但是代码中的条件编译会使宏module_init()在编译到内核和编译成模块的情况下替换成不同的代码。

include/linux/init.h中可知

#ifndef MODULE

...

#define module_init(x) __initcall(x);

...

#else /* MODULE */

...

/* Each module must use one module_init(), or one no_module_init */

#define module_init(initfn)

static inline initcall_t __inittest(void)

{ return initfn; }

int init_module(void) __attribute__((alias(#initfn)));

...

#endif

当代码编译成模块时,会定义MODULE宏,否则不会。因为在/usr/src/linux/Makefile中可以看到

336 MODFLAGS = -DMODULE

337 CFLAGS_MODULE = $(MODFLAGS)

338 AFLAGS_MODULE = $(MODFLAGS)

这两个变量又被export成为全局变量。所以可以知道,在编译成模块时,会有MODULE这个宏。

由以下代码可以知道

#define __initcall(fn) device_initcall(fn)

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

085 #define __define_initcall(level,fn)

086 static initcall_t __initcall_##fn __attribute_used__

087 __attribute__((__section__(".initcall" level ".init"))) = fn

前者实际上是编译入内核中的.initcall6.init 这个section

而在

arch/i386/kernel/vmlinux.lds.S中可以知道:

083 __initcall_start = .;

084 .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {

085 *(.initcall1.init)

086 *(.initcall2.init)

087 *(.initcall3.init)

088 *(.initcall4.init)

089 *(.initcall5.init)

090 *(.initcall6.init)

091 *(.initcall7.init)

092 }

093 __initcall_end = .;

arch/i386/kernel/vmlinux.lds.S

.initcall6.init是.initcall.init的一部分

执行顺序:

start_kernel->rest_init

系统启动后在rest_init中会创建init内核线程

init->do_basic_setup->do_initcalls

do_initcalls中会把.initcall.init中的函数依次执行一遍

for (call = __initcall_start; call < __initcall_end; call++) {

...

(*call)();

...

}

于是执行了module_init(fn)函数

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

深圳2025年8月12日 /美通社/ -- 全球消费电子行业领导者、Mini LED和超大屏[1]电视销量全球第一的TCL欣然宣布,公司将参加9月5日至9日在柏林举办的2025年德国柏林消费电子展(IFA 2025)。作...

关键字: TCL 消费电子展 NI 大屏

北京2025年8月11日 /美通社/ -- 2025年8月8日,由紫光汉图举办的 "双引擎•印未来"紫光打印机新品发布会正式在北京通明湖会展中心举行。 工业和信息化部电子信息司电子系统处领导、中国电...

关键字: 打印机 紫光 NI 核心技术

加快开发进程;提升质量、安全性、性能与成本效益 利用耐世特在底盘领域的专业知识和线控技术产品组合 美国密西根州奥本山2025年8月11日 /美通社/ -- 耐...

关键字: MOTION 软件 运动控制 NI

-Cognizant正在筹办全球最大规模的氛围编程活动,以提升数千名员工的AI素养 为抓住人工智能经济将创造的巨大机遇,Cognizant与Lovable、Windsurf、Cursor、Gemini Code Ass...

关键字: 编程 NI AN PI

-Cognizant推出AI Training Data Services,助力企业级AI模型加速开发 Cognizant是数据与AI模型训练合作伙伴,长期深受大型数字原生先锋企业信赖,助力其训练全球最先进的AI/机器...

关键字: NI AN AI模型 SERVICES

葡萄牙波尔图2025年7月31日 /美通社/ -- 全球领先的新一代制造执行系统供应商凯睿德制造宣布收购专注于高科技制造图像分析的AI专家公司 Convanit。本次收购是扩展凯睿德制造数据平台能力的重要一步,将助力客户...

关键字: 智能制造 图像分析 NI AN

2025年,该实验室已新获两项美国授权专利,开源了一个关键AI开发平台,并赢得了GECCO金奖 新泽西州提内克2025年7月25日 /美通社/ -- Cognizant(Nasdaq:CTSH)今日宣布,其AI实验室新...

关键字: AI NI AN BSP

-Vehere宣布推出v1.8.1,为安全分析师提供更精准的检测、更快的响应和更智能的工作流程 旧金山2025年7月18日 /美通社/ -- 领先的人工智能驱动型网络情报提...

关键字: 网络 UI MT BSP

上海2025年6月30日 /美通社/ -- 6月30日,文心大模型正式开源,黑芝麻智能即日起快速启动与文心大模型技术合作。 黑芝麻智能将基于文心大模型,打造行业领先的车端推理引擎,为企业、开发者提供真正可用、好用、可落...

关键字: 模型 NI 开源 多模

与英伟达的技术合作致力加速生产制造的数字化转型 舍弗勒全球工厂将通过AI解决方案的应用加速制造工艺的革新,并提升产品质量 舍弗勒凭借数十年在制造领域的技术积累,推动工业元宇宙持续发展 巴黎和赫...

关键字: 数字化 英伟达 SE NI
关闭