全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

JOS的这部分boot相关的代码已经看了一阵子了,中间遇到了很多概念性障碍因此又增补了一些其他常识性知识的学习。现在,整理一下整个boot启动的过程。

首先是进行关中断,然后把各个段寄存器进行一下清零初始化。这里清零得借助一个数据寄存器,而数据寄存器本身的清零则是通过亦或来实现。

启动刚开始的过程,CPU的运行是在16bit的模式下运行的。从上面的分段信息以及相关的注释也是可以看出来的。

接下来,通过使能地址线的操作来实现寻址模式的切换。这期间,进行了一些外设的处理,也进行了从实模式向保护模式的切换。

进入到32bit的保护模式之下,设置了各个段寄存器之后,接下来就是向C语言接口的跳转了。这里用到的跳转接口是bootmain,而C语言中的main也应该是类似的机制。尤其是在嵌入式中,这个机制是一致的。

这样,整个bootmain的大概作用:先从文件系统的最开始读取数据,看看存储在这里的文件是否是ELF格式。如果不是,没法启动。如果是ELF格式,那么根据ELF中提供的信息排判断程序header的存储信息,并进行程序存储镜像的加载。如果不启动,会停在一个死循环上。然而这里的这个硬件操作是什么概念,暂且没有找到合理的解释。如果ELF以及程序header的一切信息加载顺利,会根据ELF header中指定的entry进入到OS服务。

读取程序数据段是通过读取硬盘的sector来实现的,读取的过程采用了比较简单的逐个sector读取的方式。效率可能不是很高,但是也可以说明OS的启动过程了。

合理用到的一个按照字节对齐的round down的算法,理解起来其实是很简单的。这里正好是一个取巧的做法,用了位操作。那么,是不是所有大小的SECSIZE都可以满足这样的算法呢?显然不是!通过最后的按位与操作,其实很容易分析的出来。只有SECSIZE所有的倍数最后几位都是SECSIZE的二进制状态的时候才能够使用这样的方法。至于sector本身的读取操作,太过于底层不去深究了。

关于这里bad的作用,其实可以通过上面的这种强制跳转来测试一下。但是,从测试结果看,至少是跟终端输出是没有什么太大关系的。如下是修改后的运行效果:

并看不到什么具体的信息。但是从指令信息看,应该是进行了硬件操作。由于这边是一个死循环的信息,我猜测大概率可能是一个定时器或者中断之类的禁用操作。后续的学习中,或许能够找到更多的信息来说明下,非常遗憾的是从目前的网络搜索来说暂时还没找到什么合理的说明。

1617_MIT 6.828 JOS boot代码分析相关推荐

  1. 1662_MIT 6.828 JOS check_page_free_list实现分析以及boot_alloc问题修复

    全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 继续尝试完善分析JOS的 ...

  2. ARM裸机篇---启动代码分析

    ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...

  3. s3c6410 uboot代码分析《一》

    来源:http://hi.baidu.com/__eabi/blog/item/be67533797bc73f014cecb49.html 以下用以记录uboot代码的分析过程,目标是s3c6410, ...

  4. u-boot分析之两阶段代码分析(三)

    目录 u-boot(三)启动文件 1,概述 2,uboot第一阶段代码分析: 汇编 2,uboot第二阶段代码分析 C:_start_armboot C:main_loop u-boot(三)启动文件 ...

  5. 浅谈:Spring Boot原理分析,切换内置web服务器,SpringBoot监听项目(使用springboot-admin),将springboot的项目打成war包

    浅谈:Spring Boot原理分析(更多细节解释在代码注释中) 通过@EnableAutoConfiguration注解加载Springboot内置的自动初始化类(加载什么类是配置在spring.f ...

  6. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)...

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  7. Android/Linux boot time分析优化

    如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...

  8. linux内存映射起始地址,内存初始化代码分析(三):创建系统内存地址映射

    内存初始化代码分析(三):创建系统内存地址映射 作者:linuxer 发布于:2016-11-24 12:08 分类:内存管理 一.前言 经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡, ...

  9. Linux SCSI设备容量打印代码分析

    探寻SCSI设备容量如何获取代码. 分析 8G USB转SD卡启动打印信息: sd 3:0:0:0: [sdb] 15523840 512-byte logical blocks: (7.94 GB/ ...

最新文章

  1. 寻找隐形冠军 支付宝、微信用得那么溜,可谁知道背后有一名“上海功臣
  2. 海门工业机器人_海门凹凸模压标机推荐-无锡胜宝机电
  3. hdu1754(简单线段树)
  4. mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
  5. [C1] 优化 C1FlexGrid 单元格边框
  6. GNUstep 运行gui程序
  7. 航天有关的计算机知识,这些关于神舟十二上的电脑硬核小知识,你知道吗?
  8. 论文编辑软件(论文抽屉) v5.5.0Word版
  9. PHP解决IE浏览器下载文件名乱码问题
  10. 【题解】【AcWing】149. 荷马史诗
  11. 补偿丰厚员工抢着被裁员?滴滴:不予回应
  12. python输入语句没有定义_【20200925】Python基本语法
  13. Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
  14. 利用python爬虫爬取斗鱼图片(简单详细)
  15. Hazelcast源码剖析之Eviction
  16. 80秒验证13亿个身份证号码,包含省市县验证
  17. matlab图像导数求积分_matlab微积分问题:导数、偏导数
  18. 萨克斯的最佳清洁办法
  19. AXI总线核心解读---基于官方文档
  20. ecshop和Ucenter 通信失败终极解决方法!(附带php5.3以上,出现其他问题解决方法)

热门文章

  1. 独自封装windows 10系统详细教程(四)
  2. Echarts主题更换
  3. 【linux】centos7下使用和客户端远程链接sybase
  4. linux环境配置git认证
  5. 基于“机器学习”智能聊天机器人---python实现(2)
  6. access日期如何增加年数_ACCESS支持的时间日期函数
  7. K8s强制删除命名空间
  8. 路尚中国集团2020全新启程,和路尚中国集团一起追梦前行吧!
  9. MindSpore Graph Learning
  10. Hijackthis浏览器劫持日志精解_网络安全日志,还我蓝色天空(转载)