Linux 上下文切换分析笔记 (MIPS)

MIPS处理器下Linux调度器的调度时机 1. Linux的调度器,N多书有介绍,但是这些介绍基本都是给个大致概念,具体还要看代码。这部分的实现,不同的内核版本有一定的差异,我看的内核版本是2.6.21.7。2. 关于调度器,我的理解,无外乎3点:什么时候去检查是否需要调度(调度时机),如何选择应该运行的任务(调度策略),怎样做任务的切换。任务的切换,也就是上下文切换,相对简单。调度策略,Linux下有SCHED_RR, SCHED_FIFO,SCHED_OTHER, N多书上对他们差别的讲解足够,且易于理解。我主要学习了调度时机。3. 由于要进行 阅读详情

作者: comcat 发表日期: 2007-09-24 16:29          http://comcat.blog.openrays.org/blog.php?do=showone&tid=455

 

1. 内核栈切换 (MIPS)

调度切换至一个进程时,根据 task_struct->thread_info 的值设置 *kernelsp(当前正在运行进程之内核栈栈底),其值为 thread_info + THREAD_SIZE - 32(MIPS 下,使用 set_saved_sp 宏)。


2. 异常、中断寄存器的保存 (MIPS)

使用SAVE_SOME 保存上下文时,如发现从用户态切入核心态,则首先用 get_saved_sp 宏,将*kernelsp 置入sp。然后在内核栈上分配 PT_SIZE(=sizeof(struct pt_regs)) 大小的空间,作为上下文的保存空间。保存时所有数据精心组织,最后就是一个 struct pt_regs 结构。

若是用户态 --> 内核态,则 k0 = sp, sp = *kernelsp - PT_SIZE,store k0, PT_R29(sp),保存其它寄存器。

若是内核态 --> 内核态,直接 k0 = sp, sp = sp - PT_SIZE,store k0, PT_R29(sp),然后保存其它寄存器。


3. 任务切换上下文的保存 (MIPS)

时钟中断后使用 SAVE_SOME 在内核栈/用户栈(取决于当时所在模式)上保存 $0, $2, $3, $4~$7, $8~$9(64bit), $25, $28, $29, $31, STATUS, CAUSE, EPC。

后在 switch_to 中保存正在运行任务的上下文:

保存 STATUS,使用 cpu_save_nonscratch 保存$16~$23, $29(sp), $30,以及 $31, 有FPU还要 fpu_save_double 保存FPU的寄存器。所有都保存于thread_struct 结构中,该结构为 task_struct 的一部分。

这些保存的是 switch_to 前后的上下文


然后将将要运行的任务上下文加载:

$28 <---- &thread_info
cpu_restore_nonscratch 恢复 $16~$23, $29(sp), $30
*(kernelsp) <---- &thread_info + THREAD_SIZE - 32
恢复 thread_struct 中保存的 STATUS(bit 0, bit 8~15 用当前STATUS值替换)

现在恢复时也在 switch_to 前后,神不知鬼不觉的替换了,所有操作都是由switch_to调用叶函数resume完成。

do_IRQ 返回后,sp恢复(减多少,对称的加多少,因此与初值无关,最终指向新进程的 pt_regs 结构)ref_from_irq 则时钟中断返回(当时被中断时的环境),然后 eret 跳回到用户态(或者被时钟中断的核心态)继续运行。


4. switch_to 为何不需保存$0~$15 $24~$27 (MIPS)

假如内核要从进程A切换到进程B,流程大概是这样:

进程A --> 时钟中断 --> schedule --> switch_to(resume) --> schedule 返回 --> ret_from_irq --> 进程B

switch_to 保存于 A task_struct->thread_struct 中的状态是整个调用链中的 switch_to 宏附近的处理器状态

因此将 sp 指向保存于 B task_struct->thread_struct 中的 sp 时,实际上就相当于恢复到当时进程B在switch_to前后的状态:

进程B --> 时钟中断 --> schedule --> switch_to

switch_to 是一个宏,其中调用了,位于 arch/mips/kernel/r4k_switch.S 中的一个叶函数(不改变静态寄存器的值,不用压栈、出栈)resume,因此进入 resume 前,ABI 规定的一些非静态寄存器的值就再也不用了,故这些非静态值无需保存。

至于静态寄存器的值,函数用之前都会保存于栈上,最后恢复之,子函数调用不会改变其值。因此静态寄存器保存的是当时运行状态的一部分。如这种情况:

schedule 中编译器用 s0 保存一个重要的状态变量,因此进入schedule首先保存s0的值,使用 s0 参与运算,switch_to 后,又要根据 s0 判断进一步的动作。

这个时候就要将 s0 恢复为进程B当时在此点的值。总之注意,switch_to 后所有操作延续的是进程B的:

schedule 返回 --> ret_from_irq --> 进程B


5. 中断处理时可否睡眠问题

Linux 设计中,中断处理时不能睡眠,这个内核中有很多保护措施,一旦检测到内核会异常。

当一个进程A因为中断被打断时,中断处理程序会使用 A 的内核栈来保存上下文,因为是“抢”的 A 的CPU,而且用了 A 的内核栈,因此中断应该尽可能快的结束。如果 do_IRQ 时又被时钟中断打断,则继续在 A 的内核栈上保存中断上下文,如果发生调度,则 schedule 进 switch_to,又会在 A 的 task_struct->thread_struct 里保存此时时种中断的上下文。

假如其是在睡眠时被时钟中断打断,并 schedule 的话,假如选中了进程 A,并 switch_to 过去,时钟中断返回后则又是位于原中断睡眠时的状态,抛开其扰乱了与其无关的进程A的运行不说,这里的问题就是:该如何唤醒之呢??

另外,和该中断共享中断号的中断也会受到影响。
MIPS Linux内核编译构建环境的搭建 AI的端侧应用离不开各种算力平台,目前形成了CPU+NPU,CPU+FPGA以及CPU+GPU的几类算力搭配,他们各有优势,也各有弱点。先看它们的共同点,从组合名字可以看出,这些组合场景都需要CPU,这是因为NPU,FPGA和GPU的架构特点决定了它们在流水线pipeline,逻辑处理和控制方面要弱于CPU,所以通常作为专用算力加速器的协处理器。 阅读详情

相关推荐

探秘 Linux 内核:精准识别 ARM、MIPS 和 x86_64 架构的全攻略

CPU 架构是指计算机中央处理器的设计蓝图,它决定了指令集、寄存器布局等关键特性。对于 Linux 系统而言,不同的架构意味着底层硬件交互方式的不同,进而影响到操作系统的编译优化、驱动程序支持等方面。ARM:广泛应用于移动设备和平板电脑,因其低功耗设计而备受青睐。MIPS:常见于嵌入式系统中,具有高效能比的特点。:主流桌面和服务器平台的核心,提供卓越的性能和广泛的软件兼容性。通过本文的学习,相信您已经掌握了识别 Linux 系统架构的基本技巧。

携梦问道的博客 1581

2.6下用request_irq引起的问题

原文地址:http://blog.sina.com.cn/s/blog_637deacd0106dfmv.html 奇怪的是在2.6用request_irq时发现好几个问题 我引入的头文件如下: #include #include #include #include #include 1、不认识SA_INTERRUPT,会提示 implicite declartion

dragon_cdut的博客 1230

【Linux线程资源与线程切换介绍】

linux线程资源和线程切换介绍

ao_jiao_322的博客 1441

八、IDA动态调试MIPS-Linux程序

在使用IDA对MIPS-Linux程序做动态分析的时候,按照常规的逻辑,我们应该假设MIPS-Linux程序能够以一种等待调试的状态运行着,然后我们就可以使用IDA远程附加调试的方式attach到这个MIPS-Linux进程上,然后通过断点或单步的方式对进程进行动态调试。所以,“如何让路由器中的MIPS-Linux程序能够以一种等待调试的状态运行着”应该是首要解决的问题。然而实际情况却没那么乐观,...

wanhex的博客 2469

Linux-mips下使用ngrok穿透路由

Linux-mips下使用ngrok穿透路由 一、基础操作指导 1、基础准备工作 1. 下载安装VMware Player,准备虚拟机软件 2. 下载ZLWL_Compiler_xxx.zip,并解压到工作目录 3. 启动VMware Player, 并点击“打开虚拟机”添加ZLWL虚拟机系统 4. 启动ZLWL Compiler虚拟机 重要:由于各版本系统默认安装依赖库、头文件等的不同,请勿升级ubuntu版本。 2、编译环境准备 1、ZLWL虚拟机系统为原始安装系统,并未做过多定制。 超级

liumengxin666666的博客 574

Linux的中断处理分析

