操作系统内部机制学习

切换线程时需要保存什么

  • 函数需要保存吗?函数在Flash上,不会被破坏,无需保存。
  • 函数执行到了哪里?需要保存吗?需要保存。
  • 全局变量需要保存吗?全局变量在内存上,无需保存。
  • 局部变量需要保存吗?局部变量在栈里,也是在内存里,只要避免栈不会被破坏即可,局部变量无需保存。
  • 运算的中间值需要保存吗?中间值保存在CPU寄存器里,另一个线程也需要用到寄存器,所以CPU寄存器要保存。
  • 函数运行到了哪里:也是一个CPU寄存器,名为“PC”。

总结:CPU寄存器需要保存,保存在线程的栈里。

ARM架构

ARM芯片属于精简指令计算机(RISC:Reduced Instruction Set Computor),它所用的指令比较简单,有如下特点:

  1. 对内存只有读、写指令。
  2. 对于数据的运算都是在CPU内部实现。
  3. 使用RISC指令的CPU复杂度小一点,易于设计。

在这里插入图片描述
在这里插入图片描述

几条汇编指令

  • 读内存指令:LDR,即Load之意。
  • 写内存指令:STR,即Store之意。
  • 加减指令:ADD、SUB
  • 跳转:BL,Branch And Link
  • 入栈指令:PUSH
  • 出栈指令:POP

加载指令LDR:LDR r0,[addrA],意思是将地址addrA的内容加载到r0里面。
存储指令STR:STR r0,[addr A],把r0的值存储到地址addrA上。
加法运算指令(ADD):ADD r0,r1,r2,意思为r0=r1+r2。
减法运算指令(SUB):SUB r0,r1,r2,意思为r0=r1-r2。
寄存器入栈/出栈指令(PUSH/POP)

寄存器入栈(PUSH):PUSH {r3, lr}意思是将寄存器r3和lr写入内存栈。

  • 本质是写内存STR指令,高标号寄存器写入高地址的栈里,低标号寄存器写入低地址的栈里。
  • lr即r14,写入地址为sp-4的内存,然后sp=sp-4。
  • r3,写入地址为sp-4的内存,然后sp=sp-4。

寄存器出栈指令(POP):POP {r3,pc}意思是取出内存栈的数据放入r3和pc中。

  • 本质是读内存LDR指令,高标号寄存器的内容来自高地址的栈,低标号寄存器的内容来自低地址的栈。
  • 读地址为sp的内容存入r3,然后sp=sp+4。
  • 读地址为sp的内容存入pc,然后sp=sp+4。

寄存器别名

在这里插入图片描述
PUSH指令=多次调用STR指令,并且会调整SP的值。

BL A:会记录返回地址,保存在R14里,然后跳转到A执行,执行完后,PC会跳转到R14所指向的地址。

在这里插入图片描述
在这里插入图片描述
初始化栈

IPC

引入IPC,主要是为了两项功能:

  1. 线程间互斥
  2. 休眠-唤醒机制

队列
在这里插入图片描述
队列里有多个消息块,消息块里面可以存储消息(数据),每个消息块大小相同。

队列里有两个链表:Sender List、Receiver List。
在这里插入图片描述
在这里插入图片描述
挂起线程也就是将线程从就绪链表中移出。
再将线程挂到队列的等待链表中。
启动定时器。

互斥量如何实现

对于互斥变量a

  1. 关中断
  2. 汇编指令:原子地修改a

IPC

在这里插入图片描述
消息队列的读取都是使用memcpy()

邮箱的读取直接赋值即可。
链表、定时器、环形缓冲区(读、写位置)

信号量的缺点:

  1. 谁都可以释放信号量
  2. 优先级反转

Mutex解决

  1. 谁拥有谁释放
  2. 优先级继承

一个互斥量可以被同一个线程多次take

信号不是信号量,是一种异步通知机制。
**信号就是线程的软件中断。 **

信号处理流程

信号就是线程的“软件中断”,跟“硬件中断”类似:
要安装信号处理函数,相当于给硬件中断提供处理函数。

/* thread1 安装信号,自定义处理函数 */rt_signal_install(SIGUSR1, thread1_signal_handler);/* thread1 要使能信号,相当于使能硬件中断,解除屏蔽 */
rt_signal_unmask(SIGUSR1);/* 向thread1发出信号,相当于触发硬件中断 */
rt_thread_kill(thread1, SIGUSR1);

什么是块设备?

有存储功能:写入数据到pos位置,再读pos可以得到一样的数据。
数据的传输单位是:扇区。

挂载

挂载点(path)
文件系统
块设备
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—337.打家劫舍III【中等】

