自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(148)
  • 资源 (4)
  • 收藏
  • 关注

原创 蓝桥杯电子类单片机组模块——DS1302

在蓝桥杯电子类单片机组历年的省赛以及国赛中,DS1302模块常常被考察到。而组委会为减轻考生负担,提前给出了关于DS1302模块的代码,剩下的便需要我们自己去编写(以第十届为例)。现在,我们来介绍以下DS1302模块剩余代码的编写以及模块的运用方法。1、补全模块C文件#include <reg52.h>#include <intrins.h>sbit SCK=P...

2020-02-26 18:03:32 2531

原创 蓝桥杯电子类单片机组模块——动态数码管

历年的蓝桥杯单片机组比赛都会考到数码管模块;对于省赛以及国赛来说,动态数码管都是必考模块!现在来给大家介绍动态数码管的使用方法1、对数码管进行操作,无需改变跳帽的位置2、数码管相关原理图如下...

2020-02-25 10:36:28 2821 1

原创 《C和指针》(7)函数

如果在一个函数的声明中,它的返回值类型为A,但它的函数体内有一条return语句,返回了一个类型为B的表达式。:如果在一个函数的声明中,它的返回值类型为A,但它的函数体内有一条return语句,返回了一个类型为B的表达式。如果一个函数被调用之前,编译器无法看到它的原型,如果当这个函数被调用时,实际传递给它的参数与它的形式参数不匹配,会发生什么情况?如果一个函数被调用之前,编译器无法看到它的原型,那么当这个函数返回一个不是整型的值时,会发生什么情况?:参数值被解释为形式参数的类型,而不是它们的实际类型。

2023-10-31 16:39:14 249

原创 《C和指针》(6)指针

下面的表显示了几个内存位置的内容。首先,假定所有的变量都是整型,找到表达式的右值,再找到它的左值,给出它所指定的内存位置的地址。指针在它被解引用之前增值,所以下一个被破坏的值就是存储于内存位置4的变量(假定整数的长度为4个字节)。如果硬件并没有捕捉到这个错误并终止程序,这个循环将快乐地继续下去,指针在内存中欢快地前行,破坏它遇见的所有值0当它再一次到达这个数组的位置时,就会重复上面这个过程,从而导致一个微妙的无限循环。当指针移到数组后面的那个内存位置时,那个最后被清零的内存内置就是保存指针的位置。

2023-10-29 20:56:54 548

原创 《C和指针》(5)操作符和表达式

根据下面的变量声明和初始化,计算下列每个表达式的值。如果某个表达式具有副作用(也就是说它修改了一个或多个变量的值),注明它们。在计算每个表达式时,每个变量所使用的是开始时给出的初始值,而不是前一个表达式的结果。请判断编译器是如何对各个表达式进行求值的,并在不改变求值顺序的情况下,尽可能去除多余的括号。:声明一个有符号整数,给它赋值负值,右移一位,然后打印结果。如何判断在你的机器上对一个有符号值进行右移位操作时执行的是算术移位还是逻辑移位?改写下面的代码段,消除多余的代码。下面这个程序的结果是什么?

2023-10-27 16:19:45 301

原创 十大排序算法(C语言)

算法分类算法复杂度相关概念。

2023-10-27 12:23:58 567

原创 CLion编辑器使用技巧

【代码】CLion编辑器使用技巧。

2023-10-24 19:15:58 81

原创 韦东山FreeRTOS(1)ARM架构简明教程

ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点:① 对内存只有读、写指令② 对于数据的运算是在CPU内部实现③ 使用RISC指令的CPU复杂度小一点,易于设计对于上图所示的乘法运算a = a * b,在RISC中要使用4条汇编指令:① 读内存a② 读内存b③ 计算a*b④ 把结果写入内存。

2023-10-24 11:27:44 341

原创 《C和指针》(3)数据

这两台机器的缺省整型长度并不相同,一个是16位,另一个是32位。程序所使用的有些变量的值并不太大,足以保存于任何一台机器的缺省整型变量中,但有些变量的值却较大,必须是32位的整型变量才能容纳它。一种可行的解决方案是用长整型表示所有的值,但在16位机器上,对于那些用16位足以容纳的值而言,时间和空间的浪费不可小视。一个有符号值和无符号值仅有的区别在于它的一半值是如何解释的.在一个有符号值中,它们是负值。如果你希望从不同的源文件的函数中访问这个变量,需不需要添加额外的声明,如果需要的话,应该添加什么样的声明?

