我想在编译时在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段时,它们的大小是否受到限制?
例如,如果我声明CACHE_SIZE为8GB RAM,它将起作用吗? 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/

10-12 19:57