看了很多次这个问题.但找不到合理的答案.实际上虚拟内存的限制是多少?
它是CPU的最大可寻址大小吗?例如,如果CPU是32位,最大值是4G?
还有一些文本将其与硬盘区域相关联.但我发现这是一个很好的解释.有人说它是CPU生成的地址.
我们看到的所有地址都是虚拟地址?例如,我们在使用GDB调试程序时看到的内存位置.
CPU生成虚拟地址背后的历史原因?某些文本可互换使用虚拟地址和逻辑地址.它有何不同?
paging virtual operating-system memory-management memory-segmentation
当我尝试编译以下C代码时,我得到一个总线错误.我猜它与我称之为memcpy的方式有关,但我无法弄明白.任何帮助将不胜感激!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *p = (char*)malloc(sizeof(char)*11);
// Assign some value to p
p = "hello";
char *name = (char*)malloc(sizeof(char)*11);
// Assign some value to name
name = "Bye";
memcpy (p,name,sizeof(char)*10); // Problem begins here
return 0;
}
Run Code Online (Sandbox Code Playgroud) x86 CPU在16位到32位到64位的几代产品中都有各种棘手的模式和内存分段.
现在,在现代操作模式下使用现代CPU的现代操作系统,您不必担心内存段,但您仍然可以在现代CPU上的旧版操作系统上运行旧版应用程序,在这种情况下,我假设CPU运行在一个特殊的传统模式(保护模式,实模式等).
显然,由于向后兼容性存在段寄存器,但这是唯一的原因吗?
段寄存器是否也有现代用途?或者他们现在只是成为通用名册而只是反映其历史功能的名称?
这个问题的灵感来自于对旧的Stack Overflow线程的评论:为什么必须以这种方式使用mov指令?
我用Google搜索了很长时间,但我仍然不明白它是如何工作的,因为大多数解释都是非常技术性的,没有任何插图可以让它更清晰.我的主要困惑是它与虚拟内存有什么不同?
我希望这个问题在这里有一个非常好的解释,以便其他提出相同问题的人可以在谷歌时找到它.
我正在尝试了解有关intel x86架构的一些细节.我还没有真正理解调用门机制,但没有它,为了访问不符合代码段,它的DPL必须等于CPL.
我明白在DPL <CPL的情况下这很重要,但为什么在DPL> CPL的情况下禁止它?我的意思是如果我们想要保持相同的权限级别,CPL可以在跳转后保持不变,如果我们想降低我们的权限,我们可以使用RPL.
根据AMD manual细分不能禁用。我的问题是为什么,为什么不可能?另一个问题是说64位将其禁用,这是什么意思?在64位模式下完全禁用分段功能吗?
我需要知道是否有直接使用mov指令加载代码段寄存器的限制。
从实模式切换到保护模式时,这让我感到震惊。我发现为了在代码段中放入正确的值,“跳转”指令用于设置正确的段。
那么,由于任何这样的限制,跳转指令的这种用法吗?为什么我们不能直接将值加载到代码段中?
我知道操作系统通过使用分段和特权级别来限制对内核代码和数据的访问。然而,用户可以更改段寄存器的值,如果以下代码执行成功,我们似乎可以访问内核数据:
mov eax, 0x10
mov es, ax #point selector to the item 2 in GDT with RPL 0, which is the data segment
les bx, [0]
Run Code Online (Sandbox Code Playgroud)
所以我想知道阻止此代码成功执行的机制是什么?
我尝试在C++中创建的每个类都会发生这种情况.从java迁移,我发现问题主要在于创建类.我运行valgrind并且它在构造函数中,它似乎是.
==30214== Memcheck, a memory error detector
==30214== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==30214== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==30214== Command: ./CoC
==30214==
==30214==
==30214== Process terminating with default action of signal 11 (SIGSEGV)
==30214== Bad permissions for mapped region at address 0x404B4F
==30214== at 0x4C2B9EC: strcat (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30214== by 0x404220: Model::Model(std::string) (in /home/kronus/Apollo/CoC)
==30214== by 0x402617: main (in /home/kronus/Apollo/CoC)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在尝试将此模型类的构造函数调用到main方法中.这是构造函数的代码
Model::Model(std::string filename)
{
m_TotalFaces = …Run Code Online (Sandbox Code Playgroud) how to find a segment address from given data?
Physical address = 0x119B, Effective address = 0x10AB
what could be the formula?