2023-10-19 17:41:42 102

原创 《C和指针》(1)快速上手

如果想要注释某一行代码,可以使用如下条件编译指令,而不是采用普通的注释符。读入源代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给。的内容被逐字写到源文件的那个位置。

2023-10-13 20:34:26 88

原创 ACM模式注意事项

getline()

2023-10-09 21:58:45 93

原创 Linux内核源码分析 (B.0) 聊聊Netty那些事儿之从内核角度看IO模型

当我们熟悉了select的原理后,就很容易理解内核给我们提供的select API了。从select API中我们可以看到,select系统调用是在规定的超时时间内,监听(轮询)用户感兴趣的文件描述符集合上的可读可写异常三类事件。select传递给内核监听的文件描述符集合中数值最大的文件描述符+1,目的是用于限定内核遍历范围。select监听的文件描述符集合为,那么maxfdp1的值为5。对可读事件感兴趣的文件描述符集合。对可写事件感兴趣的文件描述符集合。对异常事件感兴趣的文件描述符集合。这里的。

2023-09-19 20:21:45 198

原创 Linux内核源码分析 (B.0)从 Linux 内核角度探秘 JDK NIO 文件读写本质

首先人们提出地址这个概念的目的就是用来方便定位现实世界中某一个具体事物的真实地理位置,它是一种用于定位的概念模型。举一个生活中的例子,比如大家在日常生活中给亲朋好友邮寄一些本地特产时,都会填写收件人地址以及寄件人地址。以及在日常网上购物时,都会在相应电商 APP 中填写自己的收获地址。image.png随后快递小哥就会根据我们填写的收货地址找到我们的真实住所,将我们网购的商品送达到我们的手里。

2023-09-19 20:20:17 557

原创 Linux内核源码分析 (B.11) 从内核世界透视 mmap 内存映射的本质(原理篇)

本文笔者从五个角度为大家详细介绍了 mmap 的使用方法及其在内核中的实现原理,这五个角度分别是:私有匿名映射,其主要用于进程申请虚拟内存,以及初始化进程虚拟内存空间中的 BSS 段,堆,栈这些虚拟内存区域。私有文件映射,其核心特点是背后映射的文件页在多进程之间是读共享的,多个进程对各自虚拟内存区的修改只能反应到各自对应的文件页上,而且各自的修改在进程之间是互不可见的,最重要的一点是这些修改均不会回写到磁盘文件中。

2023-09-19 20:02:42 281

原创 Linux内核源码分析 (B.10)构建 Linux 页表体系 —— 详解虚拟内存如何与物理内存进行映射

本文笔者通过页表体系这条主线脉络,为大家串讲了一下之前介绍的虚拟内存管理以及物理内存管理的相关内容,在我们回顾完虚拟内存管理和物理内存管理之后,随后我们引出了虚拟内存如何与物理内存进行映射这个问题,并在这个过程中为大家揭露了页表的本质。在我们清楚了页表的本质之后,笔者又沿着页表体系的演进这条主线,对单级页表,二级页表,四级页表展开了介绍,其中花了一定的篇幅为大家详细的介绍了 32 位和 64 位页表项以及页目录想的比特位布局,让大家真真实实的看到了页表项和页目录项到底长什么样子。

2023-09-19 20:00:14 287

原创 Linux内核源码分析 (B.9)深度解读 Linux 内核级通用内存池 —— kmalloc 体系

整个 kmalloc 通用内存池体系的核心是围绕着 kmalloc_caches 这个二维数组召开的。image.png其中一维数组中定义的是 kmalloc 内存池中的内存来源,在内核中使用。

2023-09-19 19:57:55 323

原创 Linux内核源码分析 (B.5)推演 slab 内存池的设计与实现

本文在伙伴系统的基础上又为大家详细介绍了一款内核专门应对小内存块管理的 slab 内存池,并列举了 slab 内存池在内核中的几种应用场景。然后我们从一个简单的内存页开始聊起,首先详细介绍了在 slab 内存池中所管理的内存块在内存中的布局:image.png在此基础上,笔者带大家继续采用一步一图的方式,一步一步地推演出 slab cache 的整体架构:image.png。

