|
|||
Home > C 和 C++ 库 > 编写可重入且线程安全的代码 > __user_libspace 静态数据区 |
__user_libspace
静态数据区保存 C 库的静态数据。 这是一个由
C 库提供的零初始化数据块(96 个字节)。 在 C 库初始化期间,还会将其用作临时堆栈。
缺省 ARM C 库使用 __user_libspace
区保存以下内容:
errno
,由可设置 errno
的任何函数使用。
缺省情况下,__rt_errno_addr()
返回一个指向 errno
的指针。
软件浮点的 FP 状态字(异常标记、舍入模式)。 硬件浮点中不使用此状态字。 缺省情况下,__rt_fp_status_addr()
返回一个指向
FP 状态字的指针。
指向堆基址的指针(即,__Heap_Descriptor
),由与 malloc
相关的所有函数使用。
alloca
状态,由 alloca()
及其辅助函数使用。
当前区域设置设置,由 setlocale()
等函数使用,也供依赖于它们的所有其他库函数使用。
例如,ctype.h
函数需要访问 LC_CTYPE
设置。
C++ 库使用 __user_libspace
区保存以下内容:
new_handler
字段和 ddtor_pointer
:
new_handler
字段用于跟踪传递给 std::set_new_handler()
的值
ddtor_pointer
由 __cxa_atexit()
和 __aeabi_atexit()
使用。
std::set_terminate()
和 std::set_unexpected()
等函数的
C++ 异常处理信息。
有关 __aeabi_atexit()
、std::set_terminate()
和 std::set_unexpected()
的详细信息,请参阅以下规范:CPPABI 和 《ARM
体系结构的异常处理 ABI》。
在将来的版本中,C 和 C++ 库使用 __user_libspace
区的方式可能会发生变化。
以下两个包装函数用于返回 __user_libspace
静态数据区的小节:
__user_perproc_libspace()
返回一个指向 96 个字节的数据块的指针,该数据块用于存储整个进程中的全局数据,即,在所有线程之间共享的数据。
__user_perthread_libspace()
返回一个指向 96 个字节的数据块的指针,该数据块用于存储特定线程的局部数据。 这意味着,__user_perthread_libspace()
根据从中调用它的线程返回不同的地址。
通常,不需要重新定义 __user_libspace()
函数。 但是,如果编写的是操作系统或进程切换程序,则必须重新实现此函数。
有关详细信息,请参阅调整静态数据访问。
将单线程进程移植到重新实现了该函数的 RVCT 中时,您可以继续使用该函数,而无需更改代码。 但是,如果使用 RVCT 编写多线程应用程序,则更改行为是非常重要的。