如果位置0x00000000是闪存,为什么它是可访问的
Why location 0x00000000 is accessible if it is a flash memory
正如我所知,内存位置0x00000000不能通过C中的指针访问,但最近在我的项目中,我能够使用指针访问第零个位置。第零个位置是闪存。但根据帖子"为什么零地址用于空指针?",通过指针引用零是一个保留值。所以,我的问题是,由于这是一个保留值,为什么对于映射到零位置闪存的内存来说,这不成立?
处理器:TMS470Rxx
OS:Micro C OS-II
感谢
在许多平台上,地址零的行为与典型的台式电脑不同。
在一些微控制器中,硬件设备被内存映射到设备零。
如果你愿意的话,有些操作系统会很乐意让你专门映射地址为零的东西。如果你有可写的闪存映射在那里,那么你就可以在那里写。
不同的平台以不同的方式工作。
关于使用什么地址时会发生什么的决定相当复杂。这取决于处理器体系结构、操作系统,有时还取决于"某些软件的功能"。
处理器可能没有内存保护,或者零地址确实可能"被用来做某事"(在x86真实模式下,DOS运行时,零地址包含向量表,中断和此类跳转到的位置,因此它对被覆盖非常敏感-因此,写得不好的程序不仅可能而且会在DOS中崩溃,整个机器都会崩溃)。
通常,具有"虚拟内存映射"(因此处理器实际使用的物理地址与程序看到的虚拟地址不同(或可能不同)的处理器上的现代操作系统会将地址0映射为典型应用程序的"不可访问"。
操作系统有时可以允许访问地址0:多年前,我在Windows驱动程序中遇到了一个错误,它使用了NULL指针,而在这种特殊情况下,地址0并没有导致崩溃。崩溃发生在很久以后,当地址零的内容被用于某些事情时——在这一点上,系统进行了蓝色屏蔽(至少在我连接调试器并调试了问题,然后修复了它,这样它就不会尝试使用NULL指针——我不记得我是必须分配一些内存,还是在指针为NULL时跳过了那个位)。
为NULL选择0是基于"我们必须选择一些值(没有一个值可以100%确定没有人需要使用)"的组合,尤其是在具有16或32位地址范围的机器上。然而,通常情况下,如果使用地址0,它会包含一些"特殊"的东西(用于中断的矢量表、用于处理器的引导程序代码或类似的东西),因此您不太可能在其中有意义地存储数据。C和C++作为语言不要求不能访问NULL指针[但也不"允许"自由访问该位置],只是该值可以用作"不指向任何东西的指针"-规范还提供了NULL值实际上不是零的情况。但是编译器必须处理"ZERO表示指针为NULL,所以用X替换它"。
零值确实比其他值有好处,至少有时是这样——主要是因为许多处理器都有特殊的指令来与零进行比较或识别零。
- 为什么示例代码访问IUnknown中已删除的内存
- 为什么此派生对象无法访问基类的后递减方法?
- 为什么我的好友类无法访问私人会员?
- 为什么 std::itrator 无法访问该函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 为什么 Windows 拒绝访问某些进程的名称?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 为什么我无法访问指向数组中成员函数的指针?
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 为什么我的 setter 方法会产生错误的访问错误
- 为什么没有访问所有字符串字符?
- 为什么我可以访问其他班级的私人成员?
- 为什么继承的结构成员在联合中无法访问?
- 为什么在PIMPL中无法访问实现类的常量函数?
- 为什么"delete"操作员给我访问权限冲突
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 函数指针和访问-为什么这个代码是合法的