- 博客(44)
- 资源 (3)
- 收藏
- 关注
原创 【Linux设备驱动】1.字符设备驱动程序框架及相关结构体
字符设备驱动的总体框架可以分为:驱动模块加载函数、驱动模块卸载函数、填充file_operations结构体中的具体操作函数
2024-05-25 16:17:01
1164
原创 FreeRTOS:3.信号量
信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,实现的方式主要就是依靠队列(信号量是特殊的队列)的任务阻塞机制。
2024-04-28 10:06:01
835
原创 FreeRTOS:1.通用链表分析
该系列记录学习FreeRTOS的源码的过程,基于,以及FreeRTOS源码进行学习。首先是FreeRTOS内核的通用链表实现。
2024-04-17 16:35:20
1221
原创 算法模板 7.拓扑排序
先把入度为0的点压入队列,然后进行广度优先搜索(找到队头,弹出队头,对队头能够访问的边进行广搜),并且把对应的边剪掉(入度-1),再进行一次入度为0 的点搜索(判断该点是否入度为0)这样的一次维护队列的过程,就完成了拓扑序的维护。每次弹出队头,要把队头进行存储。用来解决循环依赖相关问题!一个有向无环图一定存在一个。有向无环图也被称作拓扑图。
2024-02-20 10:38:56
302
原创 算法模板 5.十大排序
它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;重复这样的操作,当gap=1时,整个数列就是有序的。对于待排序数组,从第 2 个元素开始 (称作插入对象元素) ,比较它与之前的元素 (称作比较对象元素) ,当插入对象元素小于比较对象元素时,继续往前比较,直到不小于 (≥) 比较对象,此时将插入对象元素插入到该次比较对象元素之后。:每次寻找一组数据中最大的元素,两两比较,找到后放到数据的最后一位。
2024-02-02 11:53:08
682
1
原创 算法模板 3.二分查找
已知答案具有单调性,根据答案估计其上下界,然后进行二分,自定义check函数,在check函数中判断这个答案mid是否合法,然后移动边界进行二分。(这里一般预留100倍的精度)时,则跳出循环。关键点在于当左边界和右边界足够接近,即。
2024-02-02 10:49:08
226
原创 ARM汇编 4.GNU伪指令、内联汇编
杂项伪操作符:.global 定义全局符号.align 指定数据对齐方式.include 引入头文件,也可以#include.incbin 伪操作:将一个二进制文件编译到当前文件,用于静态库.rept:重复接下来的指令,以.rept开始,.end结束.if伪操作:根据表达式的值来决定是否要编译下面的代码.macro伪操作:将一段代码定义为一个整体,类似c里面的宏函数。
2024-01-30 21:30:16
563
原创 ARM汇编 3.arm异常
软件中断指令(swi)异常:是由应用程序自己调用时产生的,用户程序申请访问硬件资料时需要调用该指令。如Printf函数,打印需要申请显示器,用户程序没有外设硬件的使用权,只能通过使用软件中断指令切换到内核态。(为了保护操作系统的安全和硬件资源的合理使用,在SVC模式下处理)
2024-01-30 21:14:46
276
原创 MIT 6s081 lab5.xv6文件系统
int valid;int disk;uint dev;//块号//睡眠锁//引用该块的个数//该buf的前一个buf//该buf的后一个buf// 缓存的数据xv6使用一些数据结构来定义日志区int n;// 日志的大小 int block [ LOGSIZE ];// 日志的位置关系信息 };int start;//日志区第一块块号 int size;// 日志区的大小 int outstanding;
2024-01-30 11:51:50
1989
原创 MIT 6s081 lab4.xv6进程调度
首先对一些合法性进行判断,此时必须持有当前进程的锁,该cpu的锁的链表长度不超过1(否则会发生死锁问题),当前进程为运行态,中断是否已经关闭,记录当前CPU的初始的中断开关状态,然后调用swtch进程上下文切换,此时进入内核进程中(调度器进程)。在这里,进程上下文中不仅包含了这些寄存器,还保存了ra寄存器和sp寄存器,分别保存了返回地址(用于进程恢复时指令从正确的位置开始运行),sp寄存器(用于进程被重新调度后内核栈正确恢复)另外一个发生调度的地方在睡眠锁的使用中,也就是。
2024-01-23 20:46:40
1088
原创 MIT 6s081 lab3.xv6自旋锁和休眠锁
xv6实现了两种锁:自旋锁和休眠锁,来保证临界资源的互斥访问。锁的特性就是只有一个进程可以获取锁,在任何时间点都不能有超过一个锁的持有者。
2024-01-17 16:55:25
577
原创 MIT 6s081 blog2.xv6 Trap(陷阱)机制
trap机制:每当程序执行、一个设备触发了使得当前程序运行需要响应内核设备驱动。从来源上看,陷阱可以分为用户态陷阱(系统调用、严重错误、中断)和内核态陷阱(严重错误、中断)。
2024-01-17 10:42:58
1238
原创 MIT 6s081 lab8:locks
优化思路:建立一个blockno到buf的hash table,为每个桶单独加锁(降低锁的粒度),当两个进程同时访问的块哈希到同一个桶时,才会发生竞争,当桶中的空闲Buf不足时,从其他桶中获取Buf,并采用时间戳(全局ticks)的优化方式替换原本的双向链表。2、从0开始遍历其他桶,在每个桶中查找引用计数为0的最近最久没有使用的Buf,如果有,则先将这个buf从原本的桶中删去,再将这个buf添加到桶key,并修改buf的内容,返回。1、首先为每个CPU分配一个全局的内存空闲列表和锁,并完成初始化。
2024-01-15 19:32:27
937
原创 MIT 6s081 lab7:Multithreading
在调用本函数 uthread_switch() 的过程中,caller-saved registers 已经被调用者保存到栈帧中了,所以这里无需保存这一部分寄存器。当线程进入barrier时,将已进入屏障的线程数+1,然后判断是否全部到达,如果未到达,则休眠等待,如果已经到达,就唤醒所有在等待的线程,所有线程继续运行。这个实验其实相当于在用户态重新实现一遍 xv6 kernel 中的 scheduler() 和 swtch() 的功能,所以大多数代码都是可以借鉴的。实现一个用户态的线程库。
2024-01-15 19:26:54
432
原创 MIT 6s081 lab6:Copy-on-Write Fork for xv6
实现 fork 懒复制机制,在进程 fork 后,不立刻复制内存页,而是将虚拟地址指向与父进程相同的物理地址。在父子任意一方尝试对内存页进行修改时,才对内存页进行复制。物理内存页必须保证在所有引用都消失后才能被释放,这里需要有引用计数机制。一开始做的时候没有上锁,一直没通过全部测试。后来参考了下面这位大佬的博客后意识到了竞争问题,加入自旋锁后顺利通过测试。
2024-01-15 19:24:21
1049
原创 MIT 6s081 lab5: xv6 lazy page allocation
虚拟内存的两个主要的优点:1、隔离性:每个应用程序拥有自己的地址空间,因此不可能修改其他应用程序的内存数据,同时用户空间和内核空间也具备隔离性2、抽象,处理器和指令可以使用虚拟地址,内核会定义从虚拟地址到物理地址的映射关系page fault可以使得地址映射关系变得动态,内核可以更新page table,内核将会有巨大的灵活性。
2024-01-15 16:24:21
1096
原创 MIT 6s081 lab4:traps
根据指导书的内容,完成backtrace的,本质上就是根据栈帧的结构进行偏移得到函数返回地址和上一个栈帧的地址,然后进行回溯(笔者采用循环的方式进行回溯,当超过内核地址空间范围时退出循环。test2使用的定时处理程序,运行比较慢,还没运行完,设定的tick又到了,于是又去执行定时处理程序,这就导致了死循环,解决方案:添加一个防止重入的标志。3、在proc.h中添加3个字段,用于保存定时的间隔、handler的地址、定时启动后经过的tick,然后在allocproc中对这三个字段初始化。
2024-01-15 16:19:03
932
原创 MIT 6s081 lab3:page tables
本实验的目标:修改页表、简化从用户态拷贝数据到内核态的方法其实页表就几个操作:创建页表、添加PTE项,查找PTE项,清空PTE项,释放PTE对应的物理空间,释放页表本身占用的物理空间。
2024-01-15 16:12:24
1032
原创 MIT 6s081 lab2:system calls
U/_traceprocfork()1、在用户层声明接口2、在内核中,把用户调用的参数读入,然后传给进程结构体的参数3、在fork中,把父进程的参数拷贝给子进程4、在syscall统一的接口中(通过确定系统调用的编号,作为函数指针数组中的索引,进而调用到具体的函数,函数调用的参数从进程的参数中获取argint函数。
2024-01-15 16:01:58
431
原创 MIT 6s081 lab1:Xv6 and Unix utilities
作业网址:https://pdos.csail.mit.edu/6.828/2020/labs/util.html。
2024-01-15 15:55:47
1154
原创 MIT 6s081 blog1.xv6内存管理
如xv6指导书中图3.3:从0x80000000开始的地址为内核地址空间,CLINT、PLIC、uart0、virtio disk等为I/O设备(内存映射I/O),可以看到xv6虚拟地址到物理地址的映射,大部分是相等的关系。在kernel/memlayout.h中对内存分布进行了宏定义。
2024-01-15 15:32:51
1650
1
原创 【AutoCAD】AutoCAD使用、学习记录
AutoCAD使用学习记录完成机械设计课程设计(内容为双级斜齿圆柱齿轮减速箱),记录对该软件的学习心得。
2021-07-09 18:01:20
369
原创 【Multisim14.0】buck电路的仿真实现
本篇使用multisim14.0仿真buck电路,对结果进行了适当的分析,还进行了踩坑分享。
2020-11-17 19:18:54
23768
6
Fusion 360 Client Downloader.exe
2020-11-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人