18 内核开发-内核重点数据结构学习

课程简介:
Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础,让他们能够理解和参与到Linux内核的开发过程中。

课程特点:
1. 入门级别:该课程专注于为初学者提供Linux内核开发的入门知识。无论你是否具有编程或操作系统的背景,该课程都将从最基本的概念和技术开始,逐步引导学习者深入了解Linux内核开发的核心原理。

2. 系统化学习:课程内容经过系统化的安排,涵盖了Linux内核的基础知识、内核模块编程、设备驱动程序开发等关键主题。学习者将逐步了解Linux内核的结构、功能和工作原理,并学习如何编写和调试内核模块和设备驱动程序。

3. 实践导向:该课程强调实践,通过丰富的实例和编程练习,帮助学习者将理论知识应用到实际的Linux内核开发中。学习者将有机会编写简单的内核模块和设备驱动程序,并通过实际的测试和调试来加深对Linux内核开发的理解。

4. 配套资源:为了帮助学习者更好地掌握课程内容,该课程提供了丰富的配套资源,包括教学文档、示例代码、实验指导和参考资料等。学习者可以根据自己的学习进度和需求,灵活地利用这些资源进行学习和实践。

无论你是计算机科学专业的学生、软件工程师还是对Linux内核开发感兴趣的爱好者,Linux内核开发入门课程都将为你提供一个扎实的学习平台,帮助你掌握Linux内核开发的基础知识,为进一步深入研究和应用Linux内核打下坚实的基础。

这一讲,主要分享内核中的重点数据结构,并且以脑图的形式进行整理,后面如果有其他内核数据结构,会一同整理到这里。主要介绍内核中使用的4大数据结构:链表,队列,映射,二叉树。

以下是脑图主要内容。

需要脑图文件的可以私信或者评论留言,可以免费同步给你。文章后再贴下 list.h kfifo.h 相关文件定义

LXR linux/include/linux/klist.h 

  1/*2 *      klist.h - Some generic list helpers, extending struct list_head a bit.3 *4 *      Implementations are found in lib/klist.c5 *6 *7 *      Copyright (C) 2005 Patrick Mochel8 *9 *      This file is rleased under the GPL v2.10 */1112#ifndef _LINUX_KLIST_H13#define _LINUX_KLIST_H1415#include <linux/spinlock.h>16#include <linux/completion.h>17#include <linux/kref.h>18#include <linux/list.h>1920struct klist_node;21struct klist {22        spinlock_t              k_lock;23        struct list_head        k_list;24        void                    (*get)(struct klist_node *);25        void                    (*put)(struct klist_node *);26};272829extern void klist_init(struct klist * k, void (*get)(struct klist_node *),30                       void (*put)(struct klist_node *));3132struct klist_node {33        struct klist            * n_klist;34        struct list_head        n_node;35        struct kref             n_ref;36        struct completion       n_removed;37};3839extern void klist_add_tail(struct klist_node * n, struct klist * k);40extern void klist_add_head(struct klist_node * n, struct klist * k);4142extern void klist_del(struct klist_node * n);43extern void klist_remove(struct klist_node * n);4445extern int klist_node_attached(struct klist_node * n);464748struct klist_iter {49        struct klist            * i_klist;50        struct list_head        * i_head;51        struct klist_node       * i_cur;52};535455extern void klist_iter_init(struct klist * k, struct klist_iter * i);56extern void klist_iter_init_node(struct klist * k, struct klist_iter * i, 57                                 struct klist_node * n);58extern void klist_iter_exit(struct klist_iter * i);59extern struct klist_node * klist_next(struct klist_iter * i);6061#endif62

The original LXR software by the LXR community, this experimental version by lxr@linux.no.

