(五)bootloader 启动 ucore os
Lab1 : bootloader 启动 ucore os
一、内容提要
x86启动顺序
C函数调用
gcc内联汇编(inline assembly)
x86-32下的中断处理
小结
二、x86启动顺序
寄存器初始值
第一条指令(CS=F000H, EIP=0000FFF0H)
实际地址是: Base + EIP
当CS被新值加载,则地址转换规则则将开始起作用
通常第一条指令是一条长跳转指令(这样CS和EIP都会跳转到BIOS代码中执行)
处于实模式的段
段选择子(segment selector):CS,DS,SS,........
偏移量(offset): EIP
从BIOS到Bootloader
BIOS 只加载 存储设备(比如软盘、硬盘、光盘,USB)上的第一个扇区( 主引导扇区 , Master Boot Record, or MBR)的 512字节 到内存的0x7c00.....[注: 扇区里的代码会完成后续的加载工作,这个扇区成为BootLoader]
然后跳转到 @0x7c00的第一条指令开始执行
bootloader做的事:
(从实模式切换到保护模式) 使能保护模式(protection mode) & 段机制(segment level protector)
从硬盘上读取 kernel in ELF 格式 的 ucore kernel(跟在MBR后面的扇区) 并放到内存中固定位置
跳转到 ucore OS 的入口点(entry point ) 执行, 这时控制权到了ucore OS中
段机制
段寄存器起指针作用, 指向 段描述符(存放段的起始地址和大小)
如:根据CS里面Index的值来找到uCore的起始地址和大小
段机制的(近似对等)映射关系简单, 限制是4G,段的起始地址从0开始, 分段机制弱化。(页机制实现)
页机制在段机制的基础上.
在段寄存器里会保存一块区域叫做段选择址(Index: 会查找在段描述符中的项.)
起始地址(基址) + EIP = 物理地址(没有页机制时,线性地址等同于物理地址)
段机制其实是一种映射关系
通过一个大数组(把各个段描述符装进去), 数组由操作系统建立的(全局描述符表(简称段表),GDT)(描述好段描述符表的一个大致的空间, 给出他的位置和大小)
内部寄存器GDTR保存相应地址,使得寄存器和GDT表建立关系,从而可以指向GDT大数组里面所对应的描述符.
基址(Base) 在什么地方(0), 段的Limit多大(4G) -- 实现简单的映射
段选择址
全局描述表
段描述符
指向全局描述符表起始地址GDTR的一个寄存器
使能保护模式(Enable)
使能保护模式, bootloader/OS 要设置 CR0(系统寄存器) 的bit 0 (PE)
段机制 (Segment-level protection ) 在保护模式下是自动使能的.
GDT里面每一项是一个段描述符,把相应的段的段寄存器设置为对应的Index,能够指向全局描述表GDT对应的 项(段描述符--指出了映射关系), 从而在使能的保护机制,使段机制正常工作.
加载ELF格式的ucore OS kernel
(五)bootloader 启动 ucore os的更多相关文章
- lab_1 清华大学ucore bootload启动ucore os(预备基础知识+实验过程)
实验1 :bootload启动ucore os 1.0实验内容: lab1中包含一个bootloader和一个OS.这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式 ...
- 操作系统(3)实验相关原理——bootloader启动uCore
x86启动顺序 CS+EIP决定启动地址. CS部分后面又4个0,相当于是左移了4位.总之就是要让CS左移4位之后加上EIP来得到要跳转的地址. 0x7c00地方开始的512字节的内容就是bootlo ...
- u-boot(五)内核启动
目录 u-boot(五)内核启动 概述 分区空间 内核文件格式 内核复制跳转 内核启动 机器ID 启动参数 (起始tag)setup_start_tag 内存设置 根文件系统,启动程序,串口设备 (结 ...
- ubuntu16.04下Hyperledger之搭建Fabric环境简单操作(五步启动e2e_cli)
如果你已经安装好go等工具.git及checkout相关代及下载相关镜像,您只需下面5步就能up e2e_cli~/go/src/github.com/hyperledger/fabric$ sudo ...
- bootloader启动代码init.s解析----IRQ中断处理函数
bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...
- 【Bootloader】bootloader启动过程分析
Boot Loader启动过程分析 一. Boot Loader的概念和功能 1.嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分: (1)引导加载程序: ...
- 嵌入式Linux驱动学习之路(五)u-boot启动流程分析
这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...
- 嵌入式Linux系统Bootloader启动调试技术(回想)
嵌入式系统搭建过程中,对于系统平台搭建project师最初的一步一般是移植Bootloader ,当然移植有几个级别,通常最常见的是參考的EVM 的硬件有了改动(如更改了FLASH ,更改了SDRAM ...
- 启动apache (OS 10022)提供了一个无效的參数。解决方式
今天 apache 突然启动不起来了,查看了一下错误日志发现了例如以下错误: [Tue Mar 17 11:27:32 2015] [crit] Parent: child process exite ...
随机推荐
- Vert.x简介
https://vertx.io/ https://vertx.io/download/ https://baike.baidu.com/item/Vert.x 近年来,移动网络.社交网络和电商的兴起 ...
- java中的equals和==
下面是我看别人博客和java API总结的 首先得明确一个概念就是: == 的用法 ==比较对象在内存中的地址是否相等.如是是两个基本数据类型变量的比较则比较的是这两个变量值是否相等,若是比较两个 ...
- Oracle 使用PDB 的情况下进行备份恢复的使用.
1. 关于directory: pdb 需要在container 上面创建directory才可以使用 CDB里面创建的directory是会无反应. 在PDB 里面创建: cmd 之后运行 set ...
- MyBatis是如何解决Sql注入的
转:[转]mybatis如何防止sql注入 java中预处理PrepareStatement为什么能起到防止SQL注入的作用??!! 一.SQL注入 sql注入大家都不陌生,是一种常见的攻击方式,攻击 ...
- verilog 数据格式
基数格式(通常为无符号数)[size]'base value size常量的位数 base数制o:8 b:2 d:10 h:16 https://wenku.baidu.com/view/f63daa ...
- Linux环境变量PATH
查看PATH:echo $PATH以添加mongodb server为列修改方法一:export PATH=/usr/local/mongodb/bin:$PATH//配置完后可以通过echo $PA ...
- BZOJ2959长跑——LCT+并查集(LCT动态维护边双连通分量)
题目描述 某校开展了同学们喜闻乐见的阳光长跑活动.为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上熙熙攘攘,摩肩接踵,盛况空前. 为 ...
- 简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理)
博弈论入门: 巴什博弈: 两个顶尖聪明的人在玩游戏,有一堆$n$个石子,每次每个人能取$[1,m]$个石子,不能拿的人输,请问先手与后手谁必败? 我们分类讨论一下这个问题: 当$n\le m$时,这时 ...
- BZOJ3524[Poi2014]Couriers——主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
- VMware Linux虚拟机yum源更换成国内阿里源
[虚拟机系统] Centos 6.8 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.163.com/ 更换yum源时请保证虚拟机和外网是 ...