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

load_seg_reg(ES,0xfffc):尝试从引导扇区运行内核代码时出现无效段

load_seg_reg(ES, 0xfffc)是一条汇编指令,用于将0xfffc加载到段寄存器ES中。这条指令的目的是为了在引导扇区中运行内核代码时设置段寄存器ES的值。

在x86架构的计算机系统中,段寄存器用于存储段选择子,而段选择子则用于访问内存中的不同段。通过加载不同的段选择子到段寄存器,可以实现对不同内存段的访问。

在这个指令中,0xfffc是一个内存地址,它指向一个段描述符表中的段描述符。段描述符表是操作系统维护的数据结构,用于描述内存中各个段的属性和位置。通过加载0xfffc到段寄存器ES,可以将ES指向段描述符表中的一个段描述符。

然而,这个指令中的段描述符可能是无效的,导致无法正确加载段寄存器ES。这可能是由于段描述符表被破坏或者指向的段描述符不正确造成的。无效的段描述符可能导致内核代码无法正确执行,从而导致系统出现错误或崩溃。

为了解决这个问题,可以尝试以下几个步骤:

  1. 检查段描述符表:确认段描述符表是否正确设置并且没有被破坏。可以通过查看操作系统的文档或者相关代码来了解段描述符表的结构和内容。
  2. 检查段选择子:确认加载到段寄存器ES的段选择子是否正确。可以通过查看相关代码或者调试工具来检查段选择子的值。
  3. 检查内存地址:确认0xfffc指向的内存地址是否正确。可以通过查看相关代码或者调试工具来检查内存地址的值。
  4. 检查内核代码:确认内核代码是否正确编写和配置。可以通过查看相关代码或者调试工具来检查内核代码的正确性。

如果以上步骤都没有解决问题,建议寻求更高级的技术支持或者咨询相关领域的专家。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MIT 6.828 操作系统工程 lab1 2018 fall part1 & part2 笔记 and 中文注释源代码阅读

当BIOS找到可引导的软盘或硬盘,它将512字节的引导扇区加载到物理地址0x7c00至0x7dff的内存中,然后使用jmp指令将CS:IP设置为0000:7c00,将控制权传递给引导程序装载机。...引导加载程序必须执行的两个主要功能: 将处理器从实模式切换到 32位保护模式; 通过x86的特殊I / O指令直接访问IDE磁盘设备寄存器,硬盘读取内核引导加载程序的源代码: boot/boot.S...* * * 控制boot.S开始-设置保护模式, * 和一个堆栈,然后运行C代码,然后调用bootmain() * * * 该文件中的bootmain()会接管,读取内核并跳转到该内核...pa &= ~(SECTSIZE - 1); // 字节转换为扇区内核扇区1开始 offset = (offset / SECTSIZE) + 1; // 如果速度太慢,我们可以一次读取很多扇区...在BIOS进入引导加载程序时检查0x00100000处的8个内存字,然后在引导加载程序进入内核再次检查。

2K50

实战操作系统 loader 编写(上) -- 进入保护模式

引言 此前的文章中,我们详细介绍了引导扇区跳转到 loader 的工作: 启动扇区跳转到 loader 引导扇区的工作已经告一落,接下来我们的工作就是编写我们的 loader 了。...2. loader 加载内核的过程 有了通过引导扇区加载 loader 的经验,让 loader 加载内核就简单的多了。...原理上来说,loader 加载内核也同样是 FAT12 的软盘文件系统上找到内核入口文件,这与引导扇区做的事情并没有很大的区别,这里也不进行详细的介绍,只是分块大致讲解一下。...在软盘中寻找 kernel.bin 想了解更加详细的内容,参考此前引导扇区加载 loader 的代码启动扇区跳转到 loader 主要步骤仍然是: 循环读取根目录区的一个扇区 循环读取当前扇区内的一个条目...运行程序 下面我们编译上一篇文章中的快速排序代码,并把结果命名为 kernel.bin 然后放在 boot.img 的根目录下。

