ARM64的内核栈、用户栈、寄存器上下文【转】
发布日期:2021-09-16 04:36:45 浏览次数:3 分类:技术文章

本文共 1217 字,大约阅读时间需要 4 分钟。

非常好的一篇文章,转载: 

1. 内核栈的分配,即thread_info的分配,是在do_fork->dup_task_struct中分配(默认为2个pages),并赋值给task_struct->stack;

2. 用户栈的分配分两种:

  一是pthread create会事先mmap分配好用户栈,传给do_fork->copy_thread:用户栈起始地址会赋值给pt_regs->sp,接着设置内核栈底p->thread.cpu_context.sp = (unsigned long)childregs

  二是fork时,借用了父进程的线程栈,若ret_from_user后应用层调用了exec->do_execuveat_common->exe_binprm->search_binary_handler->load_elf_binary->set_arg_pages,重新分配用户栈,接着调用start_thread配置pt_regs;

3. 内核态(SVC模式)下的寄存器上下文存放位置:task_struct的thread成员,类型为struct thread_struct;

4. 用户态(非异常模式)下的寄存器上下文存放位置:内核栈的底部。可如此获取(task_pt_regs(task_struct)):struct task_struct的stack成员指向struct thread_info,thread_info即为内核栈的起始地址,thread_info+内核栈的固定大小(2 page),即为struct pt_regs的结束地址,pt_regs即为用户态寄存器上下文的存放位置;

5. thread_info的task成员指向task_struct结构体;

6. 进程切换只会发生在内核态,即进程切换只需要考虑内核态的寄存器上下文切换,见schedule->__schedule->switch_to->cpu_switch_to中,将当前的regs保存到current->thread->context,同时恢复nex taskt的regs;

7. 发生系统调用/异常时,需要保存用户态/内核态的寄存器上下文,此时通过kernel_entry,将用户态/内核态的regs保存于异常模式的栈中,当异常完成后,调用kernel_exit,将用户态/内核态的regs恢复;

综上,只要知道了task_struct,即可知道内核栈的起始地址(即thread_info=task_struct->stack),也知道了内核态的寄存器上下文(即task_struct->thread->context);同时,也知道了用户态寄存器上下文(即task_struct->stack+kthread_stack_size-sizeof(pt_regs)),从而知道用户栈的当前地址(即pt_regs->sp)

转载地址:https://blog.csdn.net/wllabs/article/details/109695002 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:systemd 托管的进程热升级中,systemd的一些坑
下一篇:librbd 简单学习例子

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.249.68.22]2022年05月22日 12时53分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

oracle加入开机自启动,设置oracle开机自启动 2019-12-01 15:24:45
php查一个变量返回值,PHP语言中,______函数能检测一个变量是否存在,返回true表示变量存在,false表示变量不存在;______函数可以删除一个指定的变量,没有返回值。... 2019-12-01 15:24:45
php web启动客户端程序,php – CodeIgniter Web服务客户端 2019-12-01 15:24:45
oracle linux网卡uuid,oraclelinux系统udev配置 2019-12-01 15:24:46
linux 监控丢包 脚本,网络丢包监控脚本 2019-12-01 15:24:46
php so目录下,1.框架目录结构 2019-12-01 15:24:43
php面向对象对象的属性,PHP面向对象的基本属性分析 2019-12-01 15:24:43
java第五章上机流程图,java课程设计任务书(软件外包服务专业) 2019-12-01 15:24:44
php中mongodb更新数据类型,Mongodb基本数据类型、常用命令之增加、更新、删除 2019-12-01 15:24:44
matlab gui电机,基于MATLAB GUI的感应电机性能分析界面设计.docx 2019-12-01 15:24:44
oracle查字段中的某一个数据,解析如何查看Oracle数据库中某张表的字段个数 2019-12-01 15:24:44
dbmanage php,index.php 2019-12-01 15:24:44
oracle 11gr2版本gi新增组件,Oracle 11gR2 GI安装时的等效性问题 2019-12-01 15:24:44
Lnmp1..4升级php版本,LNMP 升级Nginx、MySQL/MariaDB、PHP教程 2019-12-01 15:24:42
matlab可以做影像组学吗,影像组学分析与建模工具综述.PDF 2019-12-01 15:24:42
matlab输出一个excel表格,matlab数据输出为excel表格-怎样将MATLAB中的数据输出到excel中... 2019-12-01 15:24:42
php的$_files变量,PHP超全局变量$_FILES 2019-12-01 15:24:43
php生成验证码 feanmy,PHP-RSA加密跨域通讯实战 2019-12-01 15:24:43
openstf mysql_STF:执行stf local失败:Error:Could not locate the bindings file. 2019-12-01 15:24:41
java非法字符uff08_js使用技巧收藏 2019-12-01 15:24:41