x86相关内容

x86 GNU 汇编程序奇怪的更改段错误

下面的x86汇编代码可以很好地组装,它曾经在我学校的linux服务器上完美运行,但是在我的linux虚拟机(ubuntu 14.04)上应用相同的代码时,突然导致分段错误. 堆栈约定是否改变了,这是 GNU 汇编程序的问题吗?我错过了什么备忘录?我在 64 位机器上运行,这是构建操作系统主干的热身,所以我需要能够使用 16 位真实、32 位保护和 64 位模式都在同一个程序中.所以我想我真正 ..
发布时间:2022-01-12 15:59:13 服务器开发

x86 内存访问分段错误

出于好奇,我正在学习 x86 汇编.我目前正在使用带有 NASM 汇编器的基于 Linux 的操作系统.我很难理解为什么 SECTION .text全局_start_开始:无移动 ebx, 25mov [0xFFF], ebx;退出程序移动 eax, 1移动 ebx, 0整数 0x80 会导致分段错误(将 ebx 寄存器的内容移动到内存位置 0xFFF 时).我在想用纯 asm 构建一个程序可 ..
发布时间:2022-01-12 15:46:20 服务器开发

以 64 位代码从 [esp] 加载时出现段错误

我是 x86 程序集的新手,我正在尝试构建一个 hello world 程序.我正在尝试制作一个子程序,将单个字节写入标准输出,但我遇到了问题. mov ebx, [esp+1] 行(当我调用子例程时加载传递的字节)会导致段错误. 我已尝试将 ebx 寄存器与自身异或,以确保它是空的,以确保它不会与系统调用混淆 _start:推送 32h调用 _writeByte;这只是跳转到退出例 ..
发布时间:2022-01-12 15:41:58 其他开发

多核 Intel CPU 中的高速缓存如何共享?

我有几个关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题.(虽然与编程没有直接关系,但在为多核处理器/多处理器系统编写软件时会产生很多影响,因此在这里问!) 在多处理器系统或多核处理器(英特尔四核、酷睿二双核等)中,每个 cpu 核心/处理器是否有自己的高速缓存(数据和程序高速缓存)? 李> 一个处理器/核心能否访问彼此的缓存,因为如果允许它们访问彼此的缓存,那么我相信在 ..
发布时间:2022-01-12 12:22:33 其他开发

x86 处理器如何在引导加载程序加载 GDT 之后获取指令?

在为 x86 编写的典型简单引导加载程序中,我们有以下代码来加载 GDT 并执行远跳转(注意在执行以下代码之前 CS 为 0x0): lgdt gdtdesc移动 %cr0, %eaxorl $1, %eax移动 %eax, %cr0# 跳转到下一条指令,但在 32 位代码段中.# 将处理器切换到 32 位模式.ljmp $0x8, $protcseg.code32 # 汇编为 32 位模式程序 ..
发布时间:2022-01-11 23:41:05 其他开发

我怎样才能让操作系统在关机前等待一秒钟(nasm)

powerCommand:mov si, 关机调用打印字符串;在这里休眠命令移动斧头,0x1000mov ax, ss移动 sp, 0xf000移动斧头,0x5307移动 bx, 0x0001mov cx, 0x0003整数 0x15ret 我希望程序等待 1 秒钟,然后继续关机.目前它在关闭消息后立即关闭.我在我用 nasm 制作的自定义操作系统上运行它. 解决方案 假设你的程序是由 ..
发布时间:2022-01-11 23:34:27 其他开发

“.="是什么意思?在 AT&T 汇编语言中是什么意思?

我正在编写一个启动程序.内容如下: .text巴拉巴拉.globl _start_开始:巴拉巴拉.=_start+510.byte 0x55,0xaa 顺便说一句,我也无法理解“.byte 0x55,0xaa"是什么意思?它的功能是什么,它是如何工作的?越详细越好. 解决方案 汇编器将数据和指令转换为字节.与编译器不同,汇编指令和内存之间通常存在 1:1 匹配.这 .符号传统上用于表示 ..
发布时间:2022-01-11 23:32:55 其他开发

如果段错误不可恢复,为什么称为错误(而不是中止)?

我对术语的以下理解是这样的 1) 中断 是由硬件发起的“通知",用于调用操作系统以运行其处理程序 2) 陷阱 是由软件发起的“通知",用于调用操作系统以运行其处理程序 3) 错误 是一个异常,如果发生错误但可以恢复,则由处理器引发 4) 中止 是处理器在发生错误但不可恢复时引发的异常 为什么我们称它为 segmentation fault 而不是 segmen ..
发布时间:2022-01-11 23:31:44 其他开发

