C专家编程(5-6)

    技术2022-05-11  31

    运行是的数据结构

    1a.out是编译和链接的输出文件

    2、几种文件格式

    System V的可执行文件格式ELF Extensible Linker Format or Executable and Linking Format

    其他一些系统的文件格式:COFF (Common Ojbect-File Format)公共目标文件格式

    3size a.out 可以输出三个段(文本、数据、bss)的大小,nmdump都可以用于查看可执行文件的内容。

    Bss段内只注明定义而未初始化的变量的大小

    数据段为初始化后的全局和静态的变量

     

    4、运行时载入器取文件中的段的映象放入内存中(图2

     

    bss段的大小在内存中开出一个内存区

    堆栈段用于保存局部变量、临时数据、传递到函数的参数,还有通过malloc()函数分配的内存。

    地址最低端未被映射的部分,对他的引用将会引起错误,他用于捕捉使用空指针和小整数型值的指针引用内存的情况。

    5、程序运行时数据结构有堆栈、活动记录、数据、堆

    堆栈通过sp维护,并且可以修改堆栈里面的值

    堆栈的三个作用:

    内部声名的局部变量、函数调用时存储一些维护性信息、malloc()函数分配空间

    6、过程活动记录在内存中的布局

    对局部变量指针的引用会造成错误

    7setjmplongjmp的用途

           setjmpjmp-buf j)先被调用,使用变量记录当前的位置(pcsp),返回0

           longjmpjmp-buf j, int i    //返回到j记录的位置,函数返回i;还注销了j的内容;

    setjmp/longjmp的用途是错误返回;

    8、一些工具

    对内存的思考

    1、  intel808620位地址形成

    1、  intel 80x86内存模型和工作原理

    8086的段是一块64k的内存区域,段地址放在段寄存器中,偏移地址(段内地址)为指令提供;

    2、  虚拟内存

    虚拟内存以“页”的形式组织,可以通过/usr/ucb/pagesize来观察你的系统页的大小,MMU对页进行管理和操作

    3、  每个进程内存管理

    管理内存可调用:mallocfree——从内存中分配指定大小的内存块和释放

                                 brksbrk——调整数据段的大小至一个绝对值

    4、  内存泄露问题

    堆出现的两个问题

    1)、使用未释放的内存区(数据错误)

    2)、未释放不用的内存区(内存泄露)

    可以使用/usr/sbin/swap –s来查看有多少可用的交换空间

    5、  总线错误

    1)、bus error core dumped 总线错误(信息转储)

    在分配内存的时候都以类型大小的整数倍为边界,若地址未对齐是进行读或写就会引起总线错误,象将char的指针转换为int指针就会出错。

    2)、segmentation error core dumped)段错误 (信息转储)

    由于内存管理单元的异常所致,解除一个未初始化或非法值的指针引起的

    引起段错误的几个原因:

    1)、解除引用一个非法指针

    2)、解除引用一个空指针

    3)、在未得到权限的时进行访问

    4)、用完堆栈和内存

    发生的频率:a、坏指针的使用;b、改写的错误(超过数组的边界);c、指针释放的错误(多次释放指针和释放未使用的内存);

    系统在出现总线错误和段错误后进行信息转储并终止,也可以设置一个信号处理程序进行处理

     


    最新回复(0)