LXR linux/include/linux/kfifo.h 

  1/*2 * A simple kernel FIFO implementation.3 *4 * Copyright (C) 2004 Stelian Pop <stelian@popies.net>5 *6 * This program is free software; you can redistribute it and/or modify7 * it under the terms of the GNU General Public License as published by8 * the Free Software Foundation; either version 2 of the License, or9 * (at your option) any later version.10 *11 * This program is distributed in the hope that it will be useful,12 * but WITHOUT ANY WARRANTY; without even the implied warranty of13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the14 * GNU General Public License for more details.15 *16 * You should have received a copy of the GNU General Public License17 * along with this program; if not, write to the Free Software18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.19 *20 */21#ifndef _LINUX_KFIFO_H22#define _LINUX_KFIFO_H2324#ifdef __KERNEL__2526#include <linux/kernel.h>27#include <linux/spinlock.h>2829struct kfifo {30        unsigned char *buffer;  /* the buffer holding the data */31        unsigned int size;      /* the size of the allocated buffer */32        unsigned int in;        /* data is added at offset (in % size) */33        unsigned int out;       /* data is extracted from off. (out % size) */34        spinlock_t *lock;       /* protects concurrent modifications */35};3637extern struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,38                                gfp_t gfp_mask, spinlock_t *lock);39extern struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,40                                 spinlock_t *lock);41extern void kfifo_free(struct kfifo *fifo);42extern unsigned int __kfifo_put(struct kfifo *fifo,43                                unsigned char *buffer, unsigned int len);44extern unsigned int __kfifo_get(struct kfifo *fifo,45                                unsigned char *buffer, unsigned int len);4647/**48 * __kfifo_reset - removes the entire FIFO contents, no locking version49 * @fifo: the fifo to be emptied.50 */51static inline void __kfifo_reset(struct kfifo *fifo)52{53        fifo->in = fifo->out = 0;54}5556/**57 * kfifo_reset - removes the entire FIFO contents58 * @fifo: the fifo to be emptied.59 */60static inline void kfifo_reset(struct kfifo *fifo)61{62        unsigned long flags;6364        spin_lock_irqsave(fifo->lock, flags);6566        __kfifo_reset(fifo);6768        spin_unlock_irqrestore(fifo->lock, flags);69}7071/**72 * kfifo_put - puts some data into the FIFO73 * @fifo: the fifo to be used.74 * @buffer: the data to be added.75 * @len: the length of the data to be added.76 *77 * This function copies at most 'len' bytes from the 'buffer' into78 * the FIFO depending on the free space, and returns the number of79 * bytes copied.80 */81static inline unsigned int kfifo_put(struct kfifo *fifo,82                                     unsigned char *buffer, unsigned int len)83{84        unsigned long flags;85        unsigned int ret;8687        spin_lock_irqsave(fifo->lock, flags);8889        ret = __kfifo_put(fifo, buffer, len);9091        spin_unlock_irqrestore(fifo->lock, flags);9293        return ret;94}9596/**97 * kfifo_get - gets some data from the FIFO98 * @fifo: the fifo to be used.99 * @buffer: where the data must be copied.100 * @len: the size of the destination buffer.101 *102 * This function copies at most 'len' bytes from the FIFO into the103 * 'buffer' and returns the number of copied bytes.104 */105static inline unsigned int kfifo_get(struct kfifo *fifo,106                                     unsigned char *buffer, unsigned int len)107{108        unsigned long flags;109        unsigned int ret;110111        spin_lock_irqsave(fifo->lock, flags);112113        ret = __kfifo_get(fifo, buffer, len);114115        /*116         * optimization: if the FIFO is empty, set the indices to 0117         * so we don't wrap the next time118         */119        if (fifo->in == fifo->out)120                fifo->in = fifo->out = 0;121122        spin_unlock_irqrestore(fifo->lock, flags);123124        return ret;125}126127/**128 * __kfifo_len - returns the number of bytes available in the FIFO, no locking version129 * @fifo: the fifo to be used.130 */131static inline unsigned int __kfifo_len(struct kfifo *fifo)132{133        return fifo->in - fifo->out;134}135136/**137 * kfifo_len - returns the number of bytes available in the FIFO138 * @fifo: the fifo to be used.139 */140static inline unsigned int kfifo_len(struct kfifo *fifo)141{142        unsigned long flags;143        unsigned int ret;144145        spin_lock_irqsave(fifo->lock, flags);146147        ret = __kfifo_len(fifo);148149        spin_unlock_irqrestore(fifo->lock, flags);150151        return ret;152}153154#else155#warning "don't include kernel headers in userspace"156#endif /* __KERNEL__ */157#endif158

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

办公数据分析利器:Excel与Power Query透视功能

数据分析利器&#xff1a;Excel与Power Query透视功能 Excel透视表和Power Query透视功能是强大的数据分析工具&#xff0c;它们使用户能够从大量数据中提取有意义的信息和趋势&#xff0c;可用于汇总、分析和可视化大量数据。 本文通过示例演示Power Query透视功能的一个小技…

Linux专栏08:Linux基本指令之压缩解压缩指令

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Linux基本指令之压缩解压缩指令 编号&#xff1a;08 文章目录 Linu…

Spring Boot与OpenCV:融合机器学习的智能图像与视频处理平台

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【模板】二维前缀和

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二维前缀和板题。 二维前缀和&#xff1a;pre[i][j]a[i][j]pre[i-1][j]pre[i][j-1]-pre[i-1][j-1]; 子矩阵 左上角为(x1,y1) 右下角(x2,y2…

PG控制文件的管理与重建

一.控制文件位置与大小 逻辑位置&#xff1a;pgpobal 表空间中 物理位置&#xff1a;$PGDATA/global/pg_control --pg_global表空间的物理位置就在$PGDATA/global文件夹下 物理大小&#xff1a;8K 二.存放的内容 1.数据库初始化的时候生成的永久化参数&#xff0c;无法更改…

brpc中http2 grpc协议解析

搭建gRPC服务 | bRPC https://blog.csdn.net/INGNIGHT/article/details/132657099 global.cpp http2_rpc_protocol.cpp ParseH2Message解析frame header信息 ParseResult H2Context::ConsumeFrameHead( 这个是固定长度的9字节帧头部&#xff0c;length是&#xff0c;3*8bit…