2023-09-19 19:55:09 72

原创 Linux内核源码分析 (B.8)深度解析 slab 内存池回收内存以及销毁全流程

整个 slab cache 系列篇幅非常庞大,涉及到的细节非常丰富,为了方便大家回顾,笔者这里将 slab cache 系列涉及到的重点内容再次梳理总结一下。《细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现》《从内核源码看 slab 内存池的创建初始化流程》《深入理解 slab cache 内存分配全链路实现》在本文正式进入 slab 相关内容之后,笔者首先为大家详细介绍了 slab 内存池中对象的内存布局情况,如下图所示:image.png。

2023-09-19 19:52:11 181

原创 Linux内核源码分析 (B.7)深入理解 slab cache 内存分配全链路实现

image.png本文我们基于 slab cache 的完整的架构,近一步深入到内核源码中详细介绍了 slab cache 关于内存分配的完整流程:image.png我们可以看到 slab cache 内存分配的整个流程分为 fastpath 快速路径和 slowpath 慢速路径。其中在 fastpath 路径下,内核会直接从 slab cache 的本地 cpu 缓存中获取内存块,这是最快的一种方式。

2023-09-19 19:50:24 134

原创 Linux内核源码分析 (B.6)从内核源码看 slab 内存池的创建初始化流程

本文笔者基于内核 5.4 版本,从源码角度详细讨论了 slab cache 的创建初始化过程,创建流程如下图所示:image.png经过该流程的创建之后,我们得到了如下图所示的 slab cache 架构:image.png在这个过程中,笔者又近一步从源码角度介绍了内核具体是如何对 slab 对象进行内存布局的。image.png在这个内存布局的基础上,笔者又近一步展开了内核如何计算一个 slab 到底需要多少个物理内存页,以及一个 slab 到底能够容纳多少内存块的相关逻辑。

2023-09-19 19:45:21 104

原创 Linux内核源码分析 (B.5)推演 slab 内存池的设计与实现

本文在伙伴系统的基础上又为大家详细介绍了一款内核专门应对小内存块管理的 slab 内存池,并列举了 slab 内存池在内核中的几种应用场景。然后我们从一个简单的内存页开始聊起,首先详细介绍了在 slab 内存池中所管理的内存块在内存中的布局:image.png在此基础上,笔者带大家继续采用一步一图的方式,一步一步地推演出 slab cache 的整体架构:image.png。

2023-09-19 19:43:08 216

原创 Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现

我们前面一直在谈伙伴系统,那么伙伴这个概念到底在内核中是什么意思呢?其实下面这张伙伴系统的结构图已经把伙伴的概念很清晰的表达出来了。image.png伙伴在我们日常生活中含义就是形影不离的好朋友,在内核中也是如此,内核中的伙伴指的是大小相同并且在物理内存上是连续的两个或者多个 page。比如在上图中,free_area[1] 中组织的是分配阶 order = 1 的内存块,内存块中包含了两个连续的空闲 page。这两个空闲 page 就是伙伴。

2023-09-19 19:38:52 855

原创 Linux内核源码分析 (B.3) 深入理解 Linux 物理内存分配全链路实现

本文首先从 Linux 内核中常见的几个物理内存分配接口开始,介绍了这些内存分配接口的各自的使用场景,以及接口函数中参数的含义。image.png并以此为起点,结合 Linux 内核 5.19 版本源码详细讨论了物理内存分配在内核中的整个链路实现。

2023-09-19 19:36:54 311

原创 Linux内核源码分析 (B.2)深入理解 Linux 物理内存管理

在我们理解了物理内存的 NUMA 架构,以及在 NUMA 架构下的内存分配策略之后,本小节笔者来为大家介绍下如何正确的利用 NUMA 提升我们应用程序的性能。前边我们介绍了这么多的理论知识,但是理论的东西总是很虚,正所谓眼见为实,大家一定想亲眼看一下 NUMA 架构在计算机中的具体表现形式,比如:在支持 NUMA 架构的机器上到底有多少个 NUMA 节点?每个 NUMA 节点包含哪些 CPU 核,具体是怎样的一个分布情况?前面也提到 CPU 在访问本地 NUMA 节点中的内存时,速度是最快的。

