小编gfv*_*gfv的帖子

在C中取消引用指向0的指针

有时内存地址为0x0的数据非常有价值 - 以x86实模式IVT作为一个更为人熟知的例子:它从0x0开始并包含指向中断处理程序的指针:0x00处的双字是指向零错误处理程序的指针.

但是,C11语言标准禁止解除引用空指针[WG14 N1570 6.5.3.2],它们被定义为用0初始化的指针或用空指针[WG14 N1570 6.3.2.3] 初始化的指针,有效地禁止了第一个字节.

人们如何在需要时实际使用0x0?

c memory pointers dereference

55
推荐指数
3
解决办法
4815
查看次数

当处理器尝试访问不存在的物理地址时会发生什么?

想象一下32位x86计算机,内存少于3千兆字节,CPU设置为禁用分页和平面段描述符(0x0作为基础,0xffffffff作为数据和代码的有效限制).

当ring0中的指令尝试使用mov指令引用未被任何内存地址支持的物理地址时会发生什么?

QEMU模拟只是停顿了一个错误,如"致命:试图在RAM或ROM之外执行代码".

这些异常与内存问题有关:

  1. 它不应该是"Segment Not Present(#NP)":它只在加载段寄存器时发生,但我实际上可以毫无问题地加载扁平段.
  2. #SS不应生成"Stack Fault()",因为代码不引用堆栈.
  3. "General Protection(#GP)"不应该发生,因为代码在ring-0中运行,并且段设置为允许访问每个物理地址.
  4. 分页已禁用,因此它也不是"页面错误(#PF)".
  5. 并且它不是对齐问题,因此它不应该触发"对齐检查(#AC)".

我没有选择,我不知道会发生什么.

x86 assembly

6
推荐指数
2
解决办法
1059
查看次数

标签 统计

assembly ×1

c ×1

dereference ×1

memory ×1

pointers ×1

x86 ×1