如果位置0x00000000是闪存,为什么它是可访问的

Why location 0x00000000 is accessible if it is a flash memory

本文关键字:访问 为什么 位置 0x00000000 闪存 如果      更新时间:2023-10-16

正如我所知,内存位置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替换它"。

零值确实比其他值有好处,至少有时是这样——主要是因为许多处理器都有特殊的指令来与零进行比较或识别零。