我一直在努力想象这个很长一段时间,而且我没有到达任何地方.
这是我正在尝试做的事情:如果IDTR中包含的值是0x3A000,那么在保护模式下的物理地址是中断向量3的位置?
我想找到一个公式,它可以帮助我计算中断向量#3偏移量的每个字节的物理地址,以及中断向量#3段的每个字节的物理地址.
我一直在寻找互联网,并且没有可靠的解释IDTR如何计算这个,我真的很好奇.
我也很好奇如何找到真实模式的相同物理地址......
如果有人可以帮我找到解决这类问题的通用公式,那将是一个爆炸!
我试图了解D flag在 x86-64 代码中使用时代码段描述符中的工作原理。它设置在D/B代码段描述符的第 22 位,如下图所示:
D/B(默认操作大小/默认堆栈指针大小和/或上限)标志
根据段描述符是可执行代码段、向下扩展数据段还是堆栈段执行不同的功能。(对于 32 位代码和数据段,此标志应始终设置为 1,对于 16 位代码和数据段,应始终设置为 0。)
• 可执行代码段。该标志称为 D 标志,它表示段中指令引用的有效地址和操作数的默认长度。如果设置了标志,则假定为 32 位地址和 32 位或 8 位操作数;如果清楚,则假定为 16 位地址和 16 位或 8 位操作数。指令前缀 66H 可用于选择默认值以外的操作数大小,前缀 67H 可用于选择默认值以外的地址大小。
所以我试图了解它影响哪些 x86-64 指令以及如何影响?
附注。当我尝试通过设置该位来运行一些测试(在 Windows 内核中)时,操作系统立即出现三重故障。
我已经读过这样的STOSB函数:
ES:[DI] <-- AL
Run Code Online (Sandbox Code Playgroud)
如果DF = 0增量DI否则递减DI.
STOSB不改变DS:[DI]呢? 邓特曼说8086可以寻址的内存是8080的16倍,并对此进行了详细阐述,为16 * 64K = 1MB。因此,我假设一次使用16位(16位处理器)* 64K,因为16条地址线(2 ^ 16)。但是,通过这种计算逻辑,同样具有16条地址线的8080(8位处理器)是否应该能够寻址8 * 64K = 0.5MB?
那么8086是否应该能够处理8080两倍的地址?

