arch/x86/boot/header.S

执行_start,第274行:

.global _start

_start:

然后跳转执行start_of_setup,准备实模式建立堆栈,BSS段清0,为下步C语言执行建立环境。

start_of_setup:

然后跳转到C代码执行main:

# Jump to C code (should not return)

calll main

arch/x86/boot/main.c

执行main函数:

void main(void)

maim中使用BIOS中断读取一些硬件信息,如内存信息等。

main函数最后,再执行go_to_protected_mode函数。

arch/x86/boot/pm.c

执行go_to_protected_mode函数。

void go_to_protected_mode(void)

禁用中断,开启20位以上的地址线,设置保护模式,设置全局描述表。

函数最后执行protected_mode_jump

arch/x86/boot/pmjump.S

执行protected_mode_jump:

GLOBAL(protected_mode_jump)

该段开始的.code16指令,表示这段代码依然是16位的实模式代码。使能CR0寄存器中的PE(Protection Enable)位,进入32位保护模式。建立32位的堆栈,清除寄存器以允许将来扩展到32位引导协议。

跳转到了code32_start地址处执行。

arch/x86/boot/compressed/head_32.S

执行startup_32:

__HEAD

ENTRY(startup_32)

执行过程,调用了efi_main

执行到,解压内核

call decompress_kernel

arch/x86/boot/compressed/misc.c

执行decompress_kernel函数。

asmlinkage void decompress_kernel

会输出打印Decompressing Linux…字样。

解压完成后跳转到output。

/arch/x86/kernel/head_32.S

进入到第88行,开始执行

__HEAD

ENTRY(startup_32)

执行到第454行,跳转到i386_start_kernel函数。

jmp *(initial_code)

/arch/x86/kernel/head32.c

执行i386_start_kernel函数。此函数最后调用start_kernel函数。

/init/main.c

执行start_kernel函数。开始启动内核。

参考链接:

https://blog.csdn.net/jn1158359135/article/details/7436211

https://www.cnblogs.com/long123king/p/3545991.html

http://blog.chinaunix.net/uid-1701789-id-148056.html

linux内核启动流程x86,linux内核-x86_32位内核启动流程相关推荐

  1. linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...

    尝试测试时是否允许访问跨越x86中零边界的内存?在Linux的用户空间中,我编写了一个32位测试程序,该程序试图映射32位虚拟地址空间的低和高页. 之后echo 0 | sudo tee /proc/ ...

  2. superIO在Linux下的设备,X86 Linux ITE SuperIO GPIO Control

    Superio概述 ​ Super I/O芯片也叫I/O芯片.在486以上档次的主板上都有I/O控制电路.因为在南桥这样的高速设备和串行.并行接口.软盘驱动器及键盘鼠标等大量低速设备之间必定存在资源的 ...

  3. linux是x64还是x86,Linux x86和x64的区别

    0x01:寄存器分配的不同 (1)64位有16个寄存器,32位只有8个.但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _.e开头的寄存器命名依然可以直接运用于 ...

  4. linux查看硬盘命令 ok,linux查看硬件信息大全

    1, 主板信息 .查看主板的序列号 -------------------------------------------------- #使用命令 dmidecode | grep -i 'seri ...

  5. linux hadoop etc目录,题目Linux平台下Hadoop的安装配置

    1Linux平台下Hadoop的安装配置 以下操作均是在虚拟机VWMare10.0平台上安装ubuntu12.04实现.首先要在ubuntu下穿件Hadoop用户. Ubuntulinux查看系统版本 ...

  6. AIX 64位内核与32位内核区别

    Q:怎么确定机器会运行 64 位内核?  A:运行 64 位内核要求 64 位硬件.对于 AIX 5.2,所有 IBM eServer pSeries 64 位硬件都能运行 64 位或 32 位内核. ...

  7. 1g的树莓派4b能做什么_树莓派4B(Raspbian)切换64位内核+简单性能测试

    首先说明两点: 1.目前来看来看(20200108测试,基于Raspbian 2019-09-26),是没有什么卵用的,切换之后性能不增反降,且软件兼容性不能得到保证. 2.教程来源于贴吧大佬,感谢大 ...

  8. U-Boot启动流程(Linux内核)的分析

    http://www.360doc.com/content/12/0816/10/7775902_230452499.shtml     前面一段时间一直在移植U-Boot,Linux内核和构建根文件 ...

  9. U-Boot启动流程(Linux内核)的分析(写得好)

    前面一段时间一直在移植U-Boot,Linux内核和构建根文件系统,其中有些地方还不是很明白,现在回过头来,理解一下U-boot的启动流程,以及 u-Boot是如何加载引导内核启动的.这里的分析也都是 ...

最新文章

  1. 在Linux系统下如何运行notes客户端
  2. nodejs新建服务器
  3. 记得5年前左右的时候,IT这块刚好处于最火专业之一!至今为止,依旧很多人选择计算机!由于女生也很多选择这块,所以给很多公司带来了福利啊!以前一个互联网公司女生少的可怜啊!可随着IT这块人员的进入,竞争
  4. VTK:可视化之AssignCellColorsFromLUT
  5. 学习笔记(33):Python网络编程并发编程-进程池线程池
  6. 在 Centos7 用Jexus服务器 运行.Net Core 只需几步
  7. Oracle安全漏洞2016.10报告
  8. 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写
  9. MongoDB安装问题
  10. v​n​c​服​务​​安​装​与配置
  11. 硬盘IDE和AHCI模式的区别
  12. 【码上实战】【立体匹配系列】经典SGM:(3)代价聚合
  13. STM32——LCD液晶显示
  14. 网页游戏打击感实施要点
  15. ubantu apt命令失败
  16. 关于locale的设定
  17. 技术分享:用JS实现的3D海浪涌动特效
  18. 赵小楼《天道》《遥远的救世主》深度解析(81)一个不愿躺着对话的女人,应给与绝对尊严,这符合强势文化范畴
  19. SkeyeRTSPLive传统视频监控互联网+实现利器解决方案
  20. 2345浏览器还算厚道

热门文章

  1. Pytorch 中 matmul 广播
  2. 【LeetCode】3月26日打卡-Day11
  3. 动态代理之: com.sun.proxy.$Proxy0 cannot be cast to 问题
  4. 第21条:用函数对象表示策略
  5. 每天一个Linux命令(17)--whereis命令
  6. 表单校验---struts2
  7. Java魔法堂:初探MessageFormat.format和ChoiceFormat
  8. 没有人能阻止程序员将电脑上的一切搬到网页上
  9. HDU1878-欧拉回路(入门题+并查集)
  10. ASP.NET MVC 最佳开发实践(1)