linux进程tss和ldt,x86体系下linux中的任务切换与TSS
tss的作用举例:保存不同特权级别下任务所使用的寄存器,特别重要的是esp,因为比如中断后,涉及特权级切换时(一个任务切换),首先要切换栈,这个栈显然是内核栈,那么如何找到该栈的地址呢,这需要从tss段中得到,这样后续的执行才有所依托(在x86机器上,c语言的函数调用是通过栈实现的)。只要涉及地特权环到高特权环的任务切换,都需要找到高特权环对应的栈,因此需要esp2,esp1,esp0起码三个esp,然而linux只使用esp0。
tss是什么:tss是一个段,段是x86的概念,在保护模式下,段选择符参与寻址,段选择符在段寄存器中,而tss段则在tr寄存器中。
intel的建议:为每一个进程准备一个独立的tss段,进程切换的时候切换tr寄存器使之指向该进程对应的tss段,然后在任务切换时(比如涉及特权级切换的中断)使用该段保留所有的寄存器。
linux的做法:
1.linux没有为每一个进程都准备一个tss段,而是每一个cpu使用一个tss段,tr寄存器保存该段。进程切换时,只更新唯一tss段中的esp0字段到新进程的内核栈。
2.linux的tss段中只使用esp0和iomap等字段,不用它来保存寄存器,在一个用户进程被中断进入ring0的时候,tss中取出esp0,然后切到esp0,其它的寄存器则保存在esp0指示的内核栈上而不保存在tss中。
3.结果,linux中每一个cpu只有一个tss段,tr寄存器永远指向它。符合x86处理器的使用规范,但不遵循intel的建议,这样的后果是开销更小了,因为不必切换tr寄存器了。
linux的实现:
1.定义tss:
struct tss_struct init_tss[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = INIT_TSS };(arch/i386/kernel/init_task.c)
INIT_TSS定义为:
#define INIT_TSS { /
.esp0 = sizeof(init_stack) + (long)&init_stack, /
.ss0 = __KERNEL_DS, /
.esp1 = sizeof(init_tss[0]) + (long)&init_tss[0], /
.ss1 = __KERNEL_CS, /
.ldt = GDT_ENTRY_LDT, /
.io_bitmap_base = INVALID_IO_BITMAP_OFFSET, /
.io_bitmap = { [ 0 ... IO_BITMAP_LONGS] = ~0 }, /
}
2.初始化tss:
struct tss_struct * t = init_tss + cpu;
...
load_esp0(t, thread);
set_tss_desc(cpu,t);
cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;
load_TR_desc();
相关函数或者宏为:
#define load_TR_desc() __asm__ __volatile__("ltr %%ax"::"a" (GDT_ENTRY_TSS*8))
static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, void *addr)
{
_set_tssldt_desc(&cpu_gdt_table[cpu][entry], (int)addr,
offsetof(struct tss_struct, __cacheline_filler) - 1, 0x89);
}
#define set_tss_desc(cpu,addr) __set_tss_desc(cpu, GDT_ENTRY_TSS, addr)
经过上述的初始化,tr永远指向唯一的tss段,然而tss段中的esp0以及iomap却是不断随着进程切换而变化的。
3.进程切换时切换全局唯一tss段中的esp0以及iomap即可:
在__switch_to中:
struct tss_struct *tss = init_tss + cpu;
...
load_esp0(tss, next);
从而改变了tss的esp0。
此时如果进程在用户态被中断,机器切到ring0,从tr中取出唯一的tss段,找到它的esp0,将堆栈切过去即可,然后把所有的其它寄存器都保存在tss当前的esp0指示的内核也就是ring0的堆栈上。
linux进程tss和ldt,x86体系下linux中的任务切换与TSS相关推荐
- 操作系统实验报告linux进程管理,计算机操作系统实验报告三Linux进程基本管理.doc...
GDOU-B-11-112广东海洋大学学生实验报告书(学生用表) GDOU-B-11-112 实验名称 Linux进程基本管理 课程名称 计算机操作系统 课程号 学院(系) 专业 统 班级 学生姓名 ...
- 【Linux进程、线程、任务调度】一 Linux进程生命周期 僵尸进程的含义 停止状态与作业控制 内存泄漏的真实含义 task_struct以及task_struct之间的关系
学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 文章目录 1 ...
- 观察Linux进程 线程的异步并发执行,操作系统linux版实验报告.doc
操作系统linux版实验报告.doc (29页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 操作系统实验报告(Linux版)网络142 ...
- linux efi 双系统,EFI+GPT模式下Linux与Windows双系统要诀
本文并非要对 BIOS/EFI/MBR/GPT 等进行理论探讨,相关知识请各位自行搜索学习.本着薄荷网一贯坚持的实操原则,本文主要是介绍在"EFI引导+GPT分区"模式下,安装 L ...
- linux进程管理之mm_struct,【转】Linux进程管理之SMP负载平衡(续二)
继续来分析balance_tasks()函数,结合代码中的注释,理解这段代码应该很容易,在这里主要分析它的两个重要的子函数,即can_migrate_task()和pull_task(). 先来看ca ...
- linux进程挂掉 自动启动,配置systemd以在Linux崩溃后自动启动服务
本文介绍配置systemd以在Linux崩溃后自动启动服务的方法.进程在Linux系统上崩溃的原因有很多,你可以调查并解决问题,但可能需要一段时间.但是你可以立即将服务恢复到联机状态的一件事是在服务中 ...
- linux设置BIOS串口,将x86平台的Linux控制台重定向到串口
一般地,安装在PC的Linux是使用鼠标.键盘作为输入源,显示器作为输出显示,但有些X86的设备,如工控机等,为了节省成本,会去掉认为无用的外设接口,以致熟悉了PC的人不习惯.一个设备,没有鼠标.键盘 ...
- linux进程泄露命令明文参数,sshpass 使Linux可以明文参数输入SSH密码(示例代码)
sshpass 使Linux可以明文参数输入SSH密码 这几天配置一台服务器,在某云平台创建云服务器后,生成了巨长.巨复杂的一串密码,在输入几十次密码后,依然是密码错误.这时候就想如果密码是非交互式输 ...
- linux进程创建截图,桌面应用|如何在 Linux 系统里用 Scrot 截屏
最近,我们介绍过 gnome-screenshot 工具,这是一个很优秀的屏幕抓取工具.但如果你想找一个在命令行运行的更好用的截屏工具,你一定要试试 Scrot.这个工具有一些 gnome-scree ...
最新文章
- R语言偏相关或者部分相关性系数计算实战:通过拟合两个回归模型、或者pysch包计算偏相关系数(Partial Correlation)、通过方差分析获得偏相关系数的F统计量(偏F检验、二型检验)
- 测试机的版本高于Xcode的版本的解决方法
- form-data php,PHP 模拟form-data上传文件
- mysql 批量增加字段命令_sql使用命令批量给一个表添加字段
- SAP CRM Fiori应用里的note section
- c向文件中插入数据_Redis从文件中批量插入数据
- JAVA中神奇的双刃剑--Unsafe
- ElasticSearch里面关于日期的存储方式,解决差8个小时
- git报错:fatal: remote origin already exists
- android百分比布局失效,Android 百分比布局库【原创】
- BCNF/3NF的判断方法
- 谁决定了 IT 直男的价值
- Python---HTML表单
- Base64,DES,RSA,SHA1,MD5 笔记
- trump可音译为“专普”
- Android游戏开发入门基础
- nodejs下载文件到本地并命名 和 删除文件
- 纯粹数学的雪崩效应:庞加莱猜想何以造福了精准医疗?
- windows/linux远程开关机原理及实现
- ST-GCN论文分析
热门文章
- 基于JAVA+SpringMVC+MYSQL的火车票订票系统
- 基于JAVA+SpringMVC+Mybatis+MYSQL的博客系统
- 基于JAVA+SpringMVC+Mybatis+MYSQL的健身管理系统
- python语句分为复合语句与_对Python中for复合语句的使用示例讲解
- 【洛谷1090】合并果子
- 面试官问你有什么要问的时候,大胆的提出类似问题
- 期末总结20135320赵瀚青LINUX内核分析与设计期末总结
- Java基础知识之变量与常量、数据类型、类型转换
- idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
- 03:计算书费【一维数组】