程序或-内存区域分配(五个段)

数据在内存中的储存·大小端(文字+画图详解)(c语言·超详细入门必看) 数据在内存中的储存·大小端详细介绍·C语言必看 阅读详情

转自:http://blog.youkuaiyun.com/love_gaohz/article/details/41310597

一.

在学习之前我们先看看ELF文件。


ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从文件内容上存储的方式,spec上有张图是比较经典的:如上图:
 其实从文件存储的格式来说,上面的两种view实际上是一样的,Segment实际上就是由section组成的,将相应的一些section映射到一起就叫segment了,就是说segment是由0个或多个section组成的,实际上本质都是section。在这里我们首先来仔细了解一下section和segment的概念:section就是相同或者相似信息的集合,比如我们比较熟悉的.text .data  .bss section,.text是可执行指令的集合,.data是初始化后数据的集合,.bss是未初始化数据的集合。实际上我们也可以将一个程序的所有内容都放在一起,就像dos一样,但是将可执行程序分成多个section是很有好处的,比如说我们可以将.text section放在memory的只读空间内,将可变的.data section放在memory的可写空间内。

从可执行文件的角度来讲,如果一个数据未被初始化那就不需要为其分配空间,所以.data和.bss一个重要的区别就是.bss并不占用可执行文件的大小,它只是记载需要多少空间来存储这些未初始化数据,而不分配实际的空间。

可以通过命令 $ readelf -l a.out 查看文件的格式和组成。

二.

站在汇编语言的角度,一个程序分为:
数据段 -- DS
堆栈段 -- SS
代码段 -- CS
扩展段 -- ES

站在高级语言的角度,根据APUE,一个程序分为如下段:
text
data (initialized)
bss
stack
heap

        1.一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成了该可执行程序的文件。

★★可执行二进制程序 = 代码段(text)+数据段(data)+BSS段★★

        2.而当程序被加载到内存单元时,则需要另外两个域:堆域和栈域。图1-1所示为可执行代码存储态和运行态的结构对照图。一个正在运行的C程序占用的内存区域分为代码段、初始化数据段、未初始化数据段(BSS)、堆、栈5个部分。

★★正在运行的C程序 = 代码段+初始化数据段(data)+未初始化数据段(BSS)+堆+栈★★

       3.在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间。栈亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。

          4.动态分配与静态分配,二者最大的区别在于:1. 直到Run-Time的时候,执行动态分配,而在compile-time的时候,就已经决定好了分配多少Text+Data+BSS+Stack。2.通过malloc()动态分配的内存,需要程序员手工调用free()释放内存,否则容易导致内存泄露,而静态分配的内存则在进程执行结束后系统释放(Text, Data), 但Stack段中的数据很短暂,函数退出立即被销毁。



 图1-1(从可执行文件a.out的角度来讲,如果一个数据未被初始化那就不需要为其分配空间,所以.data和.bss一个重要的区别就是.bss并不占用可执行文件的大小,它只是记载需要多少空间来存储这些未初始化数据,而不分配实际的空间)

三.

代码段 --text(code segment/text segment)
text段在内存中被映射为只读,但.data和.bss是可写的。
text段是程序代码段,在AT91库中是表示程序段的大小,它是由编译器在编译连接时自动计算的,当你在链接定位文件中将该符号放置在代码段后,那么该符号表示的值就是代码段大小,编译连接时,该符号所代表的值会自动代入到源程序中。

数据段 -- data
data包含静态初始化的数据,所以有初值的全局变量和static变量在data区。段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和你的程序大小没有关系,但和程序使用到的全局变量,常量数量相关。数据段属于静态内存分配。 

bss段--bss
bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的RAM区内,源程序中使用malloc分配的内存就是这一块,它不是根据data大小确定,主要由程序中同时分配内存最大值所确定,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。BSS段属于静态内存分配。

