[转帖]Linux内核启动流程_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
11
每页帖数
101/2页12
返回列表
0
发起投票  发起投票 发新帖子
查看: 7701 | 回复: 10   主题: [转帖]Linux内核启动流程        上一篇   下一篇 
huang.wang
注册用户
等级:中将
经验:17623
发帖:407
精华:1
注册:1970-1-1
状态:离线
发送短消息息给huang.wang 加好友    发送短消息息给huang.wang 发消息
发表于: IP:您无权察看 2018-8-9 11:43:30 | [全部帖] [楼主帖] 楼主


本文转自CSDN cc243494926原创博客


本文以Linux3.14版本源码为例分析其启动流程。各版本启动代码略有不同,但核心流程与思想万变不离其宗。

内核映像被加载到内存并获得控制权之后,内核启动流程开始。通常,内核映像以压缩形式存储,并不是一个可以执行的内核。因此,内核阶段的首要工作是自解压内核映像。

内核编译生成vmliunx后,通常会对其进行压缩,得到zImage(小内核,小于512KB)或bzImage(大内核,大于512KB)。在它们的头部嵌有解压缩程序。

通过linux/arch/arm/boot/compressed目录下的Makefile寻找到vmlinux文件的链接脚本(vmlinux.lds),从中查找系统启动入口函数。

$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
   $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3) \
   $(bswapsdi2) FORCE
   @$(check_for_multiple_zreladdr)
   $(call if_changed,ld)
   @$(check_for_bad_syms)

vmlinux.lds(linux/arch/arm/kernel/vmlinux.lds)链接脚本开头内容

