首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux从头学09:x86 处理器如何进行-层层的内存保护?

实模式:bootloader 为程序计算段的基地址 保护模式bootloader 为自己创建段描述符 确定 GDT 的地址 创建代码段的描述符 创建数据段的描述符 创建栈段的描述符 段描述符是如何确保段的安全的...保护模式与实模式最本质的区别就是:保护模式使用了全局描述符表,用来保存每一个程序(bootloader,操作系统,应用程序)使用到的每个段信息:开始地址,长度,以及其他一些保护参数。...这篇文章,我们来看一下 bootloader 是如何来进行自我进化到保护模式的,然后深入看一下保护模式是如何对内存进行安全保护的。...保护模式bootloader 为自己创建段描述符 bootloader 从 BIOS 接管系统之后,刚开始是运行在实模式下的。...书中直接把 x86 处理器中实模式和保护模式的寻址方式作为结论告诉我们了,但是并没有具体的讲解其中的原理。 如果把之前的这几篇文章都理解了,再去看 Linux 内核的相关书籍,就不会那么吃力了。

81630

操作系统启动顺序bios在哪里寻址机制bootloader结构建立段机制使能保护模式

概述 在这里以x86的处理器为例 机器在启动的时候会执行第一条指令。这条指令会去执行bios,控制权交给bios。...bios完成硬件的质检,然后bootloader从硬盘读到内存中,执行bootloader,并将控制权交给bootloader bootloader负责使能保护模式、建立段机制以及加载操作系统,然后控制权交给操作系统...然后bootloader加载到内存中的0x7c00,然后跳转到0x7c00执行。...bootloader bootloader要完成使能保护模式(实模式——>保护模式)、建立段机制以及加载操作系统 bootloader结构 bootloader在硬盘中的第一个扇区也叫主引导扇区,一个扇区是...使能保护模式 CR0寄存器(control 0 register控制寄存器),的第0位设为1,这样就开启了保护模式

1.1K100
您找到你想要的搜索结果了吗?
是的
没有找到

Linux从头学10:三级跳过程详解-从 bootloader 到 操作系统,再到应用程序

bootloader 跳转到操作系统 在上一篇文章中,讨论了 bootloader 在进入保护模式之后,在地址 0x0001_0000 处创建了全局描述符表(GDT),表中创建了 3 个段描述符:...那么在保护模式下呢,操作系统需要的就不是段的基地址了,而是要获取到每一个段的描述符才行。...,好处如下: 当从 bootloader 跳入到操作系统的入口地址时,需要告诉处理器两件事情: 代码段的索引号; 代码的入口地址; 因此,把入口地址和索引号放在一起,有助于 bootloader 直接使用跳转语句...既然是保护模式,那么操作系统就承担起重要的职责:保护系统不会受到每一个应用程序的恶意破坏!...在 Linux 系统中,系统调用是通过中断来实现的,在中断处理器程序中,再通过一个寄存器来标识:当前应用程序想调用哪一个系统函数,也就是说:每一个系统函数都有一个固定的数字编号。

49750

ucoreOS_lab1 实验报告

段描述符里的Base Address和EIP相加而得到线性地址。 如何使能和进入保护模式 开启A20,初始化gdt后,控制寄存器CR0的PE(bit0)置为1即可。...movl %cr0, %eax orl 0x1, %eax movl %eax, %cr0 bootloader进入保护模式的过程 * bootloader开始运行在实模式,物理地址为0x7c00...段寄存器,堆栈指针,便可以进入c程序bootmain 练习4:分析bootloader加载ELF格式的OS的过程 进入保护模式之后,Bootloader 需要干的很重要的一件事就是加载 ELF 文件。...它需要完成如下的两步操作: bootloader如何读取硬盘扇区的 bootloader是如何加载ELF格式的OS 执行完bootasm.S后,系统进入保护模式, 进行bootmain.c开始加载OS...如何读取硬盘扇区的 bootloader是如何加载ELF格式的OS bootloader如何读取硬盘扇区的 * bootloader进入保护模式并载入c程序bootmain * bootmain中

1.6K20

写一个Loader引导加载程序

Loader程序的功能 Loader程序的主线功能就是检测硬件信息、切换处理器模式、向内核传递数据。...然后我们的loader需要把处理器换到保护模式,这样就有了32位的寻址空间。最终再切换到IA-32e模式(长模式),获得64位的寻址空间。...大致流程如下 屏蔽外部中断 加载GDT的基地址和长度到GDTR寄存器 置位CR0的PE标志位 执行远跳转,切换到保护模式的代码段(代码段寄存器更新为保护模式) 重新加载数据段选择子,或使用jmp/call...页目录的物理基地址加载到CR3中 置位IA32_EFER寄存器的LME标志位,开启IA-32e模式 置位CR0的PG标志位,开启分页机制,此时处理器会自动置位IA32_EFER寄存器的LMA标志位 最后一个远跳转指令...,跳转到内核程序去执行,就成功处理器换到IA-32e模式了。