stack:
栈(stack)保存函数的局部变量(但不包括static声明的变量, static 意味着 在数据段中 存放变量),参数以及返回值。是一种“后进先出”(Last In First Out,LIFO)的数据结构,这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据。对于哪些暂时存贮的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它的信息。栈另外一个重要的特征是,它的地址空间“向下减少”,即当栈上保存的数据越多,栈的地址就越低。栈(stack)的顶部在可读写的RAM区的最后。

heap:
堆(heap)保存函数内部动态分配内存,是另外一种用来保存程序信息的数据结构,更准确的说是保存程序的动态变量。堆是“先进先出”(First In first Out,FIFO)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。

下图是APUE中的一个典型C内存空间分布图:


所以可以知道传入的参数,局部变量,都是在栈顶分布,随着子函数的增多而向下增长.
函数的调用地址(函数运行代码),全局变量,静态变量都是在分配内存的低部存在,而malloc分配的堆则存在于这些内存之上,并向上生长.

举例1:

  1. #include <stdio h="">  
  2. const int    g_A       = 10;         //代码段  
  3. int          g_B       = 20;         //数据段  
  4. static int   g_C       = 30;         //数据段  
  5. static int   g_D;                    //BSS段  
  6. int          g_E;                    //BSS段  
  7. char        *p1;                     //BSS段  
  8.   
  9. void main( )  
  10. {  
  11.     int           local_A;            //栈  
  12.     int           local_B;            //栈  
  13.     static int    local_C = 0;        //数据段  
  14.     static int    local_D;            //数据段  
  15.       
  16.     char        *p3 = "123456";     //123456在代码段,p3在栈上  
  17.   
  18.     p1 = (char *)malloc( 10 );      //堆,分配得来得10字节的区域在堆区  
  19.     strcpy( p1, "123456" );         //123456{post.content}放在常量区,编译器可能会将它与p3所指向 的"123456"优化成一块  
  20.   
  21.     printf("hight address\n");  
  22.     printf("-------------栈--------------\n");  
  23.     printf( "栈,    局部变量,                           local_A, addr:0x%08x\n", &local_A );  
  24.     printf( "栈,    局部变量,(后进栈地址相对local_A低)  local_B, addr:0x%08x\n", &local_B );  
  25.     printf("-------------堆--------------\n");  
  26.     printf( "堆,    malloc分配内存,             p1,      addr:0x%08x\n", p1 );  
  27.     printf("------------BSS段------------\n");  
  28.     printf( "BSS段, 全局变量,       未初始化    g_E,     addr:0x%08x\n", &g_E, g_E );      
  29.     printf( "BSS段, 静态全局变量,   未初始化,   g_D,     addr:0x%08x\n", &g_D );  
  30.     printf( "BSS段, 静态局部变量,   初始化,     local_C, addr:0x%08x\n", &local_C);  
  31.     printf( "BSS段, 静态局部变量,   未初始化,   local_D, addr:0x%08x\n", &local_D);  
  32.     printf("-----------数据段------------\n");  
  33.     printf( "数据段,全局变量,       初始化      g_B,     addr:0x%08x\n", &g_B);  
  34.     printf( "数据段,静态全局变量,   初始化,     g_C,     addr:0x%08x\n", &g_C);  
  35.     printf("-----------代码段------------\n");  
  36.     printf( "代码段,全局初始化变量, 只读const,  g_A,     addr:0x%08x\n\n", &g_A);  
  37.     printf("low address\n");  
  38.     return;  
  39. }  
  40. </stdio>  

运行结果:

  1. hight address  
  2. -------------栈--------------  
  3. 栈,    局部变量,                           local_A, addr:0xffa70c1c  
  4. 栈,    局部变量,(后进栈地址相对local_A低)  local_B, addr:0xffa70c18  
  5. -------------堆--------------  
  6. 堆,    malloc分配内存,             p1,      addr:0x087fe008  
  7. ------------BSS段------------  
  8. BSS段, 全局变量,       未初始化    g_E,     addr:0x08049a64  
  9. BSS段, 静态全局变量,   未初始化,   g_D,     addr:0x08049a5c  
  10. BSS段, 静态局部变量,   初始化,     local_C, addr:0x08049a58  
  11. BSS段, 静态局部变量,   未初始化,   local_D, addr:0x08049a54  
  12. -----------数据段------------  
  13. 数据段,全局变量,       初始化      g_B,     addr:0x08049a44  
  14. 数据段,静态全局变量,   初始化,     g_C,     addr:0x08049a48  
  15. -----------代码段------------  
  16. 代码段,全局初始化变量, 只读const,  g_A,     addr:0x08048620  
  17.   
  18. low address  