2023每日刷题(五十二) Leetcode—337.打家劫舍III 算法思想 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(null…

I.MX6ULL_Linux_驱动篇(46)linux LCD驱动

LCD 是很常用的一个外设,在Linux 下LCD 的使用更加广泛,在搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们就来学习一下如何在 Linux 下驱动 LCD 屏幕。 Linux 下 LCD 驱动简析 Framebuffer 设备 先来回顾一下裸机的时候 LCD 驱动是怎…

前端入门:HTML初级指南,网页的简单实现!

代码部分&#xff1a; <!DOCTYPE html> <!-- 上方为DOCTYPE声明&#xff0c;指定文档类型为HTML --> <html lang"en"> <!-- html标签为整个页面的根元素 --> <head> <!-- title标签用于定义文档标题 --> <title>初始HT…

单点登录方案调研与实现

作用 在一个系统登录后&#xff0c;其他系统也能共享该登录状态&#xff0c;无需重新登录。 演进 cookie → session → token →单点登录 Cookie 可以实现浏览器和服务器状态的记录&#xff0c;但Cookie会出现存储体积过大和可以在前后端修改的问题 Session 为了解决Co…

UVM建造测试用例

&#xff08;1&#xff09;加入base_test 在一个实际应用的UVM验证平台中&#xff0c;my_env并不是树根&#xff0c;通常来说&#xff0c;树根是一个基于uvm_test派生的类。真正的测试用例都是基于base_test派生的一个类。 class base_test extends uvm_test;my_env e…

14-2(C++11)类型推导、类型计算

14-2&#xff08;C11&#xff09;类型推导、类型计算 类型推导auto关键字auto类型推断本质auto与引用 联用auto关键字的使用限制 类型计算类型计算分类与类型推导相比四种类型计算的规则返回值后置 类型推导 auto关键字 C98中&#xff0c;auto表示栈变量&#xff0c;通常省略…

Leetcode刷题笔记题解(C++):25. K 个一组翻转链表

思路&#xff1a;利用栈的特性&#xff0c;K个节点压入栈中依次弹出组成新的链表&#xff0c;不够K个节点则保持不变 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在国内,现在月薪1万是什么水平?

看到网友发帖问&#xff1a;现在月薪1W是什么水平&#xff1f; 在现如今的情况下&#xff0c;似乎月薪过万这个标准已经成为衡量个人能力的一个标准了&#xff0c;尤其是现在互联网横行的时代&#xff0c;好像年入百万&#xff0c;年入千万就应该是属于大众的平均水平。 我不是…

kafka入门(四):消费者

消费者 (Consumer ) 消费者 订阅 Kafka 中的主题 (Topic) &#xff0c;并 拉取消息。 消费者群组&#xff08; Consumer Group&#xff09; 每一个消费者都有一个对应的 消费者群组。 一个群组里的消费者订阅的是同一个主题&#xff0c;每个消费者接收主题的一部分分区的消息…

大师学SwiftUI第18章Part2 - 存储图片和自定义相机

存储图片 在前面的示例中&#xff0c;我们在屏幕上展示了图片&#xff0c;但也可以将其存储到文件或数据库中。另外有时使用相机将照片存储到设备的相册薄里会很有用&#xff0c;这样可供其它应用访问。UIKit框架提供了如下两个保存图片和视频的函数。 UIImageWriteToSavedPh…

JAVA后端自学技能实操合集

JAVA后端自学技能实操 内容将会持续更新中,有需要添加什么内容可以再评论区留言,大家一起学习FastDFS使用docker安装FastDFS(linux)集成到springboot项目中 内容将会持续更新中,有需要添加什么内容可以再评论区留言,大家一起学习 FastDFS 组名&#xff1a;文件上传后所在的 st…

leetcode 100.相同的树

涉及到递归&#xff0c;最好多画图理解&#xff0c;希望对你们有帮助 100.相同的树 题目 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 题目链接…

GPIO的使用--滴答定时器--pir人体红外传感器

目录 一、滴答定时器的使用与原理 1、定义 2、原理 &#xff08;1&#xff09;向上计数​编辑 &#xff08;2&#xff09;向下计数 &#xff08;3&#xff09; 代码流程 a、配置滴答时钟唤醒频率 b、滴答时钟中断函数 &#xff08;4&#xff09;结果 3、优化-->寄存…

读书笔记-《数据结构与算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通过构建有序序列&#xff0c;对于未排序序列&#xff0c;在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历)&#xff0c;找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) 从第一个元素开始&#xff0c;该元素可…

如何主持一场知识竞赛抢答赛

知识竞赛主持说难不难&#xff0c;说简单也不简单&#xff0c;我就从易到难介绍一下。 入门级&#xff0c;题主不用练习太多其他花哨的技巧&#xff0c;只要注意一点&#xff0c;熟悉比赛流程。知识竞赛需要给所有选手一个公平流畅的答题环境&#xff0c;所以题主自身必须非常…

干货!接口中的大事务,该如何进行优化?

作为后端开发的程序员&#xff0c;我们常常会的一些相对比较复杂的逻辑&#xff0c;比如我们需要给前端写一个调用的接口&#xff0c;这个接口需要进行相对比较复杂的业务逻辑操作&#xff0c;比如会进行&#xff0c;查询、远程接口或本地接口调用、更新、插入、计算等一些逻辑…

掌握iText:轻松处理PDF文档-进阶篇

简体中文写入 iText本身对简体中文的支持有限&#xff0c;但可以通过引入额外的字体包来增强其对简体中文的支持。例如&#xff0c;可以使用iTextAsian.jar这个亚洲字体包&#xff0c;它包含了几种简单的亚洲字体&#xff0c;其中包括简体中文字体。只需要将iTextAsian.jar放到…

46. 全排列

46. 全排列 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_46全排列_构建数组回溯_46全排列_直接构建 错误经验吸取 原题链接&#xff1a; 46. 全排列 https://leetcode.cn/problems/permutations/description/ 完成情况&#xff1a;…

小模型学习(1)-人脸识别

【写作背景】因为最近一直在研究大模型&#xff0c;在与客户进行交流时&#xff0c;如果要将大模型的变革性能力讲清楚&#xff0c;就一定要能将AI小模型的一些原理和效果讲清楚&#xff0c;进而形成对比。当然这不是一件简单的事情&#xff0c;一方面大模型分析问题的的本质原…

反射加载SDK完成统一调用

文章目录 1、需求背景2、接口抽象类具体实现类3、疑问4、存在的问题5、通过反射加载SDK并完成调用5、补充&#xff1a;关于业务网关7、补充&#xff1a;关于SDK的开发 关键点&#xff1a; 接口抽象类&#xff08;半抽象半实现&#xff09;具体实现类业务网关反射加载SDK&#…