OUTPUT_ARCH(arm)
ENTRY(stext)
jiffies = jiffies_64;
SECTIONS
{



得到内核入口函数为 stext(linux/arch/arm/kernel/head.S)


内核引导阶段

ENTRY(stext)



bl__lookup_processor_type@ r5=procinfo r9=cpuid                             //处理器是否支持
movsr10, r5@ invalid processor (r5=0)?
 THUMB( iteq )@ force fixup-able long branch encoding
beq__error_p@ yes, error 'p'                           //不支持则打印错误信息
          。


bl__create_page_tables                                                       //创建页表

ldrr13, =__mmap_switched@ address to jump to after                 //保存MMU使能后跳转地址
@ mmu has been enabled
adrlr, BSYM(1f)@ return (PIC) address
movr8, r4@ set TTBR1 to swapper_pg_dir
 ARM(addpc, r10, #PROCINFO_INITFUNC)
 THUMB(addr12, r10, #PROCINFO_INITFUNC)
 THUMB(movpc, r12)
1:b__enable_mmu                        //使能MMU后跳转到__mmap_switched

查找标签__mmap_switched所在位置:/linux/arch/arm/kernel/head-common.S

__mmap_switched:

//保存设备信息、设备树及启动参数存储地址



b      start_kernel


内核初始化阶段

从start_kernel函数开始,内核进入C语言部分,完成内核的大部分初始化工作。

函数所在位置:/linux/init/Main.c

start_kernel涉及大量初始化工作,只例举重要的初始化工作。

asmlinkage void __init start_kernel(void)
{
……                                                                              //类型判断
smp_setup_processor_id();                                                         //smp相关,返回启动CPU号
……
local_irq_disable();                                                                   //关闭当前CPU中断
early_boot_irqs_disabled = true;

boot_cpu_init();
page_address_init();                                                            //初始化页地址
pr_notice("%s", linux_banner);                                                   //显示内核版本信息
setup_arch(&command_line);
mm_init_owner(&init_mm, &init_task);
mm_init_cpumask(&init_mm);
setup_command_line(command_line);
setup_nr_cpu_ids();
setup_per_cpu_areas();
smp_prepare_boot_cpu();
build_all_zonelists(NULL, NULL);
page_alloc_init();                                                                            //页内存申请初始化
pr_notice("Kernel command line: %s\n", boot_command_line);                                     //打印内核启动命令行参数
parse_early_param();
parse_args("Booting kernel", static_command_line, __start___param,
   __stop___param - __start___param,
   -1, -1, &unknown_bootoption);
……

sched_init();                                                                                    //进程调度器初始化

preempt_disable();                                                                                    //禁止内核抢占
if (WARN(!irqs_disabled(), "Interrupts were enabled *very* early, fixing it\n"))
local_irq_disable();                                                                      //检查关闭CPU中断
         
idr_init_cache();
rcu_init();
tick_nohz_init();
context_tracking_init();
radix_tree_init();

early_irq_init();
init_IRQ();
tick_init();
init_timers();
hrtimers_init();
softirq_init();
timekeeping_init();
time_init();
sched_clock_postinit();
perf_event_init();
profile_init();
call_function_init();
WARN(!irqs_disabled(), "Interrupts were enabled early\n");
early_boot_irqs_disabled = false;
local_irq_enable();                                                                            //本地中断可以使用了
kmem_cache_init_late();

console_init();                                                                            //初始化控制台,可以使用printk了
if (panic_later)
panic("Too many boot %s vars at `%s'", panic_later,
      panic_param);
lockdep_info();

locking_selftest();
#ifdef CONFIG_BLK_DEV_INITRD
if (initrd_start && !initrd_below_start_ok &&
    page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.\n",
    page_to_pfn(virt_to_page((void *)initrd_start)),
    min_low_pfn);
initrd_start = 0;
}
#endif
page_cgroup_init();
debug_objects_mem_init();
kmemleak_init();
setup_per_cpu_pageset();
numa_policy_init();
if (late_time_init)
late_time_init();
sched_clock_init();
calibrate_delay();
pidmap_init();
anon_vma_init();
acpi_early_init();
#ifdef CONFIG_X86
if (efi_enabled(EFI_RUNTIME_SERVICES))
efi_enter_virtual_mode();
#endif
#ifdef CONFIG_X86_ESPFIX64

init_espfix_bsp();
#endif
thread_info_cache_init();
cred_init();
fork_init(totalram_pages);                                                             //初始化fork
proc_caches_init();
buffer_init();
key_init();
security_init();
dbg_late_init();
vfs_caches_init(totalram_pages);                                                      //虚拟文件系统初始化
signals_init();

page_writeback_init();
#ifdef CONFIG_PROC_FS
proc_root_init();
#endif
cgroup_init();
cpuset_init();
taskstats_init_early();
delayacct_init();
check_bugs();
sfi_init_late();
if (efi_enabled(EFI_RUNTIME_SERVICES)) {
efi_late_init();
efi_free_boot_services();
}
ftrace_init();

rest_init();
}

函数最后调用rest_init()函数


static noinline void __init_refok rest_init(void)
{
int pid;
rcu_scheduler_starting();

kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);                             //创建kernel_init进程
numa_default_policy();
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
rcu_read_lock();
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
rcu_read_unlock();
complete(&kthreadd_done);

init_idle_bootup_task(current);
schedule_preempt_disabled();

//cpu_idle就是在系统闲置时用来降低电力的使用和减少热的产生的空转函数,函数至此不再返回,其余工作从kernel_init进程处发起
cpu_startup_entry(CPUHP_ONLINE);
}

kernel_init函数将完成设备驱动程序的初始化,并调用init_post函数启动用户进程

部分书籍介绍的内核启动流程基于经典的2.6版本,kernel_init函数还会调用init_post函数专门负责_init进程的启动,现版本已经被整合到了一起。

static int __ref kernel_init(void *unused)
{
int ret;
kernel_init_freeable();                 //该函数中完成smp开启  驱动初始化 共享内存初始化等工作

async_synchronize_full();
free_initmem();                         //初始化尾声,清除内存无用数据
mark_rodata_ro();
system_state = SYSTEM_RUNNING;
numa_default_policy();
flush_delayed_fput();
if (ramdisk_execute_command) {
ret = run_init_process(ramdisk_execute_command);
if (!ret)
return 0;
pr_err("Failed to execute %s (error %d)\n",
       ramdisk_execute_command, ret);
}

if (execute_command) {
ret = run_init_process(execute_command);
if (!ret)
return 0;
pr_err("Failed to execute %s (error %d).  Attempting defaults...\n",
execute_command, ret);
}
if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
return 0;
panic("No working init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");
}

到此,内核初始化已经接近尾声,所有的初始化函数都已经调用,因此free_initmem函数可以舍弃内存的__init_begin至__init_end之间的数据。

当内核被引导并进行初始化后,内核启动了自己的第一个用户空间应用程序_init,这是调用的第一个使用标准C库编译的程序,其进程编号时钟为1.

_init负责出发其他必须的进程,以使系统进入整体可用的状态。


以下为内核启动流程图:

20170315225401860.png


该贴被huang.wang编辑于2018-8-9 11:44:57


我超级酷,但是如果你回复我的话我可以不酷那么一小会儿。


——来自logo.png


赞(0)    操作        顶端 
marsillpost
注册用户
等级:新兵
经验:71
发帖:0
精华:0
注册:2023-10-10
状态:离线
发送短消息息给marsillpost 加好友    发送短消息息给marsillpost 发消息
发表于: IP:您无权察看 2023-10-10 21:23:02 | [全部帖] [楼主帖] 2  楼

Also, currently only Cathay Pacific is open at the counters at Hong Kong Station, and Kowloon Station is still not available for check-in and luggage delivery; the situation of other airlines will be announced in the future.


Perth best escorts



赞(0)    操作        顶端 
sushantsingh2233
注册用户
等级:上尉
经验:651
发帖:0
精华:0
注册:2025-6-18
状态:离线
发送短消息息给sushantsingh2233 加好友    发送短消息息给sushantsingh2233 发消息
发表于: IP:您无权察看 2025-6-18 17:31:22 | [全部帖] [楼主帖] 3  楼

HP Service Center in Malad | HP Service Center in Virar | HP Service Center in Sion | HP Service Center in Kalyan | HP Service Center in Nariman Point | HP Service Center in Dharavi | HP Service Center in JB Nagar | HP Service Center in Lamington Road | HP Service Center in Dahisar | HP Service Center in Antop Hill | HP Service Center in Jankalyan Nagar | HP Service Center in Anushakti Nagar | HP Service Center in Marol | HP Service Center in Ghatkopar | HP Service Center in Churchgate | HP Service Center in BKC Mumbai | HP Service Center in Colaba | HP Service Center in Mumbai central | HP Service Center in Jogeshwari | HP Service Center in Airoli | HP Service Center in Bhandup | HP Service Center in Santacruz | HP Service Center in Kalbadevi | HP Service Center in Grant Road | HP Service Center in Goregaon | HP Service Center in Irla | HP Service Center in Oshiwara | HP Service Center in Chembur | HP Service Center in Marine Lines | HP Service Center in Andheri West | HP Service Center in Matunga | HP Service Center in Vile Parle | HP Service Center in Juhu | HP Service Center in Chakala | HP Service Center in Kala Ghoda | HP Service Center in Khar | HP Service Center in Mulund | HP Service Center in Kandivali | HP Service Center in Lokhandwala | HP Service Center in Byculla | HP Service Center in Powai | HP Service Center in Charni Road | HP Service Center in Worli | HP Service Center in Andheri East | HP Service Center in Fort | HP Service Center in Navi Mumbai | HP Service Center in Borivali | HP Service Center in Thane | HP Service Center in Panvel | HP Service Center in Sakinaka | HP Service Center in Vasai | HP Service Center in Mira Road | HP Service Center in Kurla | HP Service Center in Bandra | HP Service Center in Bhayandar | HP Service Center in Vashi | HP Service Center in Dadar | HP Service Center in Chaupati | HP Service Center in CST | HP Service Center in Geeta Nagar | HP Service Center in Amrut Nagar HP Service Center in Antop Hill HP Service Center in Balkum Pada HP Service Center in Bandra HP Service Center in Bhakti Park HP Service Center in bhandup HP Service Center in BKC HP Service Center in byculla HP Service Center in Chakala HP Service Center in Charni Road HP Service Center in Chembur HP Service Center in Church Gate HP Service Center in colaba HP Service Center in dadar HP Service Center in Dahisar HP Service Center in Dharavi HP Service Center in Fort Mumbai HP Service Center in Ghaktkopar HP Service Center in Ghodapdeo HP Service Center in Girgaon HP Service Center in Govandi HP Service Center in Grant Road HP Service Center in Hiranandani HP Service Center in JB Nagar HP Service Center in Jogeshwari HP Service Center in Juhu HP Service Center in Kala Ghoda HP Service Center in Kalbadevi HP Service Center in Kanjumarg | | HP Service Center in Kanyapada HP Service Center in kasarvadavali HP Service Center in Kashimira Mira Bhayandar HP Service Center in Kavesar Thane HP Service Center in Khar | | HP Service Center in Lamington Road HP Service Center in Lower Parel HP Service Center in Mahalakshmi HP Service Center in Mahim HP Service Center in Majiwada HP Service Center in Malabar Hill HP Service Center in Malvani HP Service Center in mankhurd HP Service Center in manpada HP Service Center in Marol HP Service Center in Matunga HP Service Center in Mazgaon HP Service Center in Mulund HP Service Center in Mumbai Central HP Service Center in Nariman Point HP Service Center in Naupada HP Service Center in Oshiwara HP Service Center in Patlipada HP Service Center in Pirojshanagar HP Service Center in Powai HP Service Center in Prayag Nagar HP Service Center in Sakinaka HP Service Center in Seven Bungalows HP Service Center in Trombay HP Service Center in Vartak Nagar HP Service Center in Versova HP Service Center in Vikhroli HP Service Center in Vile Parle HP Service Center in Wadala HP Service Center in Worli | HP Service Center in Chinchpokli | HP Service Center in Lalbaug | HP Service Center in Prabhadevi | HP Service Center in Pali Hill | HP Service Center in Vidyavihar | HP Service Center in Shivaji Nagar | HP Laptop Service Center in Gurgaon Acer Laptop Service Center In Mumbai



赞(0)    操作        顶端 
sushantsingh2233
注册用户
等级:上尉
经验:651
发帖:0
精华:0
注册:2025-6-18
状态:离线
发送短消息息给sushantsingh2233 加好友    发送短消息息给sushantsingh2233 发消息
发表于: IP:您无权察看 2025-6-18 17:44:26 | [全部帖] [楼主帖] 4  楼



赞(0)    操作        顶端 
sushantsingh2233
注册用户
等级:上尉
经验:651
发帖:0
精华:0
注册:2025-6-18
状态:离线
发送短消息息给sushantsingh2233 加好友    发送短消息息给sushantsingh2233 发消息
发表于: IP:您无权察看 2025-6-18 17:58:58 | [全部帖] [楼主帖] 5  楼



赞(0)    操作        顶端 
sushantsingh2233
注册用户
等级:上尉
经验:651
发帖:0
精华:0
注册:2025-6-18
状态:离线
发送短消息息给sushantsingh2233 加好友    发送短消息息给sushantsingh2233 发消息
发表于: IP:您无权察看 2025-6-18 18:02:33 | [全部帖] [楼主帖] 6  楼



赞(0)    操作        顶端 
sushantsingh2233
注册用户
等级:上尉
经验:651
发帖:0
精华:0
注册:2025-6-18
状态:离线
发送短消息息给sushantsingh2233 加好友    发送短消息息给sushantsingh2233 发消息
发表于: IP:您无权察看 2025-6-18 18:06:13 | [全部帖] [楼主帖] 7  楼



赞(0)    操作        顶端 
sushantsingh2233
注册用户
等级:上尉
经验:651
发帖:0
精华:0
注册:2025-6-18
状态:离线
发送短消息息给sushantsingh2233 加好友    发送短消息息给sushantsingh2233 发消息
发表于: IP:您无权察看 2025-6-18 18:30:19 | [全部帖] [楼主帖] 8  楼



赞(0)    操作        顶端 
sushantsingh2233
注册用户
等级:上尉
经验:651
发帖:0
精华:0
注册:2025-6-18
状态:离线
发送短消息息给sushantsingh2233 加好友    发送短消息息给sushantsingh2233 发消息
发表于: IP:您无权察看 2025-6-18 18:39:36 | [全部帖] [楼主帖] 9  楼



赞(0)    操作        顶端 
sushantsingh2233
注册用户
等级:上尉
经验:651
发帖:0
精华:0
注册:2025-6-18
状态:离线
发送短消息息给sushantsingh2233 加好友    发送短消息息给sushantsingh2233 发消息
发表于: IP:您无权察看 2025-6-18 18:46:37 | [全部帖] [楼主帖] 10  楼



赞(0)    操作        顶端 
总帖数
11
每页帖数
101/2页12
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论