Mysql技能树学习

查询进阶 别名 MySQL支持在查询数据时为字段名或表名指定别名&#xff0c;指定别名时可以使用AS关键字。 BETWEEN AND条件语句 mysql> SELECT * FROM t_goods WHERE id BETWEEN 6 AND 8; 查询特定数据 &#xff08;CASE&#xff09; select name,case when price <…

Linux 麒麟系统安装

国产麒麟系统官网地址&#xff1a; https://www.openkylin.top/downloads/ 下载该镜像后&#xff0c;使用VMware部署一个虚拟机&#xff1a; 完成虚拟机创建。点击&#xff1a;“开启此虚拟机” 选择“试用试用开放麒麟而不安装&#xff08;T&#xff09;”&#xff0c;进入op…

Cisco Firepower FTD生成troubleshooting File

在出现故障时&#xff0c;需要采集信息 FMC上需要采集对应FTD设备的troubleshooting file system -->health -->monitor 选择相应的FTD&#xff0c;右侧点 generate Generate 4 右上角小红点点开 选择里面的task,就可以看到进度&#xff0c;差不多要10分钟以上 5 完成后…

基于51单片机的交通灯设计—可调时间、夜间模式

基于51单片机的交通灯设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.四方向数码管同时显示时间&#xff1b; 2.LED作红、绿、黄灯 3.三个按键可以调整红绿灯时间&#xff1b; 4.夜间模式&am…

IDEA上文件换行符、分隔符(Line Separator)LF,CR,CRLF错乱影响Git上传Github或Gitee代码

IDEA上文件换行符、分隔符(Line Separator)LF&#xff0c;CR&#xff0c;CRLF错乱影响Git上传Github或Gitee代码 指定目录 然后就可以上传了 OK 一定注意更改Line Separator的文件目录 如果是target目录下的文件,是不能修改为LF的,把target文件删除,再重载一次main文件,就…

FFmpeg学习记录(二)—— ffmpeg多媒体文件处理

1.日志系统 常用的日志级别&#xff1a; AV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_DEBUG #include <stdio.h> #include <libavutil/log.h>int main(int argc, char *argv[]) {av_log_set_level(AV_LOG_DEBUG);av_log(NULL, AV_LOG_DEBUG, "hello worl…

【软考高项】三十一、成本管理4个过程

一、规划成本管理 1、定义、作用 定义&#xff1a;确定如何估算、预算、管理、监督和控制项目成本的过程作用&#xff1a;在整个项目期间为如何管理项目成本提供指南和方向 应该在项目规划阶段的早期就对成本管理工作进行规划&#xff0c;建立各成本管理过程的基本框架&…

RKNN Toolkit2 工具的使用

RKNN Toolkit2 是由瑞芯微电子 (Rockchip) 开发的一套用于深度学习模型优化和推理的工具。它主要面向在瑞芯微SoC上进行AI应用开发&#xff0c;但也可以用于PC平台进行模型的转换、量化、推理等操作。它支持将多种深度学习框架的模型&#xff08;如Caffe, TensorFlow, PyTorch等…

单例、工厂、策略、装饰器设计模式

1. 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 单例模式是一种常用的设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这种模式的特点是类自己负责保存其唯一的实例&#xff0c;并控制其实例化过程。单例模式广泛应用…

【hackmyvm】vivifytech靶机

渗透思路 信息收集端口扫描端口服务信息目录扫描爆破hydra--sshgit提权 信息收集 ┌──(kali㉿kali)-[~] └─$ fping -ag 192.168.9.0/24 2>/dev/null 192.168.9.119 --主机 192.168.9.164 --靶机个人习惯&#xff0c;也方便后续操作&#xff0c;将IP地址赋值给一个变…

【R语言数据分析】卡方检验

目录 交叉卡方检验 配对卡方检验 趋势卡方检验 交叉卡方检验 交叉卡方表用于比较组间“率”的差异。适用于分类型变量&#xff0c;被检验的分类变量应该是无序分类变量&#xff0c;分组变量可以是有序分组也可以是无序分组。比如比较两种药物治疗某个疾病的效率&#xff0c;…

Jhipster8禁用liquibase

开发环境添加dev,no-liquibase&#xff1b;

Stable Diffusion AI绘画

我们今天来了解一下最近很火的SD模型 ✨在人工智能领域&#xff0c;生成模型一直是研究的热点之一。随着深度学习技术的飞速发展&#xff0c;一种名为Stable Diffusion的新型生成模型引起了广泛关注。Stable Diffusion是一种基于概率的生成模型&#xff0c;它可以学习数据的潜…

INVS 对时钟二分频器(reg-clkgen)的理解和处理

在时钟树的设计中&#xff0c;有很多方式处理分频时钟&#xff0c;常见的无外乎两种模式&#xff1a; 时钟二分频器&#xff08;reg-clkgen&#xff09;门控时钟 二者在功能上略有不同&#xff0c;比较的大差异是前者可以简单的实现50%占空比&#xff0c;后者却对功耗友好同时…