61020

xv6 启动理论部分

CR0寄存器PE位置1 CR0 寄存器 PE 位置 1,表进入保护模式 分页机制 x86结构下分段是必须的,分页不是必须的,GDTR GDT 段寄存器等等这些硬件设施和数据结构就是拿来段式管理的。...Bootloader Bootloader,操作系统引导程序,操作系统加载器,不论怎么叫,它的主要作用就是操作系统加载到内存里面。操作系统也是一个程序,需要加载到内存里面才能运行。...多处理器启动过程大致分为以下几个大步骤,这里简单看看,实现时细说: BIOS 启动 BSP,流程与上述讲的 BIOS-MBR-bootloader-OS 差不多 BSP 从 MP Configuration...Table 中获取多处理器的的配置信息 BSP 启动 APs,通过发送 INIT-SIPI-SIPI 消息给 APs APs 启动,各个 APs 处理器要像 BSP 一样建立自己的一些机制,比如保护模式...,分页,中断等等 先简要说下第四点,要明确一点:每个处理器都有自己的一套寄存器,不光是通用的那几个寄存器,像是一些 GDTR IDTR 等等都是,所以每个处理器都要对自己的寄存器初始化,设置其值,建立属于自己的一些机制比如说保护模式

22300

《笨开发学习操作系统》1启动

没错,其实操作系统的启动过程你需要记住这两个画面,今天你就能通过下面的学习原有的这两幅画面串起来了。 前置知识点 首先来标记一些你需要了解的基本术语和概念,方便我们后面的描述和讨论。...保护模式 (Protected Mode) CPU 的一种工作模式,有以下特点: 对指令及其访问的资源进行控制 寻址空间变大 区分了各个特权级 总之,在保护模式下,权限收拢,对访问进行了严格控制,但是寻址空间变大...第二阶段 然后加载硬盘的第一个扇区 512 字节,也就是 MBR ,然后运行启动管理器 BootLoader ,也就是我们说的 GRUB,此时控制权交给了 GRUB 。...此时 CPU 的工作模式从 实模式 切换到保护模式 接下来用户可以通过 GRUB 来选择需要启动的操作系统,这里我们选择 Linux,至此就进入了第三阶段。...参考链接 阮一峰 - 计算机是如何启动的 为什么需要 GRUB why do we need grub bootloader? 维基百科 - GRUB 计算机系统是如何启动的?

52910

操作系统(3)实验相关原理——bootloader启动uCore

0x7c00地方开始的512字节的内容就是bootloader。这么做的原因是BIOS只能加载一个扇区,所以只能通过bootloader来加载系统。...GDT由Bootloader建立。CPU内部的GDTR这个寄存器用来保存GDT。uCore中基址都设定为零,段长度都设定为4G。...最后要使能保护模式,最终进入保护模式。搞这么多,GDT就是为了保证段机制在进入保护模式之后还是可以正常工作。 解决了之后就可以开始加载uCore OS。...最后就是cr0变量的内容写回到cr0寄存器(首先将变量cr0给一个寄存器,然后寄存器的值给到cr0寄存器)。下面的就是生成的对应的汇编代码。...油用户态切换到内核态变化的时候: 注意红框中的SS和ESP,这是用来指明用户态下使用的栈的地址,即中断前后不是使用同一个栈。

70730

【Android 逆向】ARM CPU 架构体系 ( ARM 处理器工作模式 | ARM 架构模型 )

文章目录 一、ARM 处理器工作模式 二、ARM 架构模型 一、ARM 处理器工作模式 ---- 参考 【嵌入式开发】ARM 处理器工作模式 及 修改方法 ( 处理器模式 | 设置处理器模式 | 程序状态字寄存器...CPSR SPSR | 模式设置代码编写 | 设置 svc 模式 ) 博客 , ARM 处理器有 7 种工作模式 ; ARM 处理器的 七种 工作模式 : 1.User ( 用户模式 usr )...fiq ) : 该模式下支持数据的高速传输 ; 3.IRQ ( 普通中断模式 irq ) : 该模式常用于处理普通的中断 ; 4.Supervisor ( 管理模式 svc ) : 操作系统使用的一种保护模式..., 本节 BootLoader 就是需要设置这种 svc 模式; 5.Abort ( 终止模式 abt ) : 实现虚拟内存 和 存储器保护 ; 6.Undefined ( 未定义模式 und ) :...硬件协处理器 的 软件仿真支持, 当执行的指令***处理器不支持***, 那么会进入该模式; 7.System ( 系统模式 ) : 该模式用于运行具有特权的操作系统任务, ARMv4 以上的架构才有

