linux-进程的虚拟地址空间

进程

是执行中的程序(程序是存储在磁盘上的二进制可执行文件,指令+数据)

linux-进程的虚拟地址空间

虚拟地址空间

程序运行后进程拥有自己独立的虚拟空间

大小: CPU位数决定 如果32位是4G 指针大小与虚拟地址空间位数相同(寻址空间== 虚拟地址空间)
32 位平台 *p 32位==4byte 64位 *p 64位 == 8 byte

Linux下布局

linux-进程的虚拟地址空间

linux-进程的虚拟地址空间

1.内核空间
read fork open等(系统api),在内核空间(1G)
2
局部变量存放在栈中
栈内存区的地址是连续的,鲧统控制速度较快
3.
堆内存区的地址是不连续的,它是系统将空闲内存块链接起来的链表,用户new/malloc请求分配时,找到第一个满足大小要求的块从链表中删除此节点,然后分给用户,没有栈内存速度快,但是很灵活。
4.bss
bss存入的是未初始化的全局变量
5.data
data字放已经初始化的全局变量、静态变量和常量
6.加载共享库(动态链接库)
Linux下叫共享库;Windows下叫做动态库。
*.dll 是Windows上动态库的形式;
*.so是Linux上动态库的形式。
7.命令行参数和环境变量
环境变量和命令行参数都是一组字符串,环境变量是操作系统传递给进程的一组字符串信息。比如path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找.
命令行参数列表是由 char **argv 指向,字符串个数由 int argc 指明,它们就是 main 函数的两个参数,还有一个全局变量 char **envp 它指向环境表(环境字符串的集合)并以NULL空串结尾,只是我们习惯省略这些,所以我们常写的 int main() 其实是:int main(int argc,char *argv[ ],char *envp[ ])。