xym-ee
  • 计算机与嵌入式开发学习
  • 1-1.编程基础
    • C 语言
      • C 中的数据
      • C 语言基础
      • 字符输入输出
      • 函数
      • 数组和指针
      • 字符串处理
      • 存储类别
      • 文件 I/O
      • 复杂数据类型
      • 位操作
      • 预处理和 C 库
    • 数据结构和算法入门
    • leetcode 刷算法题
      • 递归与栈
      • 二叉树与递归
      • 回溯问题
      • 动态规划 1
    • 基本工具和使用
      • shell
      • shell 脚本
      • vim 编辑器
      • 命令行数据整理
      • 命令行环境和配置
  • 1-2.计算机系统基础(CSAPP)
    • 1.计算机基础
    • 2.数据的表示
    • 3.加减运算
    • 4.乘除运算
    • 5.程序的表示转换和链接
    • 6.IA32指令
    • 7.过程调用
    • 10.程序的链接
  • 1-3.数字电路、计算机组成
    • 1.数字电路、virtual circuit board
    • 2.计算机组成/steam:Turing Complete
    • 3.微机原理与接口技术(8086)
  • 1-4.计算机网络
    • 1.从浏览器开始
    • 2.协议栈和网卡
    • 3.网络设备
    • 4.运营商、接入网
    • 5.服务器
    • 6.数据返回浏览器
    • socket编程
  • 1-5.操作系统
    • 0.绪论
      • 1.应用视角的操作系统
      • 2.硬件视角的操作系统
      • 3.数学视角的操作系统
      • 4.状态机模型的应用
    • 1.并发
      • 1.并发 bug 的解决思路
      • 2.互斥
      • 3.同步
      • 4.信号量
      • 5.真实并发
      • 6.调试技巧
      • 7.os kernel 实现
    • 2.虚拟化
      • 1.操作系统上的进程
      • 2.进程的地址空间
      • 3.系统调用和unix shell
      • 4.C 标准库的实现
      • 5.linux 操作系统
      • 6.可执行文件和加载
      • 7.动态链接和加载
      • 8.内核的实现
      • 9.fork 的应用
    • 3.持久化
      • 1.存储设备的原理
      • 2.输入输出设备模型
      • 3.设备驱动程序
      • 4.文件系统 API
      • 5.fat 和 unix 文件系统
      • 6.持久数据的可靠性
    • 总结
  • 2-1.嵌入式裸机开发
    • 嵌入式系统通信接口与协议
    • cortex-m 内核芯片裸机开发
    • MPU
  • 2-2.中等规模系统开发
    • LVGL 图形库
    • 裸机开发的软件框架
    • 基于 rtos 开发
  • 2-3.armv7-m架构与 rtos 原理
    • armv7-m 架构
    • rt-thread 内核实现
    • rt-thread 驱动开发
  • 3-1.linux 应用开发基础
  • 3-2.linux 镜像构建
    • uboot 使用
    • uboot 适配
    • uboot 启动分析
    • uboot 自定义命令
    • linux 内核适配
    • linux 内核启动分析
    • busybox 根文件系统构建
  • 3-3.linux 驱动开发
    • 驱动开发基础
    • sysfs
    • led 驱动
    • 设备树
    • pinctrl 和 gpio 子系统
    • 并发控制
由 GitBook 提供支持
在本页
  • 2023-06-01 虚拟化的讨论
  • 2023-05-05 关于并发
  • 2023-03-12
  • 参考资料

这有帮助吗?

1-5.操作系统

先有并发,符合由简单到复杂。

2023-06-01 虚拟化的讨论

虚拟化是现代计算机

2023-05-05 关于并发

单核并发广泛的用在 RTOS 中,因此一些桌面现代处理器的问题在 MCU 上跑 RTOS 时可能不会遇到。要理解并发存在的问题,先要玩玩并发程序,建立起每个 CPU 都可以执行一个函数(线程)的初步思想。然后再看看经典的例子,多线程对一个技术变量做累加会出现的问题,这就发现了现代多处理器并发编程的问题。

为了解决并发问题,早期首先在裸机(或者现在的纯用户层)尝试一些简单的基于标志变量的纯程序的方法,比如 Peterson 算法,当时可能可行但是在现在的多处理器上都失效了。在硬件的努力下,有了原子指令,使得并发问题有了更直观、代码实现更简单的实现:自旋锁。

自旋锁只能说是可以解决这个问题(裸机和用户层都行),但是不够好,对于单核处理器来说,自旋就啥也干不了了,对于多核处理器来说,自旋时 CPU 空转也是很浪费的,因此,我们想让线程在等待时让出 CPU ,这就有了互斥锁。操作系统为引用层的线程提供互斥锁,操作系统内部则可以使用自旋锁实现互斥。

并发的两大需求是互斥(保护共享数据)和等待(线程间依赖),互斥用自旋锁提高效率了,但是等待这个过程还是轮询的,把等待的轮询也让出 CPU ,这就有了条件变量。

一个更优雅的方案是信号量,实现这是互斥与等待的一体化。

2023-03-12

2021 年我粗略了看了哈工大的操作系统课,源码讲解的章节都跳过了,当时我只有微机原理的基本知识,以及做过 MCU 裸机开发,底层硬件接触的比较多。

2022 年 4 月份,我开始在 MCU 上使用嵌入式实时操作系统,rtthread,学会了基本接口的使用,也模糊的有了一些操作系统的概念。

2022 年年底到 2023 年初,过年寒假期间,我开始学习南京大学 jyy 老师的操作系统课,到目前为止,也只是跳着看了看,第一遍粗略的学习,刚好现在 jyy 老师开始了新一学年的操作系统课,我也跟着学习第二遍,在这个时间点,记录一下对操作系统的理解。

操作系统首先要考虑的问题,并发,即多任务同时执行。这也是上古时期压榨 CPU 性能最先考虑的问题,现在 mcu 基本上都是单核多线程并发还是相对容易一些,在多核多线程的情况下,并发有各种意想不到的问题,为了写出正确的并发程序,操作系统设计了锁、信号量等机制,使得CPU能充分被使用。

对一个程序来讲,自己占有整个 PC 是最舒服的状态,也是容易使用的状态。虚拟化就在做这个事情,为每个程序(进程)虚拟出自己的空间。各个程序互不打扰,各管各的,最典型的,每个进程都有自己的地址空间,这个设计依赖硬件上的 MMU,因此 MCU 上的 RTOS 并没有这层机制。

上面的东西,运行的数据都是在 RAM 里,断电会丢失,因此还要考虑数据持久化保存的问题。类似的理解:程序和进程的区别。为了让数据持久化保存,以及更好的管理数据,设计了文件系统,以及一系列 api,对磁盘的使用实际上就是对一组寄存器的读写,为了容易的使用,就有了封装寄存器的程序,即设备驱动。

参考资料

操作系统:设计与实现(南京大学)

上一页socket编程下一页0.绪论

最后更新于9个月前

这有帮助吗?

jyy的主页Yanyan's Wiki
课程主页 2023 春季学期
课程视频 2023 春季学期
课程主页 2022 春季学期
课程视频 2022 春季学期