X86-64和ARM64用户栈的结构

匿名 (未验证) 提交于 2019-12-03 00:40:02
背景

????主要基于Linux,介绍X86-64和ARM64的用户栈结构。断断续续的学了很多和栈相关的知识,今天打算整理用户栈相关的知识,废话少说,下面进入正题。在最初的最初,用户栈是OS创建的。

进程的创建

????一个用户进程从无到开始运行,需要经过几个重要的步骤:

  • Linux首先创建一个task_struct用于管理进程的方方面面。
  • 建立进程的虚拟地址空间,也即建立页表,建立虚拟地址到物理地址的映射,到这时一个用户进程所需的基本元素已经具备,到这里frok()的任务基本完成。
  • 接下来就需要可执行文件本身的参与,读取可执行文件头,解析文件头,文件头的前几个字节会指出当前文件是何种类型,如果是#!/bin/sh或 #!/bin/python 则该文件是脚本文件,有负责脚本文件的加载程序,本文只关注可执行文件。建立虚拟地址和可执行文件之间的映射。
  • 初始化进程环境,其中比较重要的一项便是初始化用户进程栈
  • 跳转到可执行文件的入口,执行可执行文件,一个用户进程就开始运行起来了

用户进程栈的初始化

在进程刚开始运行的时候,需要知道运行的环境和用户传递给进程的参数。一般来说,Linux会在用户进程运行前,将系统的环境变量和用户给的参数保存到用户虚拟地址空间的栈中。

原文:http://blog.51cto.com/iamokay/2138525

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!