以32位x86,bzImge为例

grub版本为0.97

1、计算机上电

2、0xFFFFFFF0

当cpu检测reset引脚上的信号后

便将指令指针寄存器的值设置为0xfff0

——INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986, Chapter 10

此时为实模式,cpu将执行物理地址0xFFFFFFF0处的指令

访址的时候,硬件将该地址映射到BIOS的ROM中

BIOS中的指令将MBR复制到物理地址0x7c00处,并跳转到该处执行

3、0x7C00

MBR中的指令由grub安装而来,为grub-0.97/stage1/stage1.S

stage1将stage2的第1部分grub-0.97/stage2/start.S(512字节)复制到物理地址0x8000处,并跳转到该处执行

stage2将剩余部分grub-0.97/stage2/asm.S复制到物理地址0x8200处,并跳转到该处执行

...

grub-0.97/stage2/boot.c——load_image()函数

将内核映像bzImage的setup部分复制到物理地址0x90000

vmlinux部分复制到物理地址0x100000处

随后跳转到0x90200处执行

4、0x90200

arch/x86/boot/heaer.S——_start => start_of_setup

检查准备实模式堆栈,bss段清0,随后调用arch/x86/boot/main.c——main()函数

main()中使用BIOS中断读取一些硬件信息,如内存信息等

最后调用arch/x86/boot/pm.c——go_to_protected_mode()函数

go_to_protected_mode()设置段描述符,随后调用arch/x86/boot/pmjump.S——protected_mode_jump()函数

protected_mode_jump()置cr0的PE位,开启保护模式

最后跳转到code32_start,对于bzImage即物理地址0x100000,grub复制的bzImage第2部分

5、0x100000

arch/x86/boot/compressed/head_32.S——startup_32

arch/x86/boot/compressed/misc.c——decompress_kernel()解压内核

解压完成后跳转到output

6、LOAD_PHYSICAL_ADDR

根据不同的配置,解压后的代码在物理内存中的起始位置亦不同

arch/x86/kernel/head_32.S——startup_32

设置页表,置cr0的PG位,开启分页

最后跳转到arch/x86/kernel/head32.c——i386_start_kernel()函数

i386_start_kernel()中最后调用start_kernel()

7、start_kernel()

init/main.c——start_kernel()

进入c代码部分

加载不同linux内核,Linux内核加载过程相关推荐

  1. Linux驱动之内核加载模块过程分析

    Linux内核支持动态的加载模块运行:比如insmod first_drv.ko,这样就可以将模块加载到内核所在空间供应用程序调用.现在简单描述下insmod first_drv.ko的过程 1.in ...

  2. u-boot的linux内核映像加载,基于U_Boot的Linux内核映像加载与引导功能实现.pdf

    基于U_Boot的Linux内核映像加载与引导功能实现 20 10 8 ( ) Aug . 2010 10 4 Journal of Langfang T eachers College( N atu ...

  3. Linux 2.6内核的编译步骤及模块的动态加载

    本文是基于2.6的内核,也建议各位可以先看一下<Linux内核设计与实现(第二版)>作为一个基础知识的铺垫.当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块 ...

  4. linux英伟达显卡内核不匹配,硬核观察|Linus 破例在 Linux 5.11 内核中允许英伟达显卡驱动加塞...

    Linus 破例在 Linux 5.11 内核中允许英伟达显卡驱动加塞 据 cnbeta 报道,曾因闭源驱动对英伟达爆粗口的 Linus Torvalds,刚刚宣布了 Linux 5.11 内核版本的 ...

  5. 一加5t内核linux,[ROM][9.0]xiaojiaMOD一加5t禅定录屏超多增强设置动态壁纸公测32

    20190504更新: 更新官方公测29版 状态栏虚拟按键更新 支持更多自定义按键功能(切换音乐等功能) Magisk管理器更新7.1.2 Magisk更新19.1 新增RetroMusic音乐播放器 ...

  6. 一加5t内核linux,[ROM][9.0]一加5T安卓P迈凯伦SmartBoost自定义信号居左自定义BETA25

    rom版本:9.0 适用机型:一加5t 20190227更新: 更新一加5beta26版 更新一加5Tbeta25版 更新magisk 18.2 root灵敏 修复上一版一加5导航栏调出来崩溃问题 修 ...

  7. linux设备和驱动加载的先后顺序

    点击打开链接 Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...

  8. usb升级linux固件,Linux USB驱动(4)---CY68013固件加载驱动

    CY68013的固件可以保存在主机上,当其被USB总线识别出来之后,可以通过驱动程序动态的加载USB固件,Linux内核中已经提供了完善的机制来加载设备的固件. 将需要加载的固件存放到/lib/fir ...

  9. c需要实现安装卸载Linux模块,Linux内核模块编译与加载

    Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用所需要的组件? 方法一: 把所有的组件都编译进内核文件,即Zlmage或bzlmage,但会导致两个问题:一是生成的内核文件过大:二是如 ...

  10. ubuntu linux开机启动自动加载ko驱动程序_一文讲透 CentOS 开机流程

    一.Linux开机流程: BIOS: (Basic Input Output System)基本输入输出系统,它是一组固化到计算机内主板上一个ROM芯片 上的程序,保存着计算机最重要的基本输入输出的程 ...

最新文章

  1. share extension 不显示_高亮显示系统日志应该用什么命令
  2. 运满满的技术架构演进之路
  3. 程序猿,该在一个公司呆多久?
  4. SparkSql之DataFrame操作
  5. 关于mybatis中type-aliases-package使用的几个问题
  6. 消息称Uber正洽谈出售旗下自动驾驶部门ATG给Aurora
  7. 2020年书法落款_快来排排2020鼠年书法落款时间表,收!
  8. uni-app 跨端开发注意事项
  9. 2010罗森伯格HDCS®综合布线分布线销商大会顺利召开
  10. ElementUI实现表单校验
  11. 2020谷歌服务助手_华为mate30没法用谷歌?新加坡网友实测如何越过官方限制!...
  12. 好用的开源软件_推荐_良心软件
  13. Java 堆排序(大根堆及小根堆)
  14. php基础知识速记,电气工程师5大背诵妙招速记基础知识
  15. Excel 表格数据去重
  16. BufferedImage类、Image类、Graphics类
  17. 《我叫MT》手游源码和资源下载
  18. 三星矫情,重温Galaxy S5发布会收买人心
  19. 苹果自带相册打马赛克_剪映app怎么给视频局部打马赛克
  20. 小重山 2022年4月22日

热门文章

  1. 阿里云推出业内首个云原生企业级数据湖解决方案:将在今年双11大规模应用
  2. 阿里云荣获可信云容器安全能力先进级认证, ACK/ACR为企业级安全护航
  3. 云原生五大趋势预测,K8s安卓化位列其一
  4. DRDS到MaxCompute(原ODPS)数据归档性能优化测试
  5. 关于增强学习你应该了解的五件事儿
  6. 基于TableStore的数据采集分析系统介绍 1
  7. 腾讯云连续四年排名中国音视频解决市场第一,头部厂商中RTC增速第一
  8. 雅虎、领英接连退出中国,GitHub 会受到影响吗?
  9. 三探云原生全景图,这次聊聊运行时层
  10. Spring 从入门到入土——AOP 就这么简单!| 原力计划