链接、装载与库[6]可执行文件的装载与进程

1.虚拟内存区域(VMA)

  • 操作系统创建进程后,会在进程相应的数据结构中设置一个.text段的VMA。VMA对于理解程序的装载执行和操作系统如何管理进程的虚拟空间有非常重要的帮助。

2.进程栈初始化

  • 进程启动的时候需知道进程运行的系统环境变量运行参数,常见做法是将其保存到进程的虚拟空间的栈中(Stack VMA)。假设系统中有两个环境变量:1)HOME = /home/user;2)PATH = /usr/bin;有两个参数1)prog;2)123;栈顶地址为0xBF801FBC

在这里插入图片描述

  • 进程在启动以后,程序的库部分会把堆栈里的初始化信息中的参数信息传递给main(),即main的两个argc(命令行参数数量)和argv(命令行参数字符串指针数组)两个参数。

3.魔数

  • 系统内核函数sys_execve()调用do_execve(),do_execve()读取可执行文件的前128个字节以判断文件的格式。每种文件开头的几个字节很特殊,尤其是开头4个字节,它们被称为魔数
  • 通过对魔数的判断可以确定文件的格式和类型。例如JAVA的可执行文件格式头4个字节为’c’‘a’‘f’‘e’;被执行的是Shell脚本或perl、python等解释型语言的脚本,那它们的第一行往往是
    “#!/bin/sh”“#!/usr/bin/perl”"#!/usr/bin/python"

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/113857480