进程标示符
进程 id(PID)
父进程id(PPID)
进程位置
进程内存映像
Linux下C程序生成主要由四个步骤组成:预编译、编译、汇编、链接。编译器gcc经过 预编译、编译、汇编3个步骤将源程序⽂文件转换成目标文件。如果程序有多个目标文件或程 序中使用了库函数,则编译器还需要将所有目标文件及所需的库文件链接起来,最后生成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中,程序转为为进程通常需要以下步骤:
*内核将程序读入内存,为程序分配内存空间;
*内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行。程序转化为进程后就可被操作系统的调度程序执行了。进程的内存映像是指内核在内存中如何存放可执行程序文件。在将程序转化为进程的过程中,操作系统将可执行程序从硬盘复制至内存中,其布局如下:
C地址空间测试代码:
#include <stdio.h>
#include <stdlib.h>
int g_val = 100;
void test()
{
int a = 10;
int b = 10;
printf("test stack1 address : 0x%x\n", &a);
printf("test stack2 address : 0x%x\n", &b);
}
void(*fp)(); int main()
{
int a = 10;
int *heap = malloc(sizeof(int));
fp = test;
printf("code address : 0x%x\n", fp);
printf("data address : 0x%x\n", &g_val);
printf("heap address : 0x%x\n", heap);
printf("main stack0 address : 0x%x\n", &a);
fp();
return 0;
}
进程映像的位置依赖于使用的内存管理方案。
可执行程序与进程内存映像的不同之处在于:
a.可执行程序位于磁盘中而内存映像位于内存;
b.可执行程序没有栈,因为程序被加载到内在中才会分配堆栈;
c.可执行程序虽然也有未初始化数据段但它并不被存储在位于硬盘中的可执行文中;
d. 可执行程序是静态的、不变的,而内在映像随着程序的执行是在动态变化的,比如数据段随着程序的执行要存储新的变量值,栈在函数调用时也是不断在变化中。