MIPS中,中断被当作一种异常(第0号异常)来处理。中断由外部设备产生,可能发生在任何时刻,每个中断都有一个编号分配给一个外部设备,这样来区分不同设备产生的中断,如果硬件和内核支持共享中断,则可以由多个设备共享一个中断编号。         在CPU得知中断发生后,它将进一步的处理委托给一个软件例程,这个软件例程是体系结构相关的,然后根据中断号来识别中断源,并进入特定的中断处理程序来处理该中断。

落尘纷扰的专栏 2511

关于Linux上下文切换

关于Linux上下文切换 1. 内核栈切换 (MIPS) 调度切换至一个进程时,根据 task_struct->thread_info 的值设置 *kernelsp(当前正在运行进程之内核栈栈底),其值为 thread_info + THREAD_SIZE - 32(MIPS 下,使用 set_saved_sp 宏)。 2. 异常、中断寄存器的保存 (MIPS) 使用SAVE_SOME

Rain的专栏 1767

Vivado时序违约小结

目录1. setup time违约1.1 逻辑级数太高1.2 Fanout太大2. hold time 违约2.1 异步信号处理导致hold time违约 1. setup time违约 建立时间是工程设计中最常遇到的问题了。一般说来,导致建立时间违例主要有两个原因:逻辑级数太大或者扇出太大,当然也可以尝试通过降频来解决建立时间违约。 1.1 逻辑级数太高 Levels指的是逻辑级数logic level,一个logic level的延迟对应的是一个LUT和一个Net的延迟,对于不同的器件,不同频率的设计能

mu_guang_的博客 7155

进程切换源码分析

linux源码版本为linux-3.10.84,分析mips的进程切换。从进程A切换到进程B。   在进程切换主要实现在kernel/sched/core.c中。   进程调度入口函数为asmlinkage void __sched schedule(void)函数。这一函数第二句语句通过sched_submit_work(tsk);这一语句来避免死锁产生,然后调用__schedule()函数

sd10086的博客 845

Xiaojie雷达之路---毫米波雷达基础知识---角度估计

本篇文章主要介绍毫米波雷达的基础知识中的角度估计,对于本篇文章主要回答5个问题 1.在雷达的前方,如何估计前方一个物体的角度 2.角度测量的准确性 3.如何测量多个物体的角度 4.雷达可测的角度的视场最大值为多少 5.角度分辨率取决于什么因素 文章目录估计雷达前面一个物体的角度角度测量的准确性雷达的最大角视场测量雷达前方多个距离和速度相同的物体角度分辨率角度估计的流程 估计雷达前面一个物体的角度 估计一个物体的角度,最少需要两根接收天线 发射天线发送一个chirp,经过物体发射后信号,信号分别被第一根天

XiaoJie的博客 1万+

Zabbix-01简单导入MIB文件并测试

这里写自定义目录标题安装 MIB文件启用MIB文件测试MIB文件 MIB文件 MIB代表管理信息库。 MIB文件允许您使用OID(对象标识符)的文本表示。 ##例如: ifHCOutOctets 是OID【1.3.6.1.2.1.31.1.1.1.10】的文本表示 安装 MIB文件 在基于Debian的系统上: # apt install snmp-mibs-downloader # download-mibs 在基于RedHat的系统上: # yum install net-snmp-libs 启用M

lokibaba的博客 9178

linux mips汇编指令集,mips汇编指令集功能的介绍

描述简单来说,指令集就是CPU能看得懂的语音,可以称之为机器语言。CPU指令集主要包括CISC(复杂指令集)和RISC(精简指令集)。形象点说,CISC类似于汉语,每一句话都是由汉字组成,而每一个汉字就相当于一条指令集;RISC类似于英语,每一句话都是由字母组成,而每一个字母就相当于一条指令集;(这里不讨论什么汉字是笔画组成的,形象的比喻而已)但是无论汉语和英语,都能实现人类基本交流。例如:英语虽...

weixin_42302384的博客 1263

告别纯代码:用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件

本文介绍如何利用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件,解决传统集成方式中的代码臃肿和维护困难问题。通过.NET控件封装核心功能,实现LabVIEW与VisionMaster的高效对接,显著提升工业自动化开发效率。

weixin_33744854的博客 505

linux下调试切换到某一帧,【Linux】Linux下MIPS平台交叉编译FFmpeg库 及使用库截取视频中的某一帧...

