CyberRT源码分析-协程实现
预备知识
x86-64寄存器和栈帧 - 知乎
【详解】函数栈帧——多图(c语言)_指针与函数值传递-CSDN博客
CyberRt协程介绍-CSDN博客
Linux内核启动流程分析
Linux内核启动流程分析我在学习Linux驱动的时候总感觉蒙着一层雾,让我看不清Linux内核的核心,Linux内核有很多子系统,我觉得有必要先从Linux Kernel的启动去宏观的看一下各个子系统是哪个时刻被启动的,我主要以ARM64为例子来分析Linux 内核的启动流程。我们知道在Linux内核启动之前是uboot,uboot会做一些初始化工作,如初始化ddr,我使用的内核源码为迅为电子提供的RK3588的linux SDK,内核版本为5.10.198
1. 内核链接文件 内核编译后生成的目标文件是ELF格式的vmlinux,vmlinux文件是各个源代码按照vmlinux.lds设定的规则,链接后得到的Object文件,并不是一个可执行的文件,不能在ARM平台上运行;通常会对其压缩,生成zImage或bzImage;通常内核映像以压缩格式存储,并不是一个可执行的内核;因此内核阶段需要先对内核映像自解压,他们的文件头部打包有解压缩程序
Linux内核的链接文件目录在arch/arm64/kernel/vmlinux.lds.S,内核在编译时会根据vmlinux.lds ...
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( ...
使用原始套接字剖析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 = ...