ARM64的内核栈、用户栈、寄存器上下文
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)
ARM64的内核栈、用户栈、寄存器上下文的更多相关文章
- linux内核栈用户栈切换【转】
转自:http://www.kerneltravel.net/kernel-book/%E7%AC%AC%E5%9B%9B%E7%AB%A0%20%E8%BF%9B%E7%A8%8B%E6%8F%8F ...
- TSS 内核栈 用户栈的关系
http://blog.sina.com.cn/s/blog_673ef8130100qaje.html 该博客不错,有不少有用的信息 中断程序的一开始我们执行一个PUSHALL,把这些积存器保存在核 ...
- linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
1.特权级 Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提 ...
- linux中断--进程上下文和中断上下文
一.前言 中断发生以后,CPU跳到内核设置好的中断处理代码中去,由这部分内核代码来处理中断.这个处理过程中的上下文就是中断上下文. 为什么可能导致睡眠的函数都不能在中断上下文中使用呢? 首先睡眠的含义 ...
- linux进程、调度、线程、进程上下文等几点理解
1.信号来自进程或内核 2.线程共享进程的代码空间和数据空间(全局变量或静态变量),文件描述符,信号,以及malloc分配的内存,每个线程拥有独立的栈空间和程序计数器,在创建线程时,调用pthread ...
- 进程上下文VS中断上下文
转载:http://www.cnblogs.com/zzx1045917067/archive/2012/12/19/2824552.html 内核空间和用户空间是现代操作系统的两种工作模式,内核模块 ...
- Linux进程空间分布 & 上下文
Linux使用两级保护机制:0级供内核使用,3级供用户程序使用.从图中可以看出,每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的.最高的1GB字节虚拟内核空间则为所有进程 ...
- Linux内核中进程上下文和中断上下文的理解
參考: http://www.embedu.org/Column/Column240.htm http://www.cnblogs.com/Anker/p/3269106.html 首先明白一个概念: ...
- 转:进程上下文VS中断上下文
源地址:http://www.cnblogs.com/zzx1045917067/archive/2012/12/19/2824552.html 内核空间和用户空间是现代操作系统的两种工作模式,内核模 ...
随机推荐
- WASM 成为 HTML、CSS 与 JS 之后的第 4 门 Web 语言
大家都知道,万维网联盟 W3C 认证的 Web 语言有 HTML.CSS 与 JavaScript,而近日联盟正式宣布 WebAssembly 核心规范(WebAssembly Core Specif ...
- CMKAE简单实用指南
CMake is an open-source, cross-platform family of tools designed to build, test and package software ...
- 搞定vscode编写java(手把手篇)
1: 下载VSCODE 本来我写过一个 vscode 编写java 帖子,但是 还是很多人私信我,下面写一个手把手教程 原文地址: https://www.cnblogs.com/dgwblog/p/ ...
- C++入门到理解阶段二基础篇(7)——C++函数
目录 函数作用 函数定义 函数声明 函数调用 函数值传递 函数常见的样式 函数的分文件书写 函数作用 将经常使用的代码封装起来,减少重复代码 函数定义 C++ 中的函数定义的一般形式如下: retur ...
- ef实现一次查询多个聚合函数的字段
想用ef来写一个统计字段的语句,如下所示 select sum(price) as price_total, sum(amount) as amount_total from table1 发现似乎实 ...
- PlayJava Day017
今日所学: /* 2019.08.19开始学习,此为补档. */ 1.数组变量 a.数组变量是数组的管理者而非数组本身 b.数组必须创建出来然后交给数组变量来管理 c.数组变量之间的赋值是管理权限的赋 ...
- PlayJava Day014
今日所学: /* 2019.08.19开始学习,此为补档. */ 1.Random生成的随机数是伪随机数,因为只要两个Random对象的种子相同,而且方法的调用顺序也相同,则产生的随机数相同. Ran ...
- jenkins-pipeline里使用docker命令
在jenkins的pipeline里,就是jenkinsfile文件里,如果希望调用docker来构建镜像,需要进行以下配置! tools{}里添加docker是失败的,这个我找了很多资料,最后需要e ...
- ES6-新增的数组操作,数组解构,forEach,fillter,some.map的数组遍历,数组转换字符串
ES6-新增的数组操作 // es6数组格式 let json = { '0' : 'anan', '1' : 'anani', '2' : 'anania', length:3 } //es6 把数 ...
- vue-cli 项目启动过程分析
启动时没有加入路由 先npm run dev 把项目启动起来.看到 这个熟悉的界面. 首先看到: 这是项目的入口文件,一般引用其他的js,也都是在这个文件进行引用的. 渲染的时候,就是对这个id=&q ...