一.Linux下MIPS平台交叉编译FFmpeg库: 1.下载ffmpeg库的源代码( http://sourceforge.net/project/showfiles.php?group_id=205275&package_id=248632):[root@localhost ffmpeg]# lsffmpeg-laster.tar.gz2.解压:[root@localhost ffmp...

weixin_36476695的博客 215

在带有Intel Arc GPU的Windows上安装IPEX-LLM

本文将介绍在 Intel Arc GPU 环境下安装 IPEX-LLM。

wux_labs的博客 1634

双有源桥(DAB)进阶:EPS调制策略与Matlab/Simulink仿真实践

本文深入探讨了双有源桥(DAB)的扩展移相(EPS)调制策略及其在Matlab/Simulink中的仿真实践。通过分析EPS的两种黄金调制策略——回流功率消除和电流应力优化,结合实际工程案例,展示了如何提升DAB系统的效率和性能。文章还详细介绍了Simulink模型搭建要点和关键仿真结果,为工程师提供了实用的技术参考。

weixin_33734785的博客 483

MIPS体系结构剖析,编程与实践 [7]

http://blogold.chinaunix.net/u1/40363/showart_434193.html第七章 MIPS-Linux Kernel 分析(3)<br />下面是我在为godson CPU的页面可执行保护功能增加内核支持时分析linux-mipsmmu实现的一些笔记,没有时间整理,有兴趣就看看吧.也许第5节对整个工作过程的分析会有些用,其它语焉不详的东西多数只是对我本人有点用.   首先的,关键的,要明白MIPS CPU的tlb是软件管理的,cache也不是透明的,具体的   参见它

ivan240的专栏 1610

HyperLynx(二十二)DDR(五)DDRx总线时序模型设计

DDR3 的数据选通信号与时钟信号的频率是一样的,在数据选通信号写操作时,控制器典型的输出方式是数据选通信号边沿与时钟近似对齐。该界面中显示了所有需要编辑的参数,包括地址/命令信号的时序、控制信号的时序、读和写操作的数据选通和数据信号时序、写操作的数据选通和数据掩码信号时序,以及建立和保持时间的降额参数。由于DDRx总线对时序的要求非常严格,随着速率的提升,时序的要求会更高。反之也是一样的,如果数据选通信号的上升沿在时钟信号上升沿的后面到达 DRAM,那么数据选通信号的下降沿就会在时钟信号的前面到达。

小幽余生不加糖 1936

Linux 的 Spinlock 在 MIPS 多核处理器中的设计与实现

Linux 的 Spinlock 在 MIPS 多核处理器中的设计与实现文档选项<br />将此页作为电子邮件发送<br /><br />级别: 初级<br />赵 昊翔 (haoxiang@hotmail.com), 工程师<br />2008 年 8 月 04 日Spinlock 在 Linux 中被广泛应用于解决多核处理器之间访问共享资源的互斥问题,本文以 MIPS 多核处理器为例,介绍了 Spinlock 的设计与实现,以及 Spinlock 的不足与扩展。<br />引言<br />随着科技的发展

babyfans的专栏 934

【CASS精品教程】013:CASS9.1生成标准图幅案例教程

在CASS中,可以很方便的生成标准图幅,如50*50。本文演示cass中,根据测区范围标准图幅生成过程。

智慧空间实验室 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

关于MIPS平台的asid_cache debug的总结

最近遇到一个非常有意思的问题,MIPS平台的CPUHOTPLUG会有一定的概率导致应用程序出现段错误,花了几天的时间排除了一大堆问题后,最后定位到了MIPS公司的一段代码上,竟然是在trap_init里又对asid_cache进行了初始化! 在网上很少有关于asid的内容,有也讲的不详不尽,今天写完了文档,决定把它贴出来!欢迎一起讨论。    ====================

Am_111的专栏 2995

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

mips 异常处理和进程切换

原文网址: http://blog.chinaunix.net/uid-26817832-id-3146430.html 一. 内核栈 每个进程拥有一个内核栈,调度切换至一个新进程时,会根据task_struct->stack(struct thread_info 结构体类型) 的值设置 *kernelsp(当前正在运行进程之内核栈栈顶),将kernelsp的值设置为

junmuzi的专栏 1425

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

告别printf调试!用perf分析嵌入式程序性能的完整指南(MIPS平台实测)

本文提供了一份在MIPS架构嵌入式设备上部署和使用Linux性能分析工具perf的完整实战指南。通过详细的内核配置、交叉编译步骤,指导开发者告别低效的printf调试,利用perf以极低开销进行系统级性能剖析,精准定位程序热点与瓶颈。

weixin_29173777的博客 422
上一篇: 龙芯版 memcpy 的实现
下一篇: MIPS 下非对齐访问的问题
LonlyGod
博客等级 码龄15年 32粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值