1K20
  • 试一试在没有操作系统的机器上运行下我们的代码

    在这里简单的回顾一下,首先CPU先执行ROM中的BIOS程序进行硬件自检,硬件没问题之后,BIOS程序开始加载硬盘第一个扇区共512个字节到内存中,这512个字节是操作系统的引导代码,是专门引导操作系统的...,因此这个扇区也叫主引导扇区。...好了,当然,我们也可以把我们的代码放到硬盘的第一个扇区,然后按下开机键,让BIOS把我们的代码加载到内存中,让CPU去执行我们的代码,这样,就实现了在计算机裸机上直接去运行我们的代码了。...0x1c],'i' mov byte[es:0x1d],0x07 mov byte[es:0x1e],'u' mov byte[es:0x1f],0x07 最后,由于主引导扇区的大小为512个字节,而且主引导扇区要以...每次执行主引导扇区代码都会首先检查该主引导扇区最后2字节是否是"55 AA",若是,则会执行主引导扇区,否则,则认为这是一个无效的主引导扇区,停止执行。

    1.2K41

    写一个boot引导程序

    BIOS引导原理 首先要了解BIOS的引导原理。启动自检过程中会去检查磁盘的第0磁头第0磁道的第1扇区,检查其是否以0x55和0xaa为结尾,如果是的话,就认为它是一个引导扇区。...接着就会将这个扇区复制到内存的0x7c00处,随后0x7c00处开始执行。 BIOS跳转到引导程序的之前,会初始化处理器,设置CS寄存器为0x0000,指令指针寄存器IP为0x7c00....初始化寄存器 这里涉及到几个寄存器 cs “代码寄存器”,对应于内存中的存放代码的内存区域,用来存放内存代码区域的入口地址(基址) ax 累加寄存器 ds 数据寄存器 es 附加寄存器 ss...堆栈寄存器 sp 栈指针寄存器 初始化寄存器的过程中,就是将cs的值设置到DS、ES、SS、AX中,然后设置栈指针寄存器SP....;填满整个扇区的512字节 times 510 - ( $ - $$ ) db 0 dw 0xaa55 ;===确保以0x55 0xaa为结尾 在qemu中运行 先是使用bximage创建一个

    60030

    《一个操作系统的实现》笔记(1)--NASM汇编语法和环境搭建

    引导扇区写进软盘 $ dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc 运行一个系统镜像 用qemu虚拟机来启动之前做好的虚拟软盘 $ qemu-system-x86...Bochs虚拟机调试方法 也可以在输入b 0x7c00之后继续执行,这样当引导扇区执行到这里,我们就可以单步调试了,使用dump_cpu可以查看CPU寄存器,x /64xb [addr]查看某个内存地址处的内容...---- 计算机的启动过程 当计算机电源被打开,它会先进行加电自检(POST), 然后寻找启动盘,如果是选择软盘启动,计算机就会检查软盘的0面0磁道1扇区,如果发现它以0xAA55结束(二进制的数据经常这样搞一个特殊标记...一旦BIOS发现了引导扇区,就会将这512字节的内容装载到内存地址0000:7c00处,然后跳转到0000:7c00处将控制权彻底交给这段引导代码。...CS、DS、SS、ES寄存器是寄存器。它们指出程序不同部分所使用的内存。分别表示代码、数据、堆栈和附加

    4K52

    计算机是如何启动的?一文教你自制操作系统

    512 字节,这第一个 512 字节也就因此被称为引导扇区。...此时,BIOS 将这第一个扇区载入到内存地址 0x7C00h 的位置,就开始执行这段引导代码了,这也就是操作系统设计时的第一代码,通过这段代码会加载并跳转到磁盘的另一代码中,从而开始整个操作系统的引导...其他属性 下列寄存器中存储了显示所需的其他信息: ES:BP — 字符串在内存中的地址与偏移地址 CX — 字符串长度 BH — 视频区页数 DH — 存储在第几行显示 DL — 存储在第几列显示 5...; 引导扇区标志 5.3....很遗憾,这还完全不能称得上是一个操作系统,但我们已经顺利让 BIOS 我们的初始扇区启动了,并且显示出了激动人心的 Hello World,接下来的事情还有什么难的呢?

    2.8K10

    xv6(2) 启动代码部分

    BIOS$ 程序的,但是我们知道它的执行流程, $0xffff0$ 开始执行 BIOS 的代码,然后将启动盘上的第 0 扇区($LBA$ 寻址方式)也就是最开始那个扇区的 MBR 加载到 $0x7c00...$DS,ES,SS$ 位 $SEG_KDATA<<3$,即将他们都设置为内核数据。...内核文件在磁盘的扇区 1 ,注意这里虽然参数传的是 0,但是函数内部加了 1,所以是扇区 1 读取的。这个函数后面讲述磁盘再详述,这里知道作用就行。 $0x10000$ 有什么意义?...引导程序在运行的时候还没有分页,没有虚拟内存虚拟地址空间一说,它运行在低地址,就是说引导程序的各种标记(变量名,函数名)都是在低地址 $4M$ 以下。..., _binary_entryother_size[]; uchar *code; struct cpu *c; char *stack; //entryother.S 是APs启动运行代码

    32200

    Linux 系统开机加电后发生了什么?

    在第一阶(MBR)中会启动 stage1.5 的 boot loader 来理解 linux 内核镜像中的特殊的文件系统格式,例如,reiserfs_stage1-5(用于reiserf日志文件系统中进行加载...MBR:第一个可开机设备的第一个扇区内的主引导分区块,内包含引导加载程序 引导加载程序(Boot loader): 一支可读取内核文件来执行的软件 内核文件:开始操作系统的功能 引导操作系统的过程 由硬盘启动...然后将控制权交给主引导代码。...主引导代码的任务包括 扫描分区表,找到一个激活(可引导)分区; 找到激活分区的起始扇区; 将激活分区的引导扇区装载到内存7C00处; 将控制权交给引导扇区代码; 加载次引导记载程序–高级装载程序bootload...Boot Loader 就是在操作系统内核运行之前运行的一小程序。

    2K40

    linux系统开机加电后发生了什么?

    在第一阶(MBR)中会启动 stage1.5 的 boot loader 来理解 linux 内核镜像中的特殊的文件系统格式,例如,reiserfs_stage1-5(用于reiserf日志文件系统中进行加载...MBR:第一个可开机设备的第一个扇区内的主引导分区块,内包含引导加载程序 引导加载程序(Boot loader): 一支可读取内核文件来执行的软件 内核文件:开始操作系统的功能 引导操作系统的过程 由硬盘启动...然后将控制权交给主引导代码。...主引导代码的任务包括 扫描分区表,找到一个激活(可引导)分区; 找到激活分区的起始扇区; 将激活分区的引导扇区装载到内存7C00处; 将控制权交给引导扇区代码; 加载次引导记载程序–高级装载程序bootload...Boot Loader 就是在操作系统内核运行之前运行的一小程序。

    2.5K30

    Centos6系统启动加载流程

    实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。...一旦检测到引导加载程序并将其加载到内存中,BIOS就会为其提供控制。 操作系统尝试MBR包含主引导加载程序的硬盘引导。...MBR代表主引导记录; 它位于可引导磁盘的第一个扇区中,通常是/dev/hda或/dev/sda; MBR的大小为512字节,它三部分组成: 主引导加载程序代码(446Bytes): 此代码提供引导加载程序信息和硬盘上实际引导加载程序代码的位置详细信息...GRUB第2阶: 负责/boot/grub/grub.conf和所需的任何其他模块加载内核; 加载GUI界面,即位于/grub/splash.xpm.gz的启动图像,其中包含可用内核列表,您可以在其中手动选择内核.../写(r/w) 完成rc.sysinit后,内核会查看/etc/rc.d/rcx.d/目录(X是/etc/inittab获取的运行级别)。

    1K10

    ucoreOS_lab1 实验报告

    dd拷贝bin/bootblock到ucore.img第一个扇区 dd拷贝bin/kernel到ucore.img第二个扇区往后的空间 问题2:一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?...\n", argv[2]); return 0; } 由以上代码可知,硬盘主引导扇区特征为: 大小为512字节,空余部分用0填充 文件内容不超过510 bytes 最后2 bytes为0x55...0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和 bootblock.asm进行比较。 自己找一个bootloader或内核中的代码位置,设置断点并进行测试。...内核已经为我们提供了这两个中段号,我们只需要在 ISR 中设置一下寄存器。 当然,用户态切换到内核态需要另外设置中断号使其可以用户态被中断。...* 让 SS 和 ESP 这两个寄存器 有机会 POP 出 更新 SS 和 ESP * 因为 内核态进入中断 它的特权级没有改变 是不会 push 进 SS 和 ESP的 但是我们又需要通过 POP

    1.7K20

    详解MBR篡改技术

    文件在存储并非连续存储在某个区域,而是分成若干进行链式存储,FAT便是用于保存之间的连接信息。由于FAT对于文件管理十分重要,所以在原FAT的后面会有一个备份FAT。...当设置为硬盘启动,Bios执行完自己的程序后如何把执行权交给硬盘呢?交给硬盘后又执行了什么呢?...运行后重启系统,我们看到屏幕上的字串。 ? 按下回车键后,windows系统正常启动。 4、阅读程序 程序中这段代码在实际执行中会进入而使得程序退出,所以需要注释掉,确保顺利执行。...memset(payload, 0, 446);//将前446清空,留下后面的DPT表和结束标志 5、解读payload 在阅读payload汇编代码前,需要明确一点:MBR在运行时是被加载到内存地址为...0×06 后记 前面我们了解了MBR磁盘锁的基本运行机制,以及MBR扇区修复技术,其实有关MBR的利用远不止这些,在一些高级利用场景中,我们可以利用修改MBR代码的方式实现病毒程序的持久化,而且这种形式的持久化方式是不依赖于操作系统

    1.6K20

    计算机操作系统-操作系统启动过程

    操作系统的两种模式 1.实模式(实地址模式) 计算机刚加电处于实模式下 程序按照8086寻址方式访问0h-FFFFFh(1MB)空间 寻址方式:物理地址(20位)=短地址:偏移地址 CPU单任务运行...2.保护模式 计算机启动成功后处于保护模式下 寻址方式:(32位)和偏移量(32位),寻址4GB空间 页式寻址机制(,页) 虚拟地址,进程,封闭空间 应用程序和操作系统的运行环境都被保护 CPU支持多任务...0道第1扇区内容(MBR) 加载MBR中的引导程序 引导程序 根据相关参数,读取硬盘指定位置的文件到内存 加载硬盘上OS内核,并初始化基本参数 (2)核心初始化 目的:OS内核初始化系统的核心数据...BIOSMBR读取引导程序,装入内存的特点文职 引导程序启动DOS7.0,调入操作系统核心 WINDOWS开始接管系统 4.核心初始化 资源状态、核心数据等初始化 5.系统初始化 GUI...映像是一个zlib压缩国的内核映像 内核完成引导后,加载init程序 进程号1 init进程通过/etc/inittab脚本进行初始化 不同运行级别(Runlevel)/etc/inittab脚本不同

    11110

    操作系统如何加载

    应用程序(用户进程)由于内部或外部中断的发生,当前进程暂时终止执行,其上下文被内核的中断程序保存起来,然后开始执行一内核代码。...此时CPU上运行的程序已经应用程序转变成了内核程序,内核程序执行完成以后也需要从内核态再返回用户态。 4. 操作系统加载运行 操作系统也是软件,他是怎么被我们的计算机加载并运行的呢?...4.1 运行BIOS程序 计算机在接电以后首先运行的是BIOS程序,BIOS主板上的一个小程序,存储空间优先,代码量较少,BIOS主要进行一些设备的自检,比如会检查安装的RAM的数量,键盘和其他设备是否已安装并正常响应...4.2 加载MBR BIOS完成自己的工作以后会将处理器使用权交给MBR(主引导记录)。MBR位于整个磁盘最开始的扇区,该扇区也成为主引导扇区。...4.3 加载OBR MBR找到活动分区以后,会将控制权交给该分区的内核加载器(OBR),为了MBR能够便利的找到内核加载器,内核加载器必须固定在分区最开始的扇区,该扇区称为操作系统引导扇区

    55860

    Linux学习笔记之Linux启动引导过程

    当系统首次引导,或系统被重置,处理器会执行一个位于已知位置处的代码。在个人计算机(PC)中,这个位置在基本输入/输出系统(BIOS)中,它保存在主板上的闪存中。...这个引导加载程序在大小上小于 512 字节(一个扇区),其作用是加载第二阶引导加载程序。...在加载映像,第二阶引导加载程序就会将控制权交给内核映像,然后内核就可以进行解压和初始化了。...给定 BIOS 功能的不同用法之后,BIOS 由两部分组成:POST 代码运行时服务。...GRUB 不像 LILO 一样使用裸扇区,而是可以 ext2 或 ext3 文件系统中加载 Linux 内核。它是通过将两阶段的引导加载程序转换成三阶引导加载程序来实现这项功能的。

    10.4K41

    8分钟掌握Linux内核分析的核心科技

    ,和可移植的部分;再例如,Linux虽然不是微内核的,但他把大部分的设备 驱动处理成相对独立的内核模块,这样减小了内核运行的开销,增强了内核代码的模块独立性。...对Linux内核源码的分析,有几个很好的入口点:一个就是系统的引导和初始化,即从机器加电到系统核心的运行;另外一个就是系统调用,系统调用是用户 程序或操作调用核心所提供的功能的接口。...; 也就是说,如果要用bootsect-loader进行系统引导,不仅必须把bootsect.S编译连接后对应的二进制代码置于MBR,而且还得把 setup.S编译连接后对应的二进制代码置于紧跟MBR后的连续的四个扇区中...:0x0200,即setup.S对应的可执行码的入口,将机 器控制权转交setup.S;整个bootsect代码运行完毕; 3.引导过程执行完后的内存印象图: 出于简便考虑,在此分析中,我忽略了对大内核的处理的分析...完成了系统的引导后,系统将进入到初始化处理阶段。系统的初始化分为实模式和保护模式两部分。 2 实模式下的初始化 实模式下的初始化,主要是指内核引导成功后,到进入保护模式之前系统所做的一些处理。

    1.5K50

    计算机硬件组成(3)

    内存中读取数据,这个存数据的内存空间称为缓存区(cache)*** 内核态和用户态 内核态——>操作系统正在控制硬件 用户态-->应用程序正在运行 PS: 1.x86-64 2. 2核4线程...系统) 硬盘(windows系统) 今日内容 一.硬盘 机械硬盘 每个磁头可以读取一换新区域,称为磁道 把一个戈丁手臂位置上所以的磁道合起来,组成一个柱面 每个磁道划成若干扇区扇区典型的值是512字节...,每个收纳箱子里存放了8个快递盒子 数据都存放于一扇区,即磁道这个圆圈的一小圆圈,磁盘读取一数据需要经历寻道时间和延迟时间  转速:7200转/分------》120转/s   转一圈花费的时间...,尤其是上下文切换 二:计算机启动过程 启动流程 1.计算机加电 2.BIOS开始运行,检测硬件:cpu、内存、硬盘等 3.BIOS读取CMOS存储器中的参数,选择启动设备 4.启动设备上读取第一个扇区的内容...(称之为主引导记录mbr)(MBR主引导记录512字节,前446为引导信息,后64为分区信息,最后两个为标志位) PS:   446 bootloader=》grub程序   64分区信息

    20320

    实战操作系统 loader 编写(下) -- 进军内核

    引言 上一篇文章中,我们结合此前已经介绍过的一系列知识,成功的将内核载入内存并进入到了保护模式中。...实战操作系统 loader 编写(上) — 进入保护模式 但是,我们马上就遇到了一个十分重要的问题,那就是如何在内存中按照 ELF 文件所需要的方式放置我们的内核,从而让内核能够执行呢?...内存区域划分 经过一系列的文章,我们不断的在向物理内存中存放着我们的文件,最初的引导扇区,到 loader.bin,再到 kernel.bin,整个物理内存到底被我们变成了什么样子呢?...事实上,既然我们已经 BIOS 加载起始扇区,到跳转进入 loader,并且不会再次回去执行 BIOS 或其实扇区代码 0h 到 7FFFFh 的全部区域我们都可以覆盖使用。 4....运行系统 下面,我们来运行我们的系统,可以看到: 8. 完整代码 本项目已开源:https://github.com/zeyu203/techlogOS。

    38220

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

    boot record) 主引导记录,设备第一个扇区最前面的 512 字节 GRUB GRUB(GNU GRUB) 启动引导程序,多启动规范的实现,允许用户选择启动操作系统,可以向内核传递启动参数 实模式...第二阶 然后加载硬盘的第一个扇区 512 字节,也就是 MBR ,然后运行启动管理器 BootLoader ,也就是我们说的 GRUB,此时控制权交给了 GRUB 。...第三阶 最终我们的操作系统 GRUB 手中接过了权力,内核被加载入内存,开始运行我们的操作系统。...操作系统启动方法就是 start_kernel (就如同我们写代码的 main 方法一样),首先运行的就是我们的 0 号进程 ,并且初始化各种所需环境(rootfs、调度模块等),最后内核态切换到用户态...其实 GRUB 它是一个很重要的引导者: 引导者可以让你去引导不同的内核进行启动 引导者可以根据不同的内核传递不同的启动参数 说的再白话一点,当你有多个操作系统的时候,GRUB 可以让你选择启动 Windows

    56310
    领券