为什么位置 0x00000000 是闪存可以访问

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

据我所知,无法通过 C 中的指针访问内存位置 0x00000000,但最近在我的项目中,我能够使用指针访问第零个位置。 第零个位置是闪存。 但是根据 post Why is address zero used for the null pointer? ,通过指针引用零是一个保留值。所以,我的问题是,因为它是一个保留值,为什么这不适用于映射到闪存位置为零的内存?

处理器: TMS470Rxx

OS : 微 C OS-II

谢谢

在许多平台上,地址零的行为与典型的台式电脑不同。

有些微控制器的硬件设备在设备零处进行内存映射。

如果您愿意,有些操作系统会乐意让您专门映射地址为零的内容。如果你在那里映射了可写闪存,那么你可以在那里写。

不同的平台以不同的方式工作。

关于使用什么地址时会发生什么的决定相当复杂。这取决于处理器架构,OS,有时 "what some software does"。

处理器可能没有内存保护,或者地址零可能确实是"used for something"(在x86实模式下,DOS运行,地址零包含向量table,中断和此类跳转到的地方,因此它对被覆盖非常敏感 - 因此编写糟糕的程序不仅会崩溃,而且会崩溃 DOS).

中的整个机器

通常,现代 OS 在具有 "virtual memory mapping" 的处理器上(因此处理器实际使用的物理地址与(或可能不相同)虚拟地址程序看到)将为您的典型应用程序将地址零映射为 "not accessible"。

OS 有时可能允许访问地址零: 很多年前,我在 Windows 驱动程序中有一个错误,它使用了 NULL 指针,并且在那个特定情况下,地址 0 没有导致崩溃。当地址零的内容被用于某些东西时,崩溃发生了很久——此时系统蓝屏(至少直到我附加调试器并调试了问题,然后修复它所以它没有尝试使用一个 NULL 指针 - 我不记得我是否必须分配一些内存或者如果指针为 NULL 则跳过该位)。

为 NULL 选择 0 是基于 "we have to choose some value (and there is not one value that can be 100% sure that nobody will ever need to use)" 的组合 - 特别是在具有 16 位或 32 位地址范围的机器上。但是,通常情况下,地址零(如果使用的话)包含一些东西 "special"(向量 table 用于中断,bootstrap 代码用于处理器,或类似的),因此您不太可能有意义地存储里面的数据。 C 和 C++ 作为语言不要求不能访问 NULL 指针 [但也不 "allow you" 自由访问此位置],只是此值可以用作 "pointer that doesn't point at anything" - 和规范还规定了您的 NULL 值实际不为零的情况。但是编译器必须处理 "ZERO means NULL for pointers, so replace it with X".

至少在某些情况下,零值确实比其他值有优势 - 大多数情况下,许多处理器都有特殊指令来与零进行比较或识别零。