X86-64和ARM64用户栈的结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了X86-64和ARM64用户栈的结构相关的知识,希望对你有一定的参考价值。

背景

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

进程的创建

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

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

用户进程栈的初始化

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

以上是关于X86-64和ARM64用户栈的结构的主要内容,如果未能解决你的问题,请参考以下文章

X86-64和ARM64用户栈的结构 ---进程用户栈的初始化

X86-64和ARM64用户栈的结构 ---_start到main

x86-64 C Calling Convention

Playstore 会拒绝带有 armeabi-v7a、arm64-v8a、x86 但不支持 x86-64 的应用程序吗?

X86/64架构中的总线 和 ARM架构中总线的理解

AMD64和X86_64