如何制作可启动的 iso(不是 cd 或闪存驱动器)来测试您自己的引导加载程序?

我正在尝试编写一个引导加载程序(hello world 排序).我正在使用 Bochs 进行模拟(平台 Linux-Ubuntu).但我无法为我的二进制文件制作可启动的 iso.虽然在教程中使用了 VFD(虚拟软盘),但它适用于 windows 平台.这是我的引导加载程序代码(仅用于测试) ;**************************************************;引 ..
发布时间:2022-01-11 23:21:58 其他开发

IA-32 中的段选择器

段选择器何时出现.英特尔指南中的行说: "每个段描述符都有一个关联的段选择器.一个段选择器为使用它的软件提供 GDT 的索引或 LDT(其关联的段描述符的偏移量),a全局/本地标志(确定选择器是否指向 GDT或 LDT),以及访问权限信息." 我不太明白. 是否有单独的段选择器寄存器?它是如何计算的?为什么我们需要它? 解决方案 那么会发生什么: 每当加载程序时,链 ..
发布时间:2022-01-11 23:21:28 其他开发

调用门、中断门、陷阱门的区别?

我正在学习英特尔保护模式.我发现调用门、中断门、陷阱门几乎是一样的.事实上,除了 Call Gate 有参数 counter 的字段,而且这 3 个门的 type 字段不同之外,它们在所有其他字段上都是相同的. 就其功能而言,它们都是用来将代码控制转移到某个代码段内的某个过程中. 我想知道,因为这 3 个门都包含跨权限边界调用所需的信息.为什么我们需要 3 种?1 还不够好吗? ..
发布时间:2022-01-11 23:16:52 其他开发

如何在不使用 BIOS 的情况下将数据写入显卡?

我想制作一个(非常简单的)操作系统.我目前正在学习显卡. 这是我目前所知道的(如果我错了,请纠正我): 显卡有两种模式:文本模式和图形模式. 您可以使用 BIOS 将数据写入显卡(而不是直接访问显卡). 我想做的是不使用 BIOS 直接写入显卡的显存(因为我想了解它是如何工作的).所以我有以下问题: 我怎么知道显卡显存的基地址是什么,是这个吗通过探测 PCI 总线获取基地 ..
发布时间:2022-01-11 23:10:49 其他开发

Linux 是否将 x86 CPU 的 PCID 功能用于 TLB?如果不是,为什么?

我写了一个内核模块来检查 CR4.PCIDE,它没有设置.为什么 Linux 不使用这样的特性来减少由于 TLB 失效和缓存污染导致的性能下降? 解决方案 更新:由于 Meltdown 和 Spectre 攻击,这在 4.15 时间范围内发生了变化2017 年末和 2018 年初.有关详细信息,请参阅其他答案. 注意:我不是 Linux 开发人员 对于英特尔的“进程上下文标 ..
发布时间:2022-01-11 23:09:28 其他开发

是否可以在实模式下使用 32 位寄存器/指令?

在研究一些简单的os源代码时,我对一个简单的汇编问题感到困惑. 在这个网站:http://wiki.osdev.org/Babystep7下面的代码是从实模式切换到保护模式 mov eax, cr0或 al,1mov cr0, eax 我知道如何从实模式切换到保护模式. 但我的问题是,既然程序还在实模式下,怎么能用32位的寄存器或指令呢? 是否可以在实模式下使用 32 位寄存器/ ..
发布时间:2022-01-11 23:01:28 其他开发

什么是段以及如何在 8086 模式下对其进行寻址?

自从我开始使用 8086 汇编语言编程以来,我一直在思考这些段和段寄存器.我面临的问题是我无法直观地了解脑海中的片段,因此我不清楚这些概念. 谁能帮我理解将其与现实世界场景联系起来的概念?我还有以下问题: 问题 1: 据我了解,在启用 20 条地址线的 16 位实模式下,我们可以将物理内存分成 16 段,每段 64KiB.第一段从 0x00000 开始.下一段的起始地址是什么.会 ..
发布时间:2022-01-11 22:58:37 其他开发

x86 页表是如何工作的?

我熟悉 MIPS 架构,它有一个软件管理的 TLB.因此,您(操作系统)想要存储页表和页表条目的方式和位置完全取决于您.例如,我做了一个带有单个倒置页表的项目;我看到其他人在每个进程中使用 2 级页表. 但是 x86 的故事是什么?据我所知,TLB 是硬件管理的.x86 是否告诉您,“嘿,这是您当前使用的页表条目需要去的地方 [物理地址范围]"?但是等等,我一直认为 x86 使用多级页表,所 ..