2023-09-19 19:34:24 482

原创 Linux内核源码分析 (B.1)深入理解 Linux 虚拟内存管理

首先人们提出地址这个概念的目的就是用来方便定位现实世界中某一个具体事物的真实地理位置,它是一种用于定位的概念模型。举一个生活中的例子,比如大家在日常生活中给亲朋好友邮寄一些本地特产时,都会填写收件人地址以及寄件人地址。以及在日常网上购物时,都会在相应电商 APP 中填写自己的收获地址。image.png随后快递小哥就会根据我们填写的收货地址找到我们的真实住所,将我们网购的商品送达到我们的手里。

2023-09-19 19:29:19 307

原创 Linux内核源码分析 (B.x)Linux内核的页面分配机制

一、伙伴系统如果不遵循以上原则,在一个很大的连续空间里,会出现不连续的空洞,造成外部碎片一般MAX_ORDER取11,也就是说Linux内核最大分配的最大内存块为2^10个页面,大小为4MB。二、迁移类型使用迁移类型可以实现反碎片化

2023-09-16 09:41:04 75

原创 Linux内核源码分析 (B.x)Linux内存布局

一、32位系统的内存布局为什么要将进程地址空间划分成内核空间和用户空间?这个和处理器的体系结构有关。比如X86分为ring0~ring3级别,ring0给内核空间使用,ring3给用户空间使用;同样的,ARMv7也是如此,svc给内核使用,user级别给用户程序使用的。所有进程共享内存空间,但各自都独立享用用户空间,给每个进程提供了一个自己占用整个进程地址空间的假象。线性映射区跟物理内存之间的转换非常方便,只需要添加一个偏移量即可。线性映射区也被成为低端内存,除线性映射区外的内核空间为高端

2023-09-15 17:40:58 61

原创 Linux内核源码分析 (B.x)Linux页表的映射

Linux内核源码分析 (B.x)Linux页表的映射文章目录Linux内核源码分析 (B.x)Linux页表的映射一、ARM32页表1、页表术语2、虚拟地址到物理地址转换3、一级页表项4、二级页表项二、ARM64页表1、ARMv8-A架构2、4KB大小页+4级映射三、Linux内核中关于页表的函数和宏1、查询页表2、判断页表项的状态3、修改页表四、研究实例一、ARM32页表1、页表术语在Linux内核源码中会用到PDG、PUD、PMF和PT等简称,但在ARM芯片手册上会使用L1、L2、L3等术

2023-09-14 11:36:10 155

原创 Linux内核源码分析 (B.x)Linux物理内存的初始化

详细可见《深入理解计算机系统》(6)存储器层次结构 1.1.4节内存模块伙伴系统的部分参考《深入理解计算机系统》第9章虚拟内存。

2023-09-13 11:47:50 203

原创 Linux内核源码分析 (B.x)虚拟地址空间布局架构

【代码】Linux内核源码分析 (B.2)虚拟地址空间布局架构。

2023-09-05 22:19:21 451

原创 Linux内核源码分析 (B.x)内核内存布局和堆管理

64位Linux一般使用48位来表示虚拟地址空间,45位表示物理地址。。查看Linux内核位数和proc通过输出系统架构内存分布情况,具体如下Linux内核动态内存分配通过系统接口实现vmallockmallocslab我们也可以通过vmallocARM64架构采用48位物理寻址方式,最大可寻找256TB的物理地址空间。对于目前应用完全足够,不需要扩展到64位。虚拟地址也同样最大支持48位寻址。Linux内核在大多数体系结构上将地址空间划为:用户空间和内核空间。

2023-09-04 18:26:33 150

原创 Linux内核源码分析 (A.6)RCU机制及内存优化屏障