注意:
编译时需要-g选项,这样才可以看elf信息;
readelf -a a.out 

查看这个执行文件的elf信息,摘录部分如下:重点注意其中data段,text段还要有bss段的地址,然后比较这个地址和上面的运行结果,是否是在elf文件的各个段的地址之内。

  1. Section Headers:  
  2.   [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al  
  3.   [ 0]                   NULL            00000000 000000 000000 00      0   0  0  
  4.   [ 1] .interp           PROGBITS        08048114 000114 000013 00   A  0   0  1  
  5.   [ 2] .note.ABI-tag     NOTE            08048128 000128 000020 00   A  0   0  4  
  6.   [ 3] .gnu.hash         GNU_HASH        08048148 000148 000020 04   A  4   0  4  
  7.   [ 4] .dynsym           DYNSYM          08048168 000168 000070 10   A  5   1  4  
  8.   [ 5] .dynstr           STRTAB          080481d8 0001d8 000058 00   A  0   0  1  
  9.   [ 6] .gnu.version      VERSYM          08048230 000230 00000e 02   A  4   0  2  
  10.   [ 7] .gnu.version_r    VERNEED         08048240 000240 000020 00   A  5   1  4  
  11.   [ 8] .rel.dyn          REL             08048260 000260 000008 08   A  4   0  4  
  12.   [ 9] .rel.plt          REL             08048268 000268 000028 08   A  4  11  4  
  13.   [10] .init             PROGBITS        08048290 000290 000017 00  AX  0   0  4  
  14.   [11] .plt              PROGBITS        080482a8 0002a8 000060 04  AX  0   0  4  
  15.   [12] .text             PROGBITS        08048310 000310 0002e8 00  AX  0   0 16  
  16.   [13] .fini             PROGBITS        080485f8 0005f8 00001c 00  AX  0   0  4  
  17.   [14] .rodata           PROGBITS        08048614 000614 000326 00   A  0   0  4  
  18.   [15] .eh_frame         PROGBITS        0804893c 00093c 000004 00   A  0   0  4  
  19.   [16] .ctors            PROGBITS        08049940 000940 000008 00  WA  0   0  4  
  20.   [17] .dtors            PROGBITS        08049948 000948 000008 00  WA  0   0  4  
  21.   [18] .jcr              PROGBITS        08049950 000950 000004 00  WA  0   0  4  
  22.   [19] .dynamic          DYNAMIC         08049954 000954 0000c8 08  WA  5   0  4  
  23.   [20] .got              PROGBITS        08049a1c 000a1c 000004 04  WA  0   0  4  
  24.   [21] .got.plt          PROGBITS        08049a20 000a20 000020 04  WA  0   0  4  
  25.   [22] .data             PROGBITS        08049a40 000a40 00000c 00  WA  0   0  4  
  26.   [23] .bss              NOBITS          08049a4c 000a4c 00001c 00  WA  0   0  4  
  27.   [24] .comment          PROGBITS        00000000 000a4c 000114 00      0   0  1  
  28.   [25] .debug_aranges    PROGBITS        00000000 000b60 000020 00      0   0  1  
  29.   [26] .debug_pubnames   PROGBITS        00000000 000b80 00003a 00      0   0  1  
  30.   [27] .debug_info       PROGBITS        00000000 000bba 0001f4 00      0   0  1  
  31.   [28] .debug_abbrev     PROGBITS        00000000 000dae 00006f 00      0   0  1  
  32.   [29] .debug_line       PROGBITS        00000000 000e1d 000058 00      0   0  1  
  33.   [30] .debug_frame      PROGBITS        00000000 000e78 00003c 00      0   0  4  
  34.   [31] .debug_str        PROGBITS        00000000 000eb4 00000d 00      0   0  1  
  35.   [32] .debug_loc        PROGBITS        00000000 000ec1 000043 00      0   0  1  
  36.   [33] .shstrtab         STRTAB          00000000 000f04 000143 00      0   0  1  
  37.   [34] .symtab           SYMTAB          00000000 0015e8 000560 10     35  60  4  
  38.   [35] .strtab           STRTAB          00000000 001b48 0002ad 00      0   0  1  
  39. Key to Flags:  
  40.   W (write), A (alloc), X (execute), M (merge), S (strings)  
  41.   I (info), L (link order), G (group), x (unknown)  
  42.   O (extra OS processing required) o (OS specific), p (processor specific)  

★★★★注意静态变量初始化为零和全局静态变量初始化为零的情况,都是存储在bss段★★★★

从上面的elf文件可以看出,

  [23] .bss              NOBITS          08049a4c 000a4c 00001c 00  WA  0   0  4

  [22] .data             PROGBITS    08049a40000a40 00000c 00  WA  0   0  4

  [12] .text             PROGBITS      08048310000310 0002e8 00  AX  0   0 16

但是在结果中显示: BSS段, 静态局部变量,   初始化,    local_C, addr:0x08049a58 

 (0x08049a58 大于0x08049a4c 属于bss段)是初始化的静态局部变量但是却属于bss段,为什么?

原因是:local_C是局部静态变量但是却初始化为零。这和没有初始化,默认是零的情况一样,都存储在bss段,如果初始化为其他的值,那么local_C这个变量就会存储在data段。

四

可执行文件大小由什么决定?

可执行文件在存储时分为代码段、数据段和BSS段三个部分。

【例一】
程序1:
int ar[30000];
void main()
{
    ......
} 
程序2:
int ar[300000] =  {1, 2, 3, 4, 5, 6 };
void main()
{
    ......
} 
发现程序2编译之后所得的.exe文件比程序1的要大得多。当下甚为不解,于是手工编译了一下,并使用了/FAs编译选项来查看了一下其各自的.asm,发现在程序1.asm中ar的定义如下:
_BSS SEGMENT
     ?ar@@3PAHA DD 0493e0H DUP (?)    ; ar
_BSS ENDS 
而在程序2.asm中,ar被定义为:
_DATA SEGMENT
     ?ar@@3PAHA DD 01H     ; ar
                DD 02H
                DD 03H
                ORG $+1199988
_DATA ENDS 
区别很明显,一个位于.bss段,而另一个位于.data段,两者的区别在于:全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函数内的自动变量都在栈上分配空间。

.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化,因此造成了上述情况。


以上仅仅做为学习只用!!

参考材料:
C程序内存区域分配(5个段作用)
计算机原理探险系列(六)-- 看图认识内存分配 之前的几篇文章里面,我们相应介绍了计算机内部的进程,磁盘,cpu,网络等相关知识点,今天主要来一起探讨下关于计算机的内存分配问题。 有限的物理内存 计算机在运行的时候,其所拥有的内存空间其实是有限的。在早期的Dos操作系统中,通常就是4mb的内存,那时候的应用软件还不怎么流行,基本4mb的内存空间就足够程序运作了。不过到了后期阶段,随着各种硬件设备的不断完善,往往可能会存在内存空间小于程序的大小。(例如:内存空间4mb,程序大小16mb) 解决思路 设计一个虚拟存储器,将需要用到指定程序加载到内存中进行计算 阅读详情

相关推荐

内存区域(五个段)

在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。Segment实际上就是由section组成的,将相应的一些section映射到一起就叫segment了,就是说segment是由0个或多个section组成的,实际上本质都...

1820

内存区域分配与ELF 之类的关系

转载地址:http://blog.youkuaiyun.com/love_gaohz/article/details/41310597 一. 在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这

我有我的天空 4249

关于text段、data段和bss段

根据APUE,程序分为下面的段:.text, data (initialized), bss, stack, heap。 data/bss/text: text段在内存中被映射为只读,但.data和.bss是可写的。 bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。它的

编程的本质是数学问题 1万+

C语言内存分配-附图详解,代码区、常量区、栈区、堆区.......

文章目录C语言程序的内存组成变量以及数组开辟内存空间问题 C语言程序的内存组成 不管对于那种编程语言而言,内存管理都十分重要。对于C语言程序来说,所占用的内存主要有以下几个部分:代码区(所写的C语言的代码以及数据)、静态常量(字符常量)区(定义的字符串常量)、已初始化全局数据区(全局变量被初始化)、未初始化全局数据区、堆区、栈区。 栈区往地址减小方向增长,堆区往地址增大方向增长。 main函数以及自己定义的函数具有临时性,因此在栈上开辟空间。 变量以及数组开辟内存空间问题 ...

weixin_50901244的博客 5273

Windows服务器XMRig挖矿病毒深度清除实战指南

XMRig是一种广泛用于Monero(XMR)加密货币挖矿的开源工具,其在Windows环境中的持久化机制已远超传统木马范畴,融合WMI事件订阅、服务伪装、PowerShell无文件执行与注册表隐写等多重反检测技术。理解其基于行为而非特征的生存逻辑,是实现有效检测与根除的前提。该技术具备强隐蔽性、高自愈性与网络通信合法化特征,常见于RDP弱口令爆破、SMB共享泄露及PowerShell远程执行等非漏洞类入侵场景。本文聚焦Windows原生命令与Sysinternals工具链,提供覆盖进程定位、WMI清理、服

weixin_30535843的博客 730

从零开始深入理解 AI Agent(完整版)

AI Agent(智能体)是一个能够自主感知环境、做出决策、执行行动并记忆经验的智能系统。特性传统程序AI Agent决策方式固定逻辑(if-else)动态推理(LLM 思考)灵活性需要重新编程自然语言描述即可能力边界明确限定可通过工具扩展学习能力无可通过记忆积累经验│ 感知 │ ───→ │ 推理 │ ───→ │ 行动 │↑ │ ││ ↓ ││ 记忆 │ ←─── │ 反思 │ ←─────────┘感知(Perception)

qq_20096229的博客 754

C语言内存四区的学习总结(一)---- 静态区

最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享。 一、内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如何去存储,运行。。。。 ​ 程序运行的流程说明 1、操作系统把物理硬盘代码 load到内存 2、操作系统把c代码分成四个区 3、操作系统找到 main函数入口执行 二、各区元...

a2196779的博客 1071

永磁同步电机ADRC控制策略优化:从理论到Simulink仿真实践

本文深入探讨了永磁同步电机自抗扰控制(ADRC)策略的优化与实践。针对传统PID在动态响应、抗扰及噪声抑制方面的不足,详细解析了ADRC三大核心组件——跟踪微分器(TD)、扩张状态观测器(ESO)与非线性状态误差反馈(NLSEF)的工作原理。通过手把手的Simulink仿真教程,展示了从算法编写、模型搭建到参数整定的完整流程,并进阶实现了位置-速度双环ADRC协同控制,为高性能电机伺服系统设计提供了从理论到实践的清晰指南。

root9的博客 412

程序或-内存区域分配(五个段)--终于搞明白了

一. 在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从文件内容上存储的方式,spec上有张图是比较经典的:如上图: 其实从文件存储的格式来说,上面的两种view实际上是一样的,Segm...

@奮 鬥@的专栏 3万+

人形机器人硬件开发:骨架系统设计全攻略

本文以人形机器人骨架系统为核心研究对象,系统解析其从理论建模到工程实现的全流程设计方法。通过融合刚体力学、材料科学与机器人控制理论,构建"概念基础-理论框架-架构设计-实现机制-实际应用-高级考量-综合拓展"的七层分析体系。重点覆盖运动学/动力学建模、轻量化结构设计、关节模块集成、多物理场耦合优化等关键技术,结合波士顿动力Atlas、本田ASIMO等经典案例,提供从原型设计到量产验证的工程实践指南。

AI天才研究院 1869

XSS漏洞之PDF生成:从XSS到服务端任意文件读取

XSS是最为常见的Web漏洞之一,多年来连续入选OWASP TOP10,相信大家都耳熟能详。 它是一种代码注入类的攻击,是一种客户端侧的攻击,攻击者通过在Web应用中注入恶意JavaScript代码,通过点击URL,最终在受害者浏览器端执行的一种漏洞。主要有反射型XSS、存储型XSS、基于DOM的XSS三类。XSS一些比较常规的危害大概有:重定向浏览器、窃取Cookie、浏览器劫持等。本文章侧重于发现XSS后的进一步利用。 主要介绍在某次实际测试过程中,发现XSS漏洞之后,如何进一步的利用,最终通过XSS达

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 3776

程序或-内存区域分配(五个段)---分析很好

原文地址:http://blog.youkuaiyun.com/love_gaohz/article/details/41310597   一、 在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从...

潜心钻研 521

基于Gurobi的综合能源系统运行优化:鲁棒两阶段优化方法

本文提出了一种基于Gurobi的综合能源系统鲁棒两阶段优化方法,针对包含换电站、光伏发电和电池储能的系统运行问题。研究采用多面体不确定性集合描述光伏出力随机性,构建了考虑电池衰减成本和弃光惩罚的两阶段优化模型:第一阶段制定日前调度计划,第二阶段处理实时运行中的不确定性。通过列与约束生成算法求解模型,并使用Python和Gurobi实现。仿真验证了该方法能有效平衡系统经济性与鲁棒性,为含高比例可再生能源的综合能源系统运行提供了实用解决方案。

huanghm88的专栏 240

程序内存分配

说是iOS程序的内存分配,但不仅限于此,C++以及其他程序也大致如此。 1> 内存分配分为5个区: 1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似 于链表,呵呵。 3、全局区(静态区)(s

luobo140716的专栏 550

高速PCB设计中的一些常用规则

目前,高速PCB产品设计中,高速接口的应用日益普及,对于复杂的设计而言,高速走线就如同“蜘蛛网”一样密布在PCB各处,因此,在进行PCB检查及评审时,必要的高速PCB设计经验法则及规则是工程师开展工作必不可少的知识储备。

一只豌豆象的博客 3413

AgentScope Java 2.0 项目实战:从零构建企业级自主Coding Agent

本文基于 AgentScope Java 框架,完整拆解两个生产级 AI Agent 项目的从零开发全过程。其一是企业级自主编码机器人(agentscope-codingagent),支持 Issue→PR 自动实现、PR Code Review、Docker 沙箱隔离执行与多通道接入;其二是个人 AI 助手管理平台(agentscope-paw),采用 Spring Boot + React 全栈架构,支持多 Agent、技能市场与多 IM 通道。

program哲学 833

程序内存区域分配(五个段)--终于搞明白了

在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从文件内容上存储的方式,spec上有张图是比较经典的:如上图: 其实从文件存储的格式来说,上面的两种view实际上是一样的,Segment实际上...

坚持 5909

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

.bss段和.data段

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 代码段:代码段(code segment/text seg...

qq_34888036的博客 4万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

BSS段

(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack) 1 关于BSS段的大小 2 1. BSS段中的内容 2 2.BSS段在加载运行前的处理 3 3.BSS段的作用 3 4. 代码优化对BSS段的影响 3 5.Linux 下查看段属性的指令: 4 BSS大小实验 4 清除BSS段的一般做法 6 link脚本一般包含类似语句: 6   (深...

longtype的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

text段、data段和bss段知识介绍

一、总体概述1、bss(可读可写)     bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的RAM区内,源程序中使用malloc分配的内存就是这一块,它不是根据data大小确定,主要由程序中同时分配内...

superjiangzhen的博客 2万+
上一篇: C语言规范:C89、C90、C95、C99
下一篇: wifi一键配网smartconfig原理及应用
evilcode
博客等级 码龄20年 307粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值