gpt4 book ai didi

c - bss 和数据的最大大小

转载 作者:IT王子 更新时间:2023-10-29 00:51:50 31 4
gpt4 key购买 nike

我想在编译时声明我的 C 程序中的所有变量,例如:

char cache[CACHE_SIZE];
char udp_ring[MAX_UDP_PACKET_SIZE*MAX_REQUESTS];
int num_packets;
char error_codes[NUM_ERRORS][MAX_ERROR_STRING]= {
{"Unknown user\n"},
{"Wrong password\n"},
....
};

问题是,当 C 程序中的变量进入 BSS 或 DATA 段时,它们的大小是否有任何限制?例如,如果我声明 8GB RAM 的 CACHE_SIZE,它会起作用吗? 32 位或 64 位有什么区别吗?我计划在 Linux 上运行该程序,并且我的 RLIMIT_DATA 配置没有限制。

最佳答案

您将能够管理内核允许进程处理的虚拟内存:这将取决于架构。

例如,在 x86 架构上(没有 x86-64 长模式),Linux 默认将进程看到的虚拟内存拆分为进程 3GB 和内核 1GB(即使启用了 PAE):您的进程将无法处理超过 3GB 的虚拟内存(包括文本部分、数据、bss、堆、堆栈、共享对象等)

如果您静态分配所有缓冲区并且内核无法将其放入进程虚拟地址空间,它将在启动时被终止:使用 8GB 缓冲区将主要导致 32 位架构上的这种行为。

如果您不想依赖 glibc 的内存管理功能(malloc,...),您可以推出自己的内存管理库并强制您的进程使用它与 LD_PRELOAD 技巧,这样您就可以定义满足您自己要求的 malloc/calloc/realloc/free(使用 sbrk())实现。

关于c - bss 和数据的最大大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126103/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com