程序的段,堆与栈

xiaoxiao2021-02-27  400

在硬件里面,内存单元需要占用CPU的地址,但是不是所有的地址都对应着内存单元。

因为在嵌入式里,通常情况下内存都不会很大,不会把CPU的地址占用完的.

:s5p6818芯片里,内存单元最大只能占用2G地址.

一个进程理论上可以访问4G地址.进程在系统里是独立的,进程间的空间是不能跨进程访问的.

如果在进程里访问的地址不属于此进程的则会发生段错误.

通常情况下,书上提的Memory其实是指“地址”

int num; &num是取地址.

指针也是变量的一种,它用于存放其它变量的地址,不要忘了它本身也有地址.

如果函数的参数是指针,调用此函数时提供的参数值为地址.

如果函数的返回值类型为指针,则表示此函数是返回一个地址,接收此函数的返回值时用相同类型指针变量来存放返回地址.

程序就是编译出来的镜像,处于执行状态的程序叫进程.一个程序可以执行多次,每次执行会产生一个进程.

//

程序镜像里有分成很多个段:

段其实就是在程序镜像文件里从一个位置到另一个位置范围里存放某种数据,便于系统在加载程序生成进程时的处理.

我们最需要注意的段:.text .rodata .data .bss

具体查看一个程序镜像里的段的内容可以通过反汇编查看:

objdump-D a.out

.text段用于统一存放整个程序的代码指令

.rodata段用于统一存放整个程序的只读的数据内容.只读数据段里的内容只能读,如作写操作则会发生段错误.

存放只读的全局变量的值,字符串常量的值, 静态的只读的局部变量的值.(静态的局部变量可看成限制访问范围的全局变量)

代码:

1 2const int num = 0x99; 3int main(void) 4{ 5 static const int kk = 0x77; 6 char *p = "000111aaabbb"; 7 8 p[2] = 0; //会发生段错误 9 return 0; 10} 反汇编查看.rodata: Disassemblyof section .rodata: 0000000000400590<_IO_stdin_used>: 400590: 01 00 add
转载请注明原文地址: https://www.6miu.com/read-2874.html

最新回复(0)