1.7K10

操作系统学习之BIOS

在x86架构的机器中,有一块ROM,里面存放了BIOS程序,BIOS程序就是开机自检程序,初始化内存控制器,中断控制器,设置中断向量等,系统软硬件带到一个合适的状态,为操作系统内核准备环境...在ARM架构中没有BIOS,但是得自己写bootloaderbootloader一般存放在flash内,起始地址一般为0x00000000。下面看一下x86架构启动方式。      ...80386及以上机器都是32位机器,为了使系统内存连续,第一条指令存放的地址不再是0xFFFF0,而是0xFFFFFFF0,我们知道386机器分为保护模式和实模式,实模式下只能访问1MB内存,保护模式下开启...做完自检和初始化后,会选择一个启动设备(硬盘,软盘,u盘,光盘),并且读取该设备第一扇区(512字节)的内容到内存一个特定地址0x7C00,然后会跳转到这个地址继续执行,一般这个地址存放的是操作系统的bootloader

83620

Android 面试必备 - 系统、App、Activity 启动过程

一、启动BootLoader Android 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。...当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。...二、加载系统内核 Linux内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。...当BootLoader装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。...安装时把 apk文件复制到此目录 data/data ---------------存放应用程序的数据 data/dalvik-cache--------apk中的dex文件安装到dalvik-cache

1.3K20

逆向工程——汇编基础

处理器执行时从这个寄存器指向的段(实模式)或内存(保护模式)中获取指令。除了跳转或其他分支指令外,你无法修改这个寄存器的内容。 DS 数据段 DS,数据段,或数据选择器。...其次,在我们的bootloader设计中,涉及到了从实模式到保护模式的处理,我们的操作系统功能(比 如分页机制)是建立在Intel 80386的保护模式上来设计的。...为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。 【保护模式】物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。...####64位奔腾4处理器工作模式 事实上,现在的64位奔腾4处理器,拥有三种基本模式和一种扩展模式, 基本模式: 保护模式:纯32位保护执行环境。 实模式:纯16位无保护执行环境。...2)64位模式:在该模式下,处理器完全执行64位指令,使用64位地址空间和64操作数,运行16,32位程序必须切换到兼容模式。 IA-32e子模式的切换完全基于代码段寄存器。

1.3K10

【嵌入式开发】ARM 处理器工作模式 及 修改方法 ( 处理器模式 | 设置处理器模式 | 程序状态字寄存器 CPSR SPSR | 模式设置代码编写 | 设置 svc 模式 )

该模式下支持数据的高速传输 ; 3.IRQ ( 普通中断模式 irq ) : 该模式常用于处理普通的中断 ; 4.Supervisor ( 管理模式 svc ) : 操作系统使用的一种保护模式 ,...本节 BootLoader 就是需要设置这种 svc 模式; 5.Abort ( 终止模式 abt ) : 实现虚拟内存 和 存储器保护 ; 6.Undefined ( 未定义模式 und ) : 硬件协处理器...异常; 2.IRQ ( 普通中断模式 irq ) : 该模式常用于处理普通的中断 , 对应异常类型 为 普通中断 异常 ; 3.Supervisor ( 管理模式 svc ) : 操作系统使用的一种保护模式..., 本节 BootLoader 就是需要设置这种 svc 模式, 对应异常类型 为 Reset 和 软中断 异常 ; 4.Abort ( 终止模式 abt ) : 实现虚拟内存 和 存储器保护 ,...; 3.异常处理 : 当异常发生的时候, 也会修改处理器的工作模式 ; 4.BootLoader 工作模式 : BootLoader 工作在 svc 模式 下, 该模式比较高级, 可以 访问较多的寄存器资源

2.8K40

「linux」物理地址,虚拟地址,内存管理,逻辑地址之间的关系