在新值已经公布之后,旧的结构实例会怎么样呢?在所有的读访问完成之后,内核可以释放该内存,但它需要知道何时释放内存是安全的。为此,RCU提供了另外两个函数。不仅能保护一般的指针,还能保护内核提供的双链表和散列表。以链表为例,仍然可以使用标准的链表元素。只有在遍历链表、修改和删除链表元素时,必须调用标准函数的。尽管RCU能保护读访问不受写访问的干扰,但它不对写访问之间的相互干扰提供防护!甚至对于删除链表元素也是安全的。直接反引用指针是禁止的,按RCU的术语,该操作公布了这个指针,允许遍历链表的所有元素。

2023-09-03 22:35:51 130

原创 Linux内核源码分析 (A.5)多处理器调度

SMP 是多核处理器最常见的,主要是将一个计算机上集中一组处理器,各处理器是对等及其系统总线和内存子系统。SMP 架构如下图所示。根据处理器实际物理属性,CPU 域可分为超线程、多核。Linux 内核对 CPU 管理主要是通过。

2023-09-01 22:18:05 762

原创 Linux内核源码分析 常见内核问题

不能申请大于128K的数据。vmalloc 用于申请大块内存,虚拟地址连续,物理地址不一定连续,不能直接用于DMA,在进程地址空间有专门的一块。10. 在支持并使能 MMU 的系统中,Linux 内核和用于程序分别运行在物理地址模式还是虚拟地址模式?在支持并使能 MMU 的系统中,Linux 内核和用于程序分别运行在物理地址模式还是虚拟地址模式?申请大块内存,虚拟地址连续,物理地址不一定连续,不能直接用于DMA。64位可配置几级页表,一般可选3级/4级页表,256G/256G,或512T/512T。

2023-08-30 09:49:18 351

原创 Linux内核源码分析 (A.3)调度器的实现

每次调用调度器时,它会挑选具有最高等待时间的进程,把CPU提供给该进程。如果经常发生这种情况,那么进程的不公平待遇不会累积,不公平会均匀分布到系统中的所有进程。下图说明了调度器如何记录哪个进程已经等待了多长时间。由于可运行进程是排队的,该结构称之为就绪队列所有的可运行进程都按时间在一个红黑树中排序,所谓时间即其等待时间。等待CPU时间最长的进程是最左侧的项,调度器下一次会考虑该进程。等待时间稍短的进程在该树上从左至右排序。

2023-08-29 18:33:59 214 1

原创 Linux内核源码分析 (4)实时调度类及SMP

【代码】Linux内核源码分析 (4)实时调度类及SMP。

2023-08-29 17:27:44 109

原创 Linux内核源码分析 (A.4)CFS调度器及实时调度器

根据进程的重要性,分配给每个进程不同的权重。:指所有进程运行一遍所需要的时间;

2023-08-28 16:39:15 270

原创 Linux内核数据结构 散列表

在Linux内核中,散列表(哈希表)使用非常广泛。本文将对其数据结构和核心函数进行分析。桶对应链表的第一个普通结点和非第一个普通结点的代码是不一样的。同理结点插入操作也存在同样的问题。可以看到删除第一个普通结点和删除非第一个普通结点的代码是一样的。如果要删除hash桶对应链表中的第一个普通结点。如果要删除hash桶对应链表中的非第一个结点。中包含两个分别指向前驱结点和后继结点的指针。桶对应链表中的第一个普通结点:此时。域,所以,明显在这种情况下删除。

2023-08-26 18:29:17 484

原创 《代码随想录》专题:回溯算法

【代码】《代码随想录》专题:回溯算法1。

2023-08-25 22:28:55 257

原创 《代码随想录》专题:二叉树2

翻转二叉树对称二叉树。

2023-08-19 19:57:53 108

第10届蓝桥杯单片机省赛真题.rar

在这个资源压缩包里,你可以看到: 1)客观题及程序设计题一份 2)省一程序代码一份(实现率100%)

2021-05-21

第6届蓝桥杯单片机国赛真题.rar

在这个资源压缩包里,你可以看到: 1)客观题及程序设计题一份 2)程序代码一份

2021-05-20

蓝桥杯驱动程序设计.rtf

自己总结的基本驱动代码

2021-04-07

蓝桥杯第十一届省赛准备之历年真题.zip

为准备十一届蓝桥杯省赛,我历经千辛万苦收集了部分历年的省赛真题。该试题集供南昌大学以及其他高等院校的同学下载使用,不收取任何积分!

2020-02-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除