Afaik 他们从未使用过,现在 CS=DS=SS。但是,如果我要设置这些值,会发生任何变化还是处理器会忽略它们。我在这个问题上发现了非常矛盾的信息,我不明白如果它们被忽略为什么它们仍然存在。请帮助
存储单元的物理地址以 1A32H 的形式给出。内存段的起始地址是什么。或者更准确地说,我应该用来访问它的 seg:off 地址。
有人可以逐步解释我如何解决这个问题吗?
我正在为 64 位处理器编写自己的操作系统,但遇到了一般保护问题。我的操作系统不会依赖页面错误来实现用户空间保护机制,所以我发现有一种方法可以通过段限制检查来实现:
这个来自 VMWare 的演示
http://download3.vmware.com/vmworld/2005/pac346.pdf
在第 20 页上说:
最初的 AMD64 架构不包括 64 位模式下的分段
- EMT64T 中也缺少分段
我们如何保护 VMM?
- 64 位来宾支持需要额外的硬件协助
- 在较新的 AMD 处理器上的 64 位模式下可用的段限制检查
现在,我有了更新的 AMD 处理器型号,我的问题是如何在 64 位(长)模式下对 AMD 处理器进行限制段限制检查?我已经下载了 2011 年 9 月版本(最新)的开发人员手册,但我无法在任何地方找到如何执行此操作,请帮助。
我正在使用vigenère算法实现.
不幸的是,在测试程序时,我遇到了分段错误.我在mac上用clang编译.
我怎么能避免这个错误?
源代码:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
/**
* Function: invalidUsage
* --------------------
* Shows usage information and returns 1
*/
int
invalidUsage();
/**
* Function: cryptCaesar
* --------------------
* Returns encrypted char using caesar cipher
*/
char
cryptCaesar(const char plain, const int key);
/**
* Function: parseAlphaKey
* --------------------
* Converts an alpha string to a usable key (array of char from 0 to 25)
* Returns true if conversion successful, false if not
*/
bool …Run Code Online (Sandbox Code Playgroud) 这个问题主要与x86、linux相关
在 x86 上,访问内存的每个操作都需要在执行程序时从某个“段”内完成,您的程序保存三个指向某些内存地址的段寄存器,例如
CSwhich 指向一些内存,你可以在其中读取和执行DSwhich 指向一些内存,你可以在其中读写SSwhich 指向一些内存,在那里你也可以读写在执行一些代码时,每次JMP或CALL您对某个地址的指令将通过您的处理器检查是你内CS,如果你的范围内,每一个读/写操作系你就全局变量在您的代码将被CPU检查DS内存限制,并因此SS,鉴于此,我们提供了一些提供内存保护的内存模型。
现在我的问题是,当我们动态分配一些内存时会发生什么?还是内存映射?,操作系统给我分配一些内存是不够的,执行程序必须有一些寄存器指向进行 IO 操作的地方......我假设这是 FS / GS / ES 寄存器启动,但我不确定。如果这里有在该领域有更多经验的人可以向我解释这一点,我希望它...
我之前写了一些代码测试它并反汇编它,输出令人失望。
我的代码是这样的
int main()
{
int * mem = (int *) malloc(4096)
mem[0] = 5;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望在反汇编代码中看到类似的东西
lea eax, mem_addr
mov fs:[eax], 5
Run Code Online (Sandbox Code Playgroud)
但这并没有发生..如果有人能向我澄清这一点,我会很高兴的
段寄存器用于将可寻址存储器的范围从 64K 字节增加到 1M 字节。但是,我很难理解堆栈段寄存器(SS),因为堆栈已经有两个与之关联的其他寄存器:sp和bp。
假设我将SS设置为5000h ,然后决定通过初始化bp和sp寄存器来初始化堆栈。最初堆栈应该是空的。因此,sp和bp最初应该具有相同的内容。我可以使用任何随机地址初始化sp吗?或者我会有一些限制吗?
例如,用地址7000h初始化sp可以吗
assembly bootloader memory-segmentation x86-16 stack-pointer
我正在尝试在 hackerrank 中解决这个问题。
https://www.hackerrank.com/challenges/circular-array-rotation/problem
其他每个测试都很好,但一个测试正在创建分段错误。这是测试用例:
https://hr-testcases-us-east-1.s3.amazonaws.com/1884/input04.txt ?AWSAccessKeyId=AKIAR6O7GJNX5DNFO3PV&Expires=1648127766&Signature=a0c1UvQ4t9DBn%2Fkr02ZnLUurhjk%3D&response-content-type=text% 2Fplain
我希望我的代码的哪一部分正在创建分段错误,我想知道如何用代码和一些解释来解决它,因为我相信我的代码不应该创建任何分段错误。这是我的代码:
vector<int> circularArrayRotation(vector<int> a, int k, vector<int> queries) {
rotate(a.begin(),a.begin()+a.size()-k,a.end());
vector<int> result;
cout<<result.size()<<endl;
for(auto x:queries) result.push_back(a[x]);
return result;
}
Run Code Online (Sandbox Code Playgroud)
这是我在 hackerrank 解决方案中提交的代码。请帮助我通过测试。
c++ memory-leaks vector segmentation-fault memory-segmentation
8086 上段的最小和最大大小是多少?而且,由于最小值,我们可以拥有的最大单独段数是多少?不需要所有的都同时处于活动状态。(重叠是可以接受的)
#include<stdio.h>
int main(){
int a;
printf("%u\n ",&a);
printf("%p\n ",a);
printf("%p\n ",&a);
printf("%fp\n ",&a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过此代码,但无法理解输出
4193177020
(nil)
0x7ffff9eecdbc
0.000000p
Run Code Online (Sandbox Code Playgroud)
这是什么存储空间地址,哪一部分是偏移量?
c compiler-construction memory-management offset memory-segmentation