虚拟地址: 虚拟地址是CPU保护模式下的一个概念,保护模式是80286系列和之后的x86兼容CPU操作模式,在CPU引导完操作系统内核后,操作系统内核会进入一种CPU保护模式,也叫虚拟内存管理,在这之后的程序在运行时都处于虚拟内存当中...现在操作系统运行在保护模式下即便知道其他进程的物理地址也不允许向其写入!但是可以通过操作系统留下的后门函数获取该进程上的虚拟地址空间所有控制权限并写入指定数据,详细会在反汇编编程中教给大家! 2....在进入虚拟模式之前CPU以及BootloaderBootLoader是在操作系统内核运行之前运行。...一般操作系统需要维护两个段描述表:GDT(全局描述符表GDT(GlobalDescriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置...,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者们提供了一个寄存器GDTR用来存放GDT的入口地址,程序员GDT设定在内存中某个位置之后,可以通过LGDT指令GDT的入口地址装入此寄存器

3K00

虚拟化与云计算硬核技术内幕 (6) —— 妇女能顶半边天

在上一期《特权关进笼子》中,我们提到,由于操作系统内核具有访问所有软硬件资源的特权,为了避免特权被滥用,工程师们虚拟机上的操作系统关进了ring1的笼子,不允许它在ring0中为所欲为。...VMX从体系架构层面正视了虚拟机的存在,定义了两种软件程序: VMM(Virtual Machine Monitors),在VMM中可以真正地访问所有的处理器资源和其他硬件资源,如物理内存、中断资源和...那么,怎么样可以让处理器在VMX Root和VMX Non-root模式之间切换呢?...VMX Root切换到VMX Non-root需要在保护模式的ring0下执行VM Entry(否则会导致General Protection异常),而虚拟机中的一些事件也会导致VM Exit,退回到VMM...我们将在下一期中解密这一

34730

FPGA系统性学习笔记连载_Day4 Xilinx ZYNQ7000系列 PS、PL、AXI 、启动流程基本概念篇

三、PS 和 PL 互联技术 3.1、ZYNQ 作为首款高性能 ARM Cortex-A9 系列处理器与高性能 FPGA 在单芯片内紧密结合的产品,为了实现 ARM 处理器和 FPGA 之间的高速通信和数据交互...3.2、发挥 ARM 处理器和 FPGA的性能优势,需要设计高效的片内高性能处理器与 FPGA 之间的互联通路。...Second Stage Bootloader (Optional) 12.3、阶段0:Stage-0 Boot (BootROM) 12.4、阶段1:FSBL(First Stage Bootloader...xilinx硬件配置工具提供的) 2、用bitstream文件烧写PL端 3、加载第二阶段BootLoader或者逻辑代码到DDR内存 4、却换到第二阶段BootLoader或者逻辑代码运行 FSBL流程图...江湖偌大,继续闯荡,愿大侠一安好,有缘再见!

1.7K11

xv6(2) 启动代码部分

$CR0$ 寄存器的 PE 位置 1 开启保护模式 movl %cr0, %eax #CR0 当前值 orl $CR0_PE, %eax #或操作PE位置1...movl %eax, %cr0 #值写回到CR0 从此开始进入保护模式,16 位的 CPU 变成了 32 位的 CPU,此刻前后的指令格式也是不一样的,在此之前使用的 16 位指令,...这里就是使用了一个长跳指令来刷新流水线,顺便设置 $CS$ 和 $EIP$ 寄存器,因为现在是保护模式了,段寄存器的可见部分应存放的是段选择子,所以 $SEG_KCODE$ 内核代码段选择子写进 $...,简单来说 $mpinit$ 函数有关处理器的部分就是寻找有多少个处理器表项,多少个处理器表项就代表有多少个处理器,然后将相关信息填进全局的 $CPU$ 数据结构: struct cpu cpus[NCPU...,现在 $AP$ 也有了自己的栈了,然后运行 $mpenter$ 完成启动 $mpenter$ static void mpenter(void) { switchkvm(); //切换到内核页表

23600

XV6操作系统代码阅读心得(一):启动加载、中断与系统调用

具体地说,需要将x86 CPU从启动时默认的Intel 8088 16位实模式切换到80386之后的32位保护模式;然后设置初始的GDT(详细解释参见https://wiki.osdev.org/Global_Descriptor_Table...此外,XV6的Boot loader足够精简,以至于能够被压缩到小于512字节,从而能够直接Bootloader加载进0x7c00的内存位置。真实的操作系统中,通常会有一个两步加载的过程。...首先将一个加载Bootloader的程序加载在0x7c00处,然后加载进完整的功能复杂的Bootloader,再使用Bootloader加载内核。...SS压栈。 ESP压栈。 EFLAGS压栈。 CS压栈。 EIP压栈。 清除EFLAGS的一些位。 设置CS和EIP为描述符中的值。...在80386中,硬件对内存访问支持保护模式,在32位保护模式中,CPU使用Global Descriptor Table来存储有关内存段的信息,使用CS寄存器来存储GDT的索引,通过这个方式来索引内存段的过程中

1.6K20

Linux启动流程

通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一准备。...系统解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。...initialization stuff in here if you don’t # want to do the full Sys V style init stuff. rc.local就是在一初始化工作后...当系统首次引导时,或系统被重置时,处理器会执行一个位于Flash/ROM中的已知位置处的代码,Bootloader就是这第一段代码。它主要用来初始化处理器及外设,然后调用 Linux 内核。...从以上分析可以看出 Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核,让我们进一步分析 Bootloader 和 Linux

8.5K50
领券