热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么0xfffffffc是一个无效的访问地址?

如何解决《为什么0xfffffffc是一个无效的访问地址?》经验,为你挑选了1个好方法。

嗨,我正在阅读一本教科书,它说程序不允许访问大于的地址0xc0000000(如32位版本的Linux的情况),因此汇编代码无效:

1. irmovl $1,%eax
2. xorl %esp,%esp // Set stack pointer to 0 and CC to 100
3. pushl %eax    // Attempt to write to 0xfffffffc, will fail

我糊涂了.我有两个问题:

    为什么程序不允许访问大于的地址0xc0000000,是不是像0xc0000008有效地址那样的地址?

    如果真的不允许程序访问大于0xc0000000,0xfffffffc低于(小于)的地址0xc0000000,那么它为什么会失败?

Jonathon Rei.. 5

    为什么程序不允许访问大于0xc0000000的地址,是不是像0xc0000008这样的地址有效地址?

现代操作系统利用硬件的功能来防止运行的应用程序相互干扰.此隔离的主要组件是权限分离虚拟内存.

虚拟存储器(与物理存储器相对)意味着代码访问的地址(例如mov指令)不是RAM的实际地址.相反,内存管理单元(MMU)充分利用了页表翻译将其发送给RAM之前的虚拟地址(VA)到物理地址(PA).

权限分离由CPU(和MMU)强制执行,允许单个操作系统内核完全控制硬件,同时安全地运行多个用户应用程序.

将这两个概念放在一起,通常内核在虚拟内存的一个区域中运行(用户空间不可访问),而用户空间进程在另一个区域中运行.

在Linux内核的x86 32位arch端口中,经常使用1-3分割,为内核提供1 GB的VA空间,为每个用户应用程序留下3 GB的VA空间.从而:

0x00000000 - 0xBFFFFFFF:用户空间

0xC0000000 - 0xFFFFFFFF:内核

    如果真的不允许程序访问大于0xc0000000的地址,0xfffffffc低于(小于)0xc0000000,那么它为什么会失败?

数据的表示方式(例如在硬件寄存器或内存中)和解释方式之间存在很大差异(例如有符号/无符号整数,浮点数,文本字符串,图像等)

请注意,如果 0xFFFFFFFF 解释为32位二进制补码(带符号)整数,则得到-1.如果将其解释为无符号整数,则得到(2 ^ 32 - 1)= 4294967295.

地址总是无符号的; 一般来说,当它涉及硬件时没有负数.

0xFFFFFFFC大于0xC0000000.因此,这里是一个内核地址,任何试图访问它的用户空间应用程序都会出错并传递一个SIGSEGV信号.



1> Jonathon Rei..:

    为什么程序不允许访问大于0xc0000000的地址,是不是像0xc0000008这样的地址有效地址?

现代操作系统利用硬件的功能来防止运行的应用程序相互干扰.此隔离的主要组件是权限分离虚拟内存.

虚拟存储器(与物理存储器相对)意味着代码访问的地址(例如mov指令)不是RAM的实际地址.相反,内存管理单元(MMU)充分利用了页表翻译将其发送给RAM之前的虚拟地址(VA)到物理地址(PA).

权限分离由CPU(和MMU)强制执行,允许单个操作系统内核完全控制硬件,同时安全地运行多个用户应用程序.

将这两个概念放在一起,通常内核在虚拟内存的一个区域中运行(用户空间不可访问),而用户空间进程在另一个区域中运行.

在Linux内核的x86 32位arch端口中,经常使用1-3分割,为内核提供1 GB的VA空间,为每个用户应用程序留下3 GB的VA空间.从而:

0x00000000 - 0xBFFFFFFF:用户空间

0xC0000000 - 0xFFFFFFFF:内核

    如果真的不允许程序访问大于0xc0000000的地址,0xfffffffc低于(小于)0xc0000000,那么它为什么会失败?

数据的表示方式(例如在硬件寄存器或内存中)和解释方式之间存在很大差异(例如有符号/无符号整数,浮点数,文本字符串,图像等)

请注意,如果 0xFFFFFFFF 解释为32位二进制补码(带符号)整数,则得到-1.如果将其解释为无符号整数,则得到(2 ^ 32 - 1)= 4294967295.

地址总是无符号的; 一般来说,当它涉及硬件时没有负数.

0xFFFFFFFC大于0xC0000000.因此,这里是一个内核地址,任何试图访问它的用户空间应用程序都会出错并传递一个SIGSEGV信号.


推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
author-avatar
zwjy2018
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有