问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在LINUX中,环境变量的加载顺序?

发布网友 发布时间:2024-02-07 18:54

我来回答

1个回答

热心网友 时间:2024-07-27 05:54

内核启动的时候,各个驱动初始化的工作在文件init/main.c中的do_basic_setup()函数中做.
------------------------------------------------------------------------------------------------------
static void __init do_basic_setup(void)
{
/* drivers will send hotplug events */
init_workqueues();
usermodehelper_init();
driver_init();

#ifdef CONFIG_SYSCTL
sysctl_init();
#endif

/* Networking initialization needs a process context */
sock_init();

do_initcalls();
}
------------------------------------------------------------------------------------------------------
其中的driver_init()做一些核心的初始化,看看代码就明白了.
相应的驱动程序的初始化在do_initcalls()中做.
------------------------------------------------------------------------------------------------------
static void __init do_initcalls(void)
{
initcall_t *call;
int count = preempt_count();

for (call = __initcall_start; call < __initcall_end; call++) {
char *msg;

if (initcall_debug) {
printk(KERN_DEBUG "Calling initcall 0x%p", *call);
print_fn_descriptor_symbol(": %s()", (unsigned long) *call);
printk("\n");
}

(*call)();

msg = NULL;
if (preempt_count() != count) {
msg = "preemption imbalance";
preempt_count() = count;
}
if (irqs_disabled()) {
msg = "disabled interrupts";
local_irq_enable();
}
if (msg) {
printk(KERN_WARNING "error in initcall at 0x%p: "
"returned with %s\n", *call, msg);
}
}

/* Make sure there is no pending stuff from the initcall sequence */
flush_scheduled_work();
}
------------------------------------------------------------------------------------------------------
这个__initcall_start是在文件 arch/xxx/kernel/vmlinux.lds.S (其中的xxx 是你的体系结构的名称,例如i386)
这个文件是内核ld的时候使用的.其中定义了各个sectioin,看看就明白了。
在这个文件中有个.initcall.init, 代码如下:
------------------------------------------------------------------------------------------------------
__initcall_start = .;
.initcall.init : {
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}
------------------------------------------------------------------------------------------------------

这里有7个初始化的优先级,内核会按照这个优先级的顺序依次加载.
这些优先级是在文件include/linux/init.h 中定义的. 你注意一下宏 __define_initcall的实现就明白了.
相关代码如下:

#define __define_initcall(level,fn) \
static initcall_t __initcall_##fn __attribute_used__ \
__attribute__((__section__(".initcall" level ".init"))) = fn

#define core_initcall(fn) __define_initcall("1",fn)
#define postcore_initcall(fn) __define_initcall("2",fn)
#define arch_initcall(fn) __define_initcall("3",fn)
#define subsys_initcall(fn) __define_initcall("4",fn)
#define fs_initcall(fn) __define_initcall("5",fn)
#define device_initcall(fn) __define_initcall("6",fn)
#define late_initcall(fn) __define_initcall("7",fn)

我们可以看到,我们经常写的设备驱动程序中常用的module_init其实就是对应了优先级6:
#define __initcall(fn) device_initcall(fn)

#define module_init(x) __initcall(x);

文章出处:http://www.diybl.com/course/6_system/linux/Linuxjs/2008628/128990.html
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长沙到西昌。坐火车先从长沙到成都、成都东,再到西昌,哪个方便一些 S先生与P先生谜题的题面 为什么首都设在襄阳 改姓可以不随父母性吗 韩艺瑟怎么改姓? 纸、墨、笔、砚是中国传统的文房四宝,墨的使用最早在 [ ] A.商代后期... 想问下创维光伏E企赢模式有哪些优势,到底值不值得投资啊?有没有合作... 太平洋太享e保百万医疗值得入手吗?每年花多少钱? 爱e满分适合哪些人买?注意哪些问题? 太平洋太享e保百万医疗适合哪些人买?价格多少? ...的三极管C4793坏了,是电源启动管,想买又买不到,能用其他什么代替下啊... 来膺臣宰召的下一句是什么 送礼物能不能送闹钟? 秋葵汤多久比较合适 怎样使用运行中的cmd格式化c盘?5 cmd的重置C盘的命令! 如何在命令提示符里格式化C盘37 在DOS下用 NTFS 格式 格式化C盘命令 的命令 是什么...12 在CMD 下格式化磁盘的命令是什么56 苹果从邮箱无跳转怎么办 怎么强制修改第二次 ...状态就会消失吗?他一天没在线了,第二天我就看不到他状态了 如何强制二次修改 记得小时候夏天的一个下午,抬头突然看见天空一个很大很黑的圆圈,笼罩了... 怎么一年改两次 如何强制二次修改 电脑怎样同时登录两个636 如何强制二次修改 电脑怎么登录两个692 怎么强制修改第二次 Linux环境变量84 ...甲基-4-异恶唑甲腈的的上游原料和下游产品有哪些? ...3-(三氟甲基)苯基]-1,3,5-三嗪的的上游原料和下游产品有哪些... 精灵盛典无视一击是从什么装备中来? 精灵盛典优先会心减免还是优先会心一击 45乘45=2025,55乘55=3025,65乘65=4225,75乘75=多少?前面的题规律是 全球最好的十款越野车? 《伤寒论》中的方子里写的“桔梗三分”中的“分”这个单位是什么意思... 丹麦物理学家奥斯特发现了电流的磁效应,首次揭开了电与 () 的联系。 怎么在一年内修改两次 清单计价中屋面排水管按设计图示尺寸以长度计算,如果设计未标注尺寸,则... dq9 金属史莱姆剑怎么拿 ...50854—2013),屋面防水及其他工程量计算正确的是( )。 (2010年真题)根据《建设工程工程量清单计量规范》,有关分项工程工程量的... 屋面排水管清单项目的长度计算,有设计按设计,无设计时取()。_百度知 ... 雨水管算至结构标高还是建筑标高 一年内怎么修改第二次 一年改2次的办法 家用立式空调需要怎么保养 怎么在一年内修改两次