在 Linux 内核中 , 使用 vm_area_struct 结构体描述 " 进程 " 的 " 用户虚拟地址空间 " 的 地址区间 ;
mm_struct 结构体 , 定义在 Linux 内核源码的 linux-4.12\include\linux\mm_types.h#359 位置 ;
在linux内核中封装了一个通用的双向链表库,这个通用的链表库有很好的扩展性和封装性,它给我们提供了一个固定的指针域结构体,我们在使用的时候,只需要在我们定义的数据域结构体中包含这个指针域结构体就可以了,具体的实现、链接并不需要我们关心,只要调用提供给我们的相关接口就可以完成了。
memblock 分配器 定义在 Linux 内核源码的 linux-4.12\include\linux\memblock.h#48 位置 ;
VFS使得用户可以直接使用open()等系统调用而无需考虑具体文件系统和实际物理介质。
在 Linux 内核中 , MMU 内存管理单元 , 主要作用是 将 " 虚拟地址 " 映射到 真实的 " 物理地址 " 中 ,
题图来自 My second impression of Rust and why I think it's a great general-purpose language![1]
进程 的 " 虚拟地址空间 " 由 mm_struct 和 vm_area_struct 两个数据结构描述 ;
Linux 操作系统中的 " 堆内存 “ 是通过 malloc 等函数 ” 动态分配 " 的 内存区域 ;
container_of可以说是内核中使用最为频繁的一个函数了,简单来说,它的主要作用就是根据我们结构体中的已知的成员变量的地址,来寻求该结构体的首地址,直接看图,更容易理解。
工作队列常见的使用形式是配合中断使用,在中断的服务函数里无法调用会导致休眠的相关函数代码,有了工作队列机制以后,可以将需要执行的逻辑代码放在工作队列里执行,只需要在中断服务函数里触发即可,工作队列是允许被重新调度、睡眠。
如果 操作系统 中有 多个 CPU , 假设只有一个 CPU 计数器工作 , 如果 某个 CPU 正在访问计数器 , 其它 CPU 需要等待计数器释放 , 才能访问 CPU 计数器 , 这里 CPU 计数器会出现瓶颈 , 影响系统性能 ;
作为过来人,我发现很多程序猿新手,在编写代码的时候,特别喜欢定义很多独立的全局变量,而不是把这些变量封装到一个结构体中,主要原因是图方便,但是要知道,这其实是一个不好的习惯,而且会降低整体代码的性能。
最核心的结构体是irq_desc,之前为了易于理解,我们说在Linux内核中有一个中断数组,对于每一个硬件中断,都有一个数组项,这个数组就是irq_desc数组。
内核定时器是内核用来控制在未来某个时间点(基于jiffies(节拍总数))调度执行某个函数的一种机制,相关函数位于 <linux/timer.h> 和 kernel/timer.c 文件中。
本文对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Linux内核中非常常用的两个经典宏定义offsetof和container_of。内容包括: 1.Linux中的两个经典宏定义 2.Linux中双向链表的经典实现
大家好,我是程栩,一个专注于性能的大厂程序员,分享包括但不限于计算机体系结构、性能优化、云原生的知识。
很多时候,我们要监控系统状态,即监控系统cpu负载、进程状态等情况,如果我们在 Linux 应用层,我们有很多方式,命令行中常用 top、ps 命令,代码中,我们可以使用 popen 函数去执行一个 top 命令,获取返回值。或者我们直接读写 /proc下面的文件,都可以达到目的。
在Rust源代码中,rust/library/std/src/sys/itron/time.rs文件是用于实现与ITRON操作系统相关的时间功能。ITRON是一种实时操作系统,被广泛用于嵌入式系统中。这个文件中定义了一些与时间相关的结构体和函数。
链表是基本数据结构, 一开始学习数据结构时, 我一般这么定义, 对应实现从头或尾插入的处理函数,
Linux系统中,应用程序访问外设是通过文件的形式来进行的,Linux将所有的外设都看做文件,统一存放在/dev目录下。
memblock 分配器 涉及到 内存块 类型 , 在 Linux 内核中 , 使用 struct memblock_type 结构体 描述 ,
rust/src/tools/miri/src/concurrency/weak_memory.rs 文件是Miri工具中的一部分,用于实现弱内存模型。
这篇文章,按照下面这 2 张图,来描述 glib 在 Linux 和 Windows 平台上,是如何来进行线程库的设计的。
分区伙伴分配器概念 : Linux 内核 在 基本 伙伴分配器 基础上 , 增加了对 " 内存节点 “ 和 ” 内存区域 “ 的支持 , 这就是 ” 分区伙伴分配器 “ , 英文名称为 ” Zond Buddy Allocator " ;
上一篇博客 【Linux 内核 内存管理】分区伙伴分配器 ① ( 分区伙伴分配器源码数据结构 | free_area 空闲区域数组 | MAX_ORDER 宏定义 | 空闲区域的页最大阶数 ) 中 ,
今天跟大家分享一首华晨宇的《我管你》,个人觉得这首歌表达了一种年轻人的热血感,每次听都让自己非常来劲。最近工作挺忙的,写文章或许已经成为了一种兴趣和爱好了吧,也希望每次作者的唠叨都能带给各位小伙伴一些小小的收获。
在Rust的源代码中,rust/compiler/rustc_target/src/spec/mod.rs文件的作用是定义和实现有关目标平台的规范。
FreeRTOS 上的网络,驱动部分源码没有开源,用户实际使用时也无需关系具体实现,更多的是做网络管理的逻辑接口开发,所以我们提供了网络中间件 Wi-Fi Manager,Wi-Fi Manager 支持sta, ap, monitor 等多种网络工作模式的管理,本文档重点介绍 Wi-Fi Manager 中间件的使用,配置,框架,接口。
调度器 的 主要职责 就是 对 " 进程 " 进行 " 调度管理 " , 调度时 进程 是放在 " 调度队列 " 中的 ,
从进程的角度出发来剖析 cgroups 相关数据结构之间的关系。在 Linux 中管理进程的数据结构是 task_struct。cgroup表示进程的行为控制,因为子系统必须要知道进程是位于哪一个cgroup,所以在struct task_struct和cgroup中存在一种映射。
Linux 内核中 , 内存节点 ( Node ) 是 " 内存管理 " 的 最顶层的结构 , 下层分别是 区域 和 页 ;
提到了关于Linux的设备驱动,那么在Linux中I/O设备可以分为两类:块设备和字符设备。这两种设备并没有什么硬件上的区别,主要是基于不同的功能进行了分类,而他们之间的区别也主要是在是否能够随机访问并操作硬件上的数据。
在 Linux 内核 中 , " 进程控制块 " 是通过 task_struct 结构体 进行描述的 ; Linux 内核中 , 所有 进程管理 相关算法逻辑 , 都是基于 task_struct 结构体的 ;
在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织。这些链表大多采用在include/linux/list.h实现的一个相当精彩的链表数据结构。
在 【Linux 内核】实时调度类 ② ( 实时调度实体 sched_rt_entity 源码分析 | run_list、timeout、watchdog_stamp、time_slice 字段 ) 博客中 , 简单介绍了 在 linux-5.6.18\include\linux\sched.h 头文件中定义的 实时调度实体 sched_rt_entity 源码 ,
首先source insight 是一个强大的文本编辑工具,比一般的编辑器便捷! 而且可以快速查看定义,查看调用,查看引用功能,非常有利于查看大量代码!
结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论;
list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针。现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一宏设计的精妙之处。
通过前两篇文章的介绍,我们已经把linux内核移植到了tiny210上,但是看到的现象都是通过超级终端来观察的,下面了,我们介绍一下led灯的移植,给大家一个更直观的感受。这篇文章主要的内容如下:
Linux 内核源码 linux-5.6.18\kernel\sched\sched.h 中 , 定义的 struct sched_class 调度类结构体 , 就是 " 调度器 " 对应的类 ;
我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。
在上期文章中,已经给大家分享过offsetof()和container_of两个宏函数,这两个宏函数在Linux内核链表里面有大量的应用,对于我们平时工作写代码有很大的帮助。下面是Linux内核链表的内容分享。
工业场合里面也有大量的模拟量和数字量之间的转换,也就是我们常说的 ADC 和 DAC。而且随着手机、物联网、工业物联网和可穿戴设备的爆发,传感器的需求只持续增强。比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等,这些传感器本质上都是ADC,大家注意查看这些传感器的手册,会发现他们内部都会有个 ADC,传感器对外提供 IIC或者 SPI 接口,SOC 可以通过 IIC 或者 SPI 接口来获取到传感器内部的 ADC 数值,从而得到想要测量的结果。Linux 内核为了管理这些日益增多的 ADC 类传感器,特地推出了 IIO 子系统,我们学习如何使用 IIO 子系统来编写 ADC 类传感器驱动。
领取专属 10元无门槛券
手把手带您无忧上云