操作系统内部机制学习

切换线程时需要保存什么

  • 函数需要保存吗?函数在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

信号不是信号量,是一种异步通知机制。

**信号就是线程的软件中断。 **

信号处理流程

信号就是线程的"软件中断",跟"硬件中断"类似:

要安装信号处理函数,相当于给硬件中断提供处理函数。

c 复制代码
/* thread1 安装信号,自定义处理函数 */

rt_signal_install(SIGUSR1, thread1_signal_handler);

/* thread1 要使能信号,相当于使能硬件中断,解除屏蔽 */
rt_signal_unmask(SIGUSR1);

/* 向thread1发出信号,相当于触发硬件中断 */
rt_thread_kill(thread1, SIGUSR1);

什么是块设备?

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

挂载

挂载点(path)

文件系统

块设备

相关推荐
西岸行者10 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意10 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码10 天前
嵌入式学习路线
学习
毛小茛10 天前
计算机系统概论——校验码
学习
babe小鑫10 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms10 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下10 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。10 天前
2026.2.25监控学习
学习
im_AMBER10 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J10 天前
从“Hello World“ 开始 C++
c语言·c++·学习