首页 > 系统相关 >Linux 函数调用的用户态与内核态

Linux 函数调用的用户态与内核态

时间:2023-10-25 22:32:11浏览次数:39  
标签:32 Linux 栈顶 函数调用 64 内核 寄存器

在用户态中,程序的执行往往是一个函数调用另一个函数。函数调用都是通过栈来进行的。

在进程的内存空间里面,栈是一个从高地址到低地址,往下增长的结构,也就是上面是栈底,下面是栈顶,入栈和出栈的操作都是从下面的栈顶开始的。

Linux 函数调用的用户态与内核态_Linux

32 位操作系统在 CPU 里,ESP(Extended Stack Pointer)是栈顶指针寄存器,入栈操作 Push 和出栈操作 Pop 指令,会自动调整 ESP 的值。另外有一个寄存器 EBP(Extended Base Pointer),是栈基地址指针寄存器,指向当前栈帧的最底部。

例如,A 调用 B,A 的栈里面包含 A 函数的局部变量,然后是调用 B 的时候要传给它的参数,然后返回 A 的地址,这个地址也应该入栈,这就形成了 A 的栈帧。接下来就是 B 的栈帧部分了,先保存的是 A 栈帧的栈底位置,也就是 EBP。因为在 B 函数里面获取 A 传进来的参数,就是通过这个指针获取的,接下来保存的是 B 的局部变量等等。

当 B 返回的时候,返回值会保存在 EAX 寄存器中,从栈中弹出返回地址,将指令跳转回去,参数也从栈中弹出,然后继续执行 A。

对于 64 位操作系统,模式多少有些不一样。因为 64 位操作系统的寄存器数目比较多。rax 用于保存函数调用的返回结果。栈顶指针寄存器变成了 rsp,指向栈顶位置。堆栈的 Pop 和 Push 操作会自动调整 rsp,栈基指针寄存器变成了 rbp,指向当前栈帧的起始位置。

改变比较多的是参数传递。rdi、rsi、rdx、rcx、r8、r9 这 6 个寄存器,用于传递存储函数调用时的 6 个参数。如果超过 6 的时候,还是需要放到栈里面。

然而,前 6 个参数有时候需要进行寻址,但是如果在寄存器里面,是没有地址的,因而还是会放到栈里面,只不过放到栈里面的操作是被调用函数做的。

Linux 函数调用的用户态与内核态_Linux_02

以上的栈操作,都是在进程的内存空间里面进行的。

当系统调用从用户态到内核态的时候,首先要做的第一件事情,就是将用户态运行过程中的 CPU 上下文保存起来,其实主要就是保存在这个结构的寄存器变量里。这样当从内核系统调用返回的时候,才能让进程在刚才的地方接着运行下去。

  • 在用户态,应用程序进行了至少一次函数调用。32 位和 64 的传递参数的方式稍有不同,32 位的就是用函数栈,64 位的前 6 个参数用寄存器,其他的用函数栈。
  • 在内核态,32 位和 64 位都使用内核栈,格式也稍有不同,主要集中在 pt_regs 结构上。
  • 在内核态,32 位和 64 位的内核栈和 task_struct 的关联关系不同。32 位主要靠 thread_info,64 位主要靠 Per-CPU 变量。

Linux 函数调用的用户态与内核态_Linux_03


标签:32,Linux,栈顶,函数调用,64,内核,寄存器
From: https://blog.51cto.com/key3feng/8025853

相关文章

  • Linux p9 帮助指令
    【学习课程】:【【小白入门通俗易懂】2021韩顺平一周学会Linux】https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e0549e帮助指令man指令功能描述:获得帮助信息基本语法:man[命令或配置文件]例如:mamls......
  • Linux第八周技术博客
    今天我们继续学习继续学习高级权限首先学习的suid权限,/usr/bin/passwd文件里存储的是用户信息,使用ll命令查看/usr/bin/passwd文件ll/usr/bin/passwd-rwsr-xr-x.1rootroot278564月12020/usr/bin/passwd发现第四个字母是s,s表示特殊权限suid权限的含义为给没有相应权......
  • VM安装linux虚拟机宿主机连接不上虚拟机问题处理及静态ip设置
    https://blog.csdn.net/onlyonexhj/article/details/131273066centos7中的网络设置#虚拟机网络配置文件vi/etc/sysconfig/network-scripts/ifcfg-ens33修改完成后重启虚拟机网络systemctlrestartnetwork1尝试连接百度看是否能ping通 至此网络配置全部完成,最后别忘了关......
  • Linux用户管理
    Linux的用户分为:超级用户,系统用户,普通用户。UID与GID:UID为用户的id,GID为用户所属组的id。 Linux是一个多任务多用户的系统:        在系统各种会存在这多个用户。我们的使用者靠用户名来区分各自登陆的账号。        如果我们的用户想要使用系统资源,就必须在......
  • 初识Linux(swxy,2021tln)
    什么是Linux,为什么要学习Linux,这是我们学习Liunx的第一步。Linux是一套操作系统,与windows,苹果电脑的macOSX一样,都是可以在电脑上运行的操作系统。但是相对于windows7,windows10,以及macos来说,Linux在个人电脑上可以说是很小众了,在我们的日常生活中可能根本看不到。其实不然,Lin......
  • LINUX基础知识和命令 二
    LINUXalias(别名)自定义命令=原始命令原始命令中有特殊符@#%()请打上引号,单双无所谓例:vim/etc/sysconfig/network-scripts/ifcfg-ens33aliasmyvim=“vim/etc/sysconfig/network-scripts/ifcfg-ens33”下次可以直接打myvim  alias直接打显示当前系统所有的别名在Li......
  • Linux第四次周总结
    4.3.2SGID权限在一个程序上添加SGID,用户在执行过程中会获得该程序用户组的权限(相当于临时加了程序地用户组)。在一个目录上添加SGID,该目录下新创建的文件会继承其属组。4.3.3Sticky权限添加Sticky后,当用户对目录具有w、x权限,在该目录下建立的文件或目录,仅有自己与root才有权......
  • Linux-sed命令
    Linux-sed命令sed(StreamEDitor):流编辑器,是一个非交互式命令行文本编辑器。用于在一个输入流(一个文件或者管道上的输入)上执行基本文本的转换语法完整的sed命令格式sedOPTIONS...[SCRIPT][INPUTFILE...]OPTIONS:表示选项SCRIPT:表示脚本,脚本由地址(addr)、命令(opt......
  • Linux/UNIX系统编程手册 Michael Kerrisk/孙剑 pdf电子版
    Linux/UNIX系统编程手册MichaelKerrisk/孙剑pdf电子版下载作者: MichaelKerrisk / 孙剑原作名: TheLinuxProgrammingInterface:ALinuxandUNIXSystemProgrammingHandbook出版年: 2014-1ISBN: 9787115328670连接提取码:hfkr内容确实组织得比APUE更适合系统学习......
  • Android系统SELinux详解
    前言SELinux是一种加强文件安全的一种策略,可以更好地保护我们的Android系统,比如限制系统服务的访问权限、控制应用对数据和系统日志的访问等措施,这样就降低了恶意软件的影响,并且可以防止因代码存在的缺陷而产生的对系统安全的影响。从系统安全方面考虑,SELinux是保护神,但是从软件开......