x86_64 Linux 3.0:无效的内存地址
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了x86_64 Linux 3.0:无效的内存地址,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1345字,纯文字阅读大概需要2分钟。
内容图文
![x86_64 Linux 3.0:无效的内存地址](/upload/InfoBanner/zyjiaocheng/945/7d5201c4974449ebb45db2b38bfe7238.jpg)
x86_64体系结构上的Linux 3.0上的进程具有64位虚拟地址空间.
很明显,在该地址空间中,保证0是无效的内存地址[请参见下面的定义],因为该地址用于指示NULL指针.
保证哪些其他64位数字(如果有)永远都不是有效的内存地址,为什么?
例如,1可以是有效地址吗?那2 ^ 64-1呢?
定义:您是什么意思“保证是无效的内存地址”?
void deref_and_assign(uint64_t i)
{
char* p = (char*) i;
*p = 42;
}
就此问题而言,保证无效的内存引用意味着函数deref_and_assign将始终引发SIGSEGV.
解决方法:
在x86 / 64上,如果启用了页面转换并且无法访问虚拟地址0处的内存(由于将物理内存映射到虚拟地址空间的方式),则1 … 4095也将无法访问,因为所有这些4096地址对应于一个内存页面,它只能在整体上可用或不可用.最好不要在虚拟地址0处映射内存.不进行映射将有助于捕获许多NULL指针取消引用.此处的CPU将在未映射的位置或需要比当前执行的代码更高特权的位置上生成页面错误(aka #PF).
在64位模式下,CPU可以实现的虚拟地址位数少于64个虚拟地址位(48),并且64位地址必须在未实现的位中包含全零或全1(值0或1必须为与实现的最高有效地址位的值相同,所有这些都可以解释为地址符号扩展).这样的地址称为规范地址.如果尝试使用非规范地址读取或写入内存,则会出现一般保护错误(AKA #GP).
因此,根据操作系统(有效地取决于其内存布局)和实际的CPU,您可能会想到“无效”的内存地址范围.如果尝试从用户模式应用程序读取/写入内核的内存,则会得到#PF.如果您尝试读取/写入未映射的内存(例如,地址0到4095),则会得到#PF.如果您尝试在非规范地址处进行读取/写入,则会获得一个#GP.
您在找那种东西吗?
内容总结
以上是互联网集市为您收集整理的x86_64 Linux 3.0:无效的内存地址全部内容,希望文章能够帮你解决x86_64 Linux 3.0:无效的内存地址所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。