1、C和C++写代码必须通过编译、链接,才能得到可执行程序,可执行文件本身在磁盘存着,若要运行它,必须把它加载到内存。因为cpu从内存访问数据的效率远远大于从磁盘访问数据的效率。
2、那么要加载到内存,都要加载哪些东西呢?
无论那种语言写代码都只产生指令和数据。
3、把数据和指令加载到内存后如何区分二者呢?
一个计算机系统有CPU、内存、I/O,操作系统为了屏蔽底层硬件的差异,使应用层的用户使用统一的接口去编写策划程序,给我们提供了很多抽象技术。
进程、虚拟内存、虚拟文件系统是操作系统内核的重要部分。
系统内核屏蔽了底层硬件,只要有操作系统在,所写的代码生成的可执行文件不可能直接被加载到物理内存上,那被加载到哪了呢?
4、虚拟内存
虚拟内存的大小与操作系统的位数有关(CPU位数),那么CPU位数又与什么有关呢?
基于X86的32位Linux内核,CPU的位数有32位。CPU主要是运算数据的,它的位数代表它一次能计算的最长整数的宽度,CPU在ALU算术逻辑单元中运算。也就是说CPU的位数就是ALU算术逻辑单元的宽度,数据总线的条数怎么来呢?对于32位来说数据总线和地址总线都是32,但是不是所有CPU位数的数据总线和地址总线条数相等。16位CPU的数据总线16条,地址总线20条;8位CPU的数据总线8条,地址总线16条;所以CPU并不是地址总线的条数。
5、虚拟内存和CPU位数有关,所以32位CPU的大小为4G,2^32=4G。一个程序一运行不会直接去物理内存,而是会先得到一块4G的虚拟地址空间。那这4G的布局是怎样的呢?
6、数据段分为.data和.bss,数据初始化了的或者不为0的放在.data中;无初始化或者为0的放在.bss中。
7、程序运行起来还没有堆,当运行到malloc/new时才会有堆,但堆的内存已经预留好了;程序运行起来必须有.text、.data、.bss、栈;
为什么有栈呢?因为程序运行以后要进入第一个函数,函数的运行必须提供栈上的内存。
8、局部变量属于指令,全局变量、静态全局变量、静态局部变量属于数据。