一、命令行

1. kexec -l $kpwd --append="$arg"

其中$kpwd =目标内核的路径

  $arg =传给内核的参数,与/proc/cmdline一致时表示重启现有内核

2. kexec -e

二、执行过程

1. kexec-tools执行过程

kexec 的main函数解析参数,kexec -l 解析为调用my_load函数。

my_load函数根据路径参数读取内核文件到kernel_buf中,然后执行通用函数file_type[i].load,mips下对应elf_mips_load。

elf_mips_load函数主要内容是解析elf格式的kernel文件,并将所有信息存放在info中,主要是对elf文件的ELF header, Program header table进行解析:

1) build_elf_exec_info(buf, len, &ehdr, 0) 根据header到解析elf文件到ehdr中;

2) elf_exec_load(&ehdr, info) 解析各段内容到info中,具体实现为调用add_segment()函数,与此同时给出了kernel的入口地址。

3) cmdline_buf中存放的是传给内核的参数,也需要用add_buffer添加进info内。

4) 删除源码中的device tree部分。

将kernel文件解析到info中之后,回到my_load函数进行一些检验等操作,然后调用kexec_load(info.entry,info.nr_segments, info.segment,info.kexec_flags),进行系统调用:syscall(__NR_kexec_load, entry, nr_segments, segments, flags)

2. kexec_load系统调用执行过程

内核在syscall_table.S,syscalls.h等内注册了kexec_load系统调用,宏展开后最终调用kernel/kexec.c文件的SYSCALL_DEFINE4(kexec_load...)函数。该函数主要功能就是把新的内核文件装入内存中。

kimage_alloc_init初始化内存分配,主要初始化入口信息,并使用copy_from_user函数把传入的内核数据拷贝到image内,然后分配一张控制页(control_code_page)。

接下来调用machine_kexec_prepare,这个函数回调之前注册过的loongson_kexec_prepare函数,该函数是对传入参数的类似bootloader的处理。

最主要的函数是kimage_load_segment,该函数把内核段打散成页,先调用alloc_pages分配一张内核页(在mips64中分配空间为0x8000 0000 0000 0000到

0xC000 0000 0000 0000共0x4000 0000 0000 0000大小的空间内),再调用kimage_add_page将该页加入到image->entry指向的内存区域,然后进行内核数据拷贝,循环直到所有页都分配完毕。

3. reboot执行过程

当执行kexec -e 时,进行reboot系统调用,并由kernel_kexec接管。该函数先进行重启之前例行操作,如kernel_restart_prepare, migrate_to_reboot_cpu,machine_shutdown等,最后是调用machine_kexec(kexec_image)进行kexec模式重启。

之前准备好的kernel被打散到内核内存中,这个函数将完成kernel的重定位,并且从image->start即entry开始执行。要做到这一点,该函数首先把entry的地址赋值给kexec_start_address,把存在image->head的地址赋给kexec_indirection_page,然后将一段内核重定位的汇编代码使用memcpy拷贝至control_code_page内,最后执行该函数即转入汇编执行。汇编代码以kexec_indirection_page为索引,负责将之前分配到内存的所有页面拷贝至目的内存中,最后一条跳转指令跳至kexec_start_address处执行。

kexec 内核快速启动流程分析的更多相关文章

  1. 超详细分析Bootloader到内核的启动流程(万字长文)

    @ 目录 Bootloader启动流程分析 Bootloader第一阶段的功能 硬件设备初始化 为加载 Bootloader的第二阶段代码准备RAM空间(初始化内存空间) 复制 Bootloader的 ...

  2. Uboot启动流程分析(转载)

    最近一段时间一直在做uboot移植相关的工作,需要将uboot-2016-7移植到单位设计的ARMv7的处理器上.正好元旦放假三天闲来无事,有段完整的时间来整理下最近的工作成果.之前在学习uboot时 ...

  3. ubuntu为什么没有/etc/inittab文件? 深究ubuntu的启动流程分析

    Linux 内核启动 init ,init进程ID是1,是所有进程的父进程,所有进程由它控制. Ubuntu 的启动由upstart控制,自9.10后不再使用/etc/event.d目录的配置文件,改 ...

  4. imx6 uboot启动流程分析

    参考http://blog.csdn.net/skyflying2012/article/details/25804209 这里以imx6平台为例,分析uboot启动流程对于任何程序,入口函数是在链接 ...

  5. Android5 Zygote 与 SystemServer 启动流程分析

    Android5 Zygote 与 SystemServer 启动流程分析 Android5 Zygote 与 SystemServer 启动流程分析 前言 zygote 进程 解析 zygoterc ...

  6. Uboot启动流程分析(三)

    1.前言 在前面的文章Uboot启动流程分析(二)中,链接如下: https://www.cnblogs.com/Cqlismy/p/12002764.html 已经对_main函数的整个大体调用流程 ...

  7. Uboot启动流程分析(一)

    1.前言 Linux系统的启动需要一个bootloader程序,该bootloader程序会先初始化DDR等外设,然后将Linux内核从flash中拷贝到DDR中,最后启动Linux内核,uboot的 ...

  8. Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  9. Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

随机推荐

  1. 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)

    记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...

  2. nohup 与 & 的区别

    nohup -- invoke a utility immune to hangups : 运行命令忽略挂起信号 & 是指后台运行: nohup 的功能和& 之间的功能并不相同.其中, ...

  3. 【原创】公司各个阶段 CTO 需要做什么?(下篇)

    假设一个公司发展有以下几个阶段: 0 :创始阶段: 0.5 :有产品但无管理阶段: 1 :经过 1年的发展初步稳定的阶段: 1+ :稳步发展阶段. 上一篇文章中,我们聊了公司在初创阶段,CTO 需要做 ...

  4. 【NOIP 2017】列队

    Description Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 n ...

  5. 【BZOJ1016】【JSOI2008】最小生成树计数

    Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...

  6. 12563 Jin Ge Jin Qu hao

    • Don’t sing a song more than once (including Jin Ge Jin Qu). • For each song of length t, either si ...

  7. [USACO 5.1.3]乐曲主题

    Description 我们用N(1 <= N <=5000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,每个数表示钢琴上的一个键.很不幸这种表示旋律的方法忽略了音符的 ...

  8. bzoj1934

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2406  Solved: 1498[Submit][ ...

  9. Unix系统的文件打开机构

    当打开一个文件时,建立用户与该文件的联系.其实质是将该文件在辅存中的有关目录信息.辅存i节点及相应的文件地址索引表拷贝到主存中.文件系统中管理这一方面的机构成为打开文件管理机构,简称打开文件机构. 打 ...

  10. 如何彻底删除mysql

    MySQL的卸载确实很让人头疼,很多时候都无法彻底卸载干净,这样会导致我们无法重新安装新的MySQL. 下面介绍,在Windows10系统下,如何彻底删除卸载MySQL... 1>停止MySQL ...