Linux内核中同步机制的底层实现
Linux内核同步机制剖析在Linux内核中提供了四种处理并发和竞争的方法,分别是原子操作、自旋锁、信号量、互斥量,事先说明下我使用的linux内核为版本为4.19.232
1. 原子变量在了解原子变量在linux内核中是如何实现之前,建议先了解以下SMP系统和UP系统的不同,然后学习以下cache一致性相关知识,这里给出一个参考链接
2.4 CPU 缓存一致性 | 小林coding (xiaolincoding.com)
原子操作又可以进一步细分为“整型原子操作”和“位原子操作”,这里首先对整型原子操作进行讲解。在 Linux 内核中使用 atomic_t 和 atomic64_t 结构体分别来完成 32 位系统和 64 位系统的整形数据原子操作,两个结构体定义在内核源码/include/linux/types.h文件中,具体定义如下:
对整型原子变量的操作有以下一些函数,定义在内核源码的/include/linux/atomic.h中,
函数
描述
ATOMIC_INIT(int i)
定义原子变量的时候对其初始化,赋值为 i
int atomic_read( ...
为Quard-star移植FreeRTOS-移植代码构建
移植FreeRTOS1. 内存布局与移植代码架构1.1 内存启动地址修改之前我们通过OpenSBI划分了Domain,HART7是留给FreeRTOS的,起始地址设置为了0xb0000000,我们修改一下,将FreeRTOS的起始地址设置为0xBF800000,第一个修改的代码为boot的start.s
基于opensbi为quard_star创建domain | TimerのBlog (yanglianoo.github.io)
//load trusted_fw.bin//[0x20400000:0x20800000] --> [0xBF800000:0xBFC00000] li a0, 0x204slli a0, a0, 20 //a0 = 0x20400000 li a1, 0xbf8slli a1, a1, 20 //a1 = 0xbf800000 li a2, 0xbfcslli a2, a2, 20 //a2 = 0xbfc00000load_data a0,a1,a2
trusted_fw.bin我们是写入到f ...
为Quard-star移植FreeRTOS-FreeRTOS内部机制剖析
博客很久没更新了,忙着写简历、刷题、找实习去了,实习offer倒是拿到几个,但是导师不让我出去实习,哎…….. 苦逼牛马研究生的无奈
FreeRTOS内部机制剖析FreeRTOS是一个嵌入式实时系统,内核设计十分精简,核心代码也比较少,是一个运行在单核cpu的系统 ,支持多种架构比如ARM、RISCV等
1.FreeRTOS编译运行移植此系统之前我们先来看一下如何编译运行,我们还是在qemu上运行。首先去下载源码:
官网:https://www.freertos.org/
Github:FreeRTOS/FreeRTOS: ‘Classic’ FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel. (github.com)
我下载的是GIthub的FreeRTOSv202107.00版本,FreeRTOS源码文件夹主要组成如下:
source为FreeRTOS源代码,包含不同平台移植相关的源码和FreeRTOS内核本身的 ...
使用原始套接字剖析TCP
1. 网络分层
按照OSI分层的话从上到下分为7层:物理层、链路层、网络层、传输层、会话层、表示层、应用层
一般来说会话层、表示层、应用层 统一称为 应用层
每张网卡都有一个唯一确定的地址,被称为MAC地址,通过这个全球唯一的MAC地址,就能标识不同的网络设备,MAC地址是一个48bit的值
2. Ethernet 封包格式2.1 以太网封包格式
字段
字段长度(字节)
说明
前导码(preamble)
7
0和1交替变换的码流
帧开始符(SFD)
1
帧起始符
目的地址(DA)
6
目的设备的MAC物理地址
源地址(SA)
6
发送设备的MAC物理地址
长度/类型(Length/Type)
2
帧数据字段长度/帧协议类型
数据及填充(data and pad)
46~1500
帧数据字段
帧校验序列(FCS)
4
数据校验字段
以太网帧大小必须在64-1518字节(不包含前导码和定界符),即包括目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)在内,其中数据段大小在46~1500字节 ...
CyberRt源码分析-对象池
1. FOR_EACH 宏实现代码目录:cyber/base/for_each.h
DEFINE_TYPE_TRAIT(HasLess, operator<) // NOLINTtemplate <class Value, class End>typename std::enable_if<HasLess<Value>::value && HasLess<End>::value, bool>::typeLessThan(const Value& val, const End& end) { return val < end;}template <class Value, class End>typename std::enable_if<!HasLess<Value>::value || !HasLess<End>::value, bool ...
CyberRt源码分析-无锁哈希表
1. 源码源码目录:cyber/base/atomic_hash_map.h
/** * @brief A implementation of lock-free fixed size hash map * * @tparam K Type of key, must be integral * @tparam V Type of value * @tparam 128 Size of hash table * @tparam 0 Type traits, use for checking types of key & value */template <typename K, typename V, std::size_t TableSize = 128, typename std::enable_if<std::is_integral<K>::value && (TableSize & (TableSize - 1)) == 0, ...
CyberRt源码分析-线程池
1. 源码在cyber/base/thread_pool.h中实现了一个线程池的类,写得很高级,我们来分析一下,代码如下:
class ThreadPool { public: explicit ThreadPool(std::size_t thread_num, std::size_t max_task_num = 1000); template <typename F, typename... Args> auto Enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type>; ~ThreadPool(); private: std::vector<std::thread> workers_; BoundedQueue<std::function<void()>> task_queue_; std::atomic_bool s ...
CyberRt源码分析-原子读写锁
1. 源码在cyber/base/atomic_rw_lock.h中实现了一个读写锁,代码如下:
class AtomicRWLock { friend class ReadLockGuard<AtomicRWLock>; friend class WriteLockGuard<AtomicRWLock>; public: static const int32_t RW_LOCK_FREE = 0; static const int32_t WRITE_EXCLUSIVE = -1; static const uint32_t MAX_RETRY_TIMES = 5; AtomicRWLock() {} explicit AtomicRWLock(bool write_first) : write_first_(write_first) {} private: // all these function only can used by ReadLockGuard/WriteLockGuard; ...
CyberRt源码剖析-有界无锁队列
1.源码在cyber/base/bounded_queue.h中实现了一个有界无锁队列的模板类,通过c++提供的原子操作来确保线程安全,代码如下:
template <typename T>class BoundedQueue { public: using value_type = T; using size_type = uint64_t; public: BoundedQueue() {} BoundedQueue& operator=(const BoundedQueue& other) = delete; BoundedQueue(const BoundedQueue& other) = delete; ~BoundedQueue(); bool Init(uint64_t size); bool Init(uint64_t size, WaitStrategy* strategy); bool Enqueue(const T& element); bool Enqueue(T&am ...
CyberRt源码剖析-无界无锁队列
1.源码在cyber/base/unbounded_queue.h中实现了一个无界无锁队列的模板类,通过c++提供的原子操作来确保线程安全,代码如下:
template <typename T>class UnboundedQueue { public: UnboundedQueue() { Reset(); } UnboundedQueue& operator=(const UnboundedQueue& other) = delete; UnboundedQueue(const UnboundedQueue& other) = delete; ~UnboundedQueue() { Destroy(); } void Clear() { Destroy(); Reset(); } void Enqueue(const T& element) { auto node = new Node(); node->data = ...