摘要: 1 思考 我们都知道处理器会在用户态和内核态之间切换;进程调度的时候,也会在用户进程和内核进程之间进行切换。 它们有什么关系呢?是不是用户进程和内核进程之间的切换,才导致处理器在用户态和内核态之间的切换呢? 其他人和我也有一样的困惑: 内核态是指一个特殊的进程,还是指进程的一种特殊状态? 内核是内存 阅读全文
posted @ 2025-04-01 23:56 moonのsun 阅读(183) 评论(0) 推荐(0)
摘要: 1 规则简介 进程地址空间:允许进程使用的全部线性地址,也叫进程的线性区 2 内核和用户进程地址空间的区别 内核的地址空间是共享的,所有内核线程使用一个地址空间;每个用户进程的地址空间是独立的 内核申请动态内存,会立刻进行内存分配;用户进程申请内存会尽可能推迟分配内存 因此,内核要随时准备捕获用户态 阅读全文
posted @ 2025-04-01 09:14 moonのsun 阅读(89) 评论(0) 推荐(0)
摘要: 1 内存和页框管理 RAM的某些部分永久分配给内核,用来存放内核代码和静态内核数据结构; RAM的其他部分称为动态内存,内存管理指的是这块部分内存的管理,不管是内核进程的内存申请还是用户进程。 2 页框 Linux使用4KB页框大小作为标准的分页单元; 页描述符struct page记录了页框的信息 阅读全文
posted @ 2025-03-11 23:54 moonのsun 阅读(32) 评论(0) 推荐(0)
摘要: 1 Linux进程简介 Linux中,进程的优先级是动态的 Linux 2.6开始,内核是抢占式的 内核线程没有自己的地址空间,整个内核共享内核的虚拟地址 Linux采用对称多处理模型,每个CPU地位相同 2 进程分类 进程可以分为普通进程(包括交互式进程、批处理进程)、实时进程。 交互式进程和实时 阅读全文
posted @ 2025-03-03 22:41 moonのsun 阅读(22) 评论(0) 推荐(0)
摘要: 1 内核抢占 定义:内核控制路径被其他内核进程抢占,称为内核抢占 条件:进程描述符thread_info的抢占计数器preempt_count字段<=0 && 中断打开 发生时机: 结束内核控制路径(通常是中断处理程序)时 异常处理程序调用preempt_enable()时 启用可延迟函数(软中断, 阅读全文
posted @ 2025-02-23 12:45 moonのsun 阅读(31) 评论(0) 推荐(0)
摘要: 1 处理器探测异常 fault:可以被纠正,并不失连贯的执行;比如缺页异常 trap:发生后没有必要纠正和继续执行,调试时使用,可以认为是断点 abort:发生严重的错误,只能强制终止受影响的进程;比如assert? 2 硬件连接 设备 <== IRQ ==> 可编程中断控制器PIC <== INT 阅读全文
posted @ 2025-02-16 22:59 moonのsun 阅读(59) 评论(0) 推荐(0)
摘要: 1 参考文档 6. 线程的定义与线程切换的实现 — [野火]RT-Thread内核实现与应用开发实战——基于STM32 文档 2 定义线程栈 RTOS中存在多线程和线程切换,没有进程的概念; 每个线程都有线程栈,通常是预先定义好的全局数组,存在RAM中。比如定义两个线程栈: /* 定义线程栈*/ r 阅读全文
posted @ 2025-02-04 22:02 moonのsun 阅读(89) 评论(0) 推荐(0)
摘要: 1. 进程、线程,轻量级进程 1.1. 进程 进程是程序执行的一个实例,是担当分配系统资源(除CPU之外的资源)的实体 线程是程序执行的基本单位,是担当分配CPU的实体 —— 线程除了共享地址空间和内存,调度逻辑和进程没有区别,也都是由内核调度 当前,同一进程间的线程切换更加轻量化 1.2. 轻量级 阅读全文
posted @ 2025-01-17 09:49 moonのsun 阅读(53) 评论(0) 推荐(0)
摘要: 1. 内存地址 逻辑地址、虚拟地址、线性地址、物理地址,它们是很绕的逻辑,有些和Intel绑定的概念,没有必要完全区分; 可以认为,地址包括:虚拟地址和物理地址两种。 1.1. 逻辑地址 程序编译后的地址 1.2. 线性地址 程序运行时的内存地址 1.3. 物理地址 内存总线上的地址 如果CPU没有 阅读全文
posted @ 2025-01-05 12:50 moonのsun 阅读(61) 评论(0) 推荐(0)
摘要: 1. 名词解释 POSIX:Portable Operating Systems based on Unix SMP:Symetric Multiprocessor,对称多处理器 2. Linux的特点 单块结构的内核:每一个内核层都被集成到整个内核程序中 编译并静态连接的传统Unix内核:可以动态 阅读全文
posted @ 2024-12-29 15:21 moonのsun 阅读(31) 评论(0) 推荐(0)
摘要: 1. 作用 Linux内核的“定时测量”主要有两个作用:① 获取时间日期 ② 定时人物。 2. 时钟和定时器电路 ① 实时时钟 RTC 独立电源(蓄电池)供电;Linux用来获取时间和日期 ② 时间戳计数器 TSC 和CPU频率绑定,每个时钟信号到来时+1 系统初始化期间算出CPU实际频率 便于测量 阅读全文
posted @ 2024-12-27 09:42 moonのsun 阅读(100) 评论(0) 推荐(0)
摘要: I2C读出来的内容的地址,比datasheet给出的小9? add- 0x0 = 0x0add- 0x1 = 0x76add- 0x2 = 0x73add- 0x3 = 0x4add- 0x4 = 0x0add- 0x5 = 0x61add- 0x6 = 0x4badd- 0x7 = 0x0add- 阅读全文
posted @ 2024-01-20 16:09 moonのsun 阅读(164) 评论(0) 推荐(0)
摘要: 1. 定义 这是个老生常谈的问题,定义大家都懂: 大端模式:数据低位存放在内存高位 小端模式:数据高位存放在内存高位 比如一个十进制数字:12345678 数据低位就是数据的右边,数据高位就是数据的左边; 地址低位就是地址的左边,地址高位就是地址的右边。 假如一页纸表示内存的话,大端模式刚好符合我们 阅读全文
posted @ 2023-03-31 14:44 moonのsun 阅读(406) 评论(0) 推荐(0)
摘要: 1. I2C基本规则 ① start:scl = high,sda ↑ ② stop:scl = high,sda↓ ③ bit 1:scl = high,sda = 1 ④ bit 0:scl = high,sda = 0 总之:scl为高,sda才有效,可以保持电平或者上升下降;scl为低,sd 阅读全文
posted @ 2022-11-19 12:04 moonのsun 阅读(520) 评论(0) 推荐(0)
摘要: PICO 避坑指南 1. Win10 不需要串口驱动,使用PICO W之前先刷固件pico w的固件 micropython-firmware-pico-w-290622.rar 刚开始 刷的固件不对,一直无法识别串口。 2. 使用Mirco USB数据线(更粗),不要使用电源线 这种线目前比较少用,我随手找了一根,一 阅读全文
posted @ 2022-10-14 20:15 moonのsun 阅读(151) 评论(0) 推荐(0)
摘要: 1. UTC、GMT、墙上时间 Coordinated Universal Time(UTC) Greenwich Mean Time(GMT) 两者都表示标准时间,或世界时,几乎没有差异,后者更加精确 墙上时间也就是本地时间,说出墙上时间的时候,需要告知时区信息,这样才有意义。 2. typede 阅读全文
posted @ 2022-05-10 15:52 moonのsun 阅读(295) 评论(0) 推荐(0)
摘要: 今天查询协程的使用方法,找到一些不明觉厉的文章,以后对协程有了深入了解之后再多读几次: 1. https://zhuanlan.zhihu.com/p/146844906 《说说对协程的看法》 2. https://zhuanlan.zhihu.com/p/147608872 《也来谈谈协程》 —— 阅读全文
posted @ 2022-04-12 21:43 moonのsun 阅读(43) 评论(0) 推荐(0)
摘要: 条件变量 1. 条件变量初始化 1 // 方法1 2 pthread_cond_t cv = PTHREAD_COND_INITIALIZER; 3 4 5 // 方法2 6 pthread_cond_t cv; 7 pthread_condattr_t cattr; 8 int ret; 9 10 阅读全文
posted @ 2022-02-15 19:18 moonのsun 阅读(46) 评论(0) 推荐(0)
摘要: https://docs.oracle.com/cd/E19253-01/819-7051/index.html 1. Lightweight process(轻量进程) 用来执行内核代码和系统调用的内核线程,又称作 LWP。 一般来说内核只有进程,为了提高效率搞了一个轻量级进程,只用于内核调度。轻 阅读全文
posted @ 2022-02-09 10:31 moonのsun 阅读(44) 评论(0) 推荐(0)
摘要: 1.创建多进程 一般的步骤是这样的: #include <unistd.h> //C 和 C++ 程序设计语言中提供对POSIX 操作系统API 的访问功能的标头档的名称。是Unix Standard的缩写。 pid_t fpid; //fork函数返回值 fpid = fork(); //fork 阅读全文
posted @ 2021-09-23 10:35 moonのsun 阅读(156) 评论(0) 推荐(0)