C专家编程(5-6)

运行是的数据结构

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、指针释放的错误(多次释放指针和释放未使用的内存);

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

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页