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

news2024/12/25 23:42:09

课程简介:
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.c
  5 *
  6 *
  7 *      Copyright (C) 2005 Patrick Mochel
  8 *
  9 *      This file is rleased under the GPL v2.
  10 */
  11
  12#ifndef _LINUX_KLIST_H
  13#define _LINUX_KLIST_H
  14
  15#include <linux/spinlock.h>
  16#include <linux/completion.h>
  17#include <linux/kref.h>
  18#include <linux/list.h>
  19
  20struct 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};
  27
  28
  29extern void klist_init(struct klist * k, void (*get)(struct klist_node *),
  30                       void (*put)(struct klist_node *));
  31
  32struct klist_node {
  33        struct klist            * n_klist;
  34        struct list_head        n_node;
  35        struct kref             n_ref;
  36        struct completion       n_removed;
  37};
  38
  39extern void klist_add_tail(struct klist_node * n, struct klist * k);
  40extern void klist_add_head(struct klist_node * n, struct klist * k);
  41
  42extern void klist_del(struct klist_node * n);
  43extern void klist_remove(struct klist_node * n);
  44
  45extern int klist_node_attached(struct klist_node * n);
  46
  47
  48struct klist_iter {
  49        struct klist            * i_klist;
  50        struct list_head        * i_head;
  51        struct klist_node       * i_cur;
  52};
  53
  54
  55extern 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);
  60
  61#endif
  62

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 modify
  7 * it under the terms of the GNU General Public License as published by
  8 * the Free Software Foundation; either version 2 of the License, or
  9 * (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 of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19 *
  20 */
  21#ifndef _LINUX_KFIFO_H
  22#define _LINUX_KFIFO_H
  23
  24#ifdef __KERNEL__
  25
  26#include <linux/kernel.h>
  27#include <linux/spinlock.h>
  28
  29struct 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};
  36
  37extern 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);
  46
  47/**
  48 * __kfifo_reset - removes the entire FIFO contents, no locking version
  49 * @fifo: the fifo to be emptied.
  50 */
  51static inline void __kfifo_reset(struct kfifo *fifo)
  52{
  53        fifo->in = fifo->out = 0;
  54}
  55
  56/**
  57 * kfifo_reset - removes the entire FIFO contents
  58 * @fifo: the fifo to be emptied.
  59 */
  60static inline void kfifo_reset(struct kfifo *fifo)
  61{
  62        unsigned long flags;
  63
  64        spin_lock_irqsave(fifo->lock, flags);
  65
  66        __kfifo_reset(fifo);
  67
  68        spin_unlock_irqrestore(fifo->lock, flags);
  69}
  70
  71/**
  72 * kfifo_put - puts some data into the FIFO
  73 * @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' into
  78 * the FIFO depending on the free space, and returns the number of
  79 * 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;
  86
  87        spin_lock_irqsave(fifo->lock, flags);
  88
  89        ret = __kfifo_put(fifo, buffer, len);
  90
  91        spin_unlock_irqrestore(fifo->lock, flags);
  92
  93        return ret;
  94}
  95
  96/**
  97 * kfifo_get - gets some data from the FIFO
  98 * @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 the
 103 * '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;
 110
 111        spin_lock_irqsave(fifo->lock, flags);
 112
 113        ret = __kfifo_get(fifo, buffer, len);
 114
 115        /*
 116         * optimization: if the FIFO is empty, set the indices to 0
 117         * so we don't wrap the next time
 118         */
 119        if (fifo->in == fifo->out)
 120                fifo->in = fifo->out = 0;
 121
 122        spin_unlock_irqrestore(fifo->lock, flags);
 123
 124        return ret;
 125}
 126
 127/**
 128 * __kfifo_len - returns the number of bytes available in the FIFO, no locking version
 129 * @fifo: the fifo to be used.
 130 */
 131static inline unsigned int __kfifo_len(struct kfifo *fifo)
 132{
 133        return fifo->in - fifo->out;
 134}
 135
 136/**
 137 * kfifo_len - returns the number of bytes available in the FIFO
 138 * @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;
 144
 145        spin_lock_irqsave(fifo->lock, flags);
 146
 147        ret = __kfifo_len(fifo);
 148
 149        spin_unlock_irqrestore(fifo->lock, flags);
 150
 151        return ret;
 152}
 153
 154#else
 155#warning "don't include kernel headers in userspace"
 156#endif /* __KERNEL__ */
 157#endif
 158

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

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

相关文章

Java高阶私房菜:JVM性能优化案例及讲解

目录 核心思想 优化思考方向 压测环境准备 堆大小配置调优 调优前 调优后 分析结论 垃圾收集器配置调优 调优前 调优后 分析结论 JVM性能优化是一项复杂且耗时的工作&#xff0c;该环节没办法一蹴而就&#xff0c;它需要耐心雕琢&#xff0c;逐步优化至理想状态。“…

【Gateway远程开发】0.5GB of free space is necessary to run the IDE.

【Gateway远程开发】0.5GB of free space is necessary to run the IDE. 报错 0.5GB of free space is necessary to run the IDE. Make sure that there’s enough space in following paths: /root/.cache/JetBrains /root/.config/JetBrains 原因 下面两个路径的空间不…

WPF之绑定验证(错误模板使用)

1&#xff0c;前言&#xff1a; 默认情况下&#xff0c;WPF XAML 中使用的绑定并未开启绑定验证&#xff0c;这样导致用户在UI上对绑定的属性进行赋值时即使因不符合规范内部已抛出异常&#xff08;此情况仅限WPF中的数据绑定操作&#xff09;&#xff0c;也被程序默认忽略&…

Linux设置脚本任意位置执行

记得备份 &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 修改文件之后记得用 source 文件名 刷新 注意&#xff1a;刷新文件之后在当前窗口…

02.zabbix配置web界面

zabbix配置web界面 访问搭建好的地址&#xff1a; http://192.168.111.66/zabbix 检查配置都是正常&#xff0c;下一步 对应的信息&#xff0c;我设置的密码是&#xff1a;123456&#xff0c;下一步即可&#xff1b; 给服务器随意设置一个名字&#xff0c;下一步 检查数据…

022、Python+fastapi,第一个Python项目走向第22步:ubuntu 24.04 docker 安装mysql8集群、redis集群(三)

这次来安装mysql8了&#xff0c;以前安装不是docker安装&#xff0c;这个我也是第一次&#xff0c;人人都有第一次嚒 前言 前面的redis安装还是花了点时间的&#xff0c;主要是网上教程&#xff0c;各有各的好&#xff0c;大家千万别取其长处&#xff0c;个人觉得这个环境影响…

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

stamps做sbas-insar,时序沉降图怎么画?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【计算机网络】计算机网络的定义和分类

一.定义 计算机网络并没有一个精确和统一的定义&#xff0c;在计算机网络发展的不同阶段&#xff0c;人们对计算机网络给出了不同的定义&#xff0c;这些定义反映了当时计算机网络技术的发展水平。 例如计算机网络早期的一个最简单定义&#xff1a;计算机网络是一些互连的、自…

短视频素材去哪里找免费?短视频素材从哪儿下载?

在这个数字内容为王的时代&#xff0c;视频已经成为沟通信息和吸引观众的强大工具。无论是在市场营销、教育还是娱乐领域&#xff0c;高质量的视频素材都是制作引人注目内容的关键。以下列出的网站提供多样的视频素材&#xff0c;帮助您增强视觉叙述&#xff0c;并在竞争激烈的…

查找算法与排序算法

查找算法 二分查找 (要求熟练) // C// 二分查找法&#xff08;递归实现&#xff09; int binarySearch(int *nums, int target, int left, int right) // left代表左边界&#xff0c;right代表右边界 {if (left > right) return -1; // 如果左边大于右边&#xff0c;那么…

Docker部署nginx并且实现https访问

实验环境&#xff1a; 在已有的docker环境和nginx镜像的基础上进行操作 1、生成私钥 &#xff08;1&#xff09;openssl genrsa -out key.pem 2048 生成证书签名请求 (CSR) 并自签证书: &#xff08;2&#xff09;openssl req -new -x509 -key key.pem -out cert.pem -day…

Vitis HLS 学习笔记--HLS流水线基本用法

目录 1. 简介 2. 示例 2.1 对内层循环打拍 2.2 对外层循环打拍 2.3 优化数组访问后打拍 3. 总结 1. 简介 本文介绍pipeline的基本用法。pipeline是一种用于提高硬件设计性能的技术。本文介绍了pipeline在累加计算函数中的应用。通过优化内外层循环和数组访问&#xff0c…

C#中.net8WebApi加密解密

尤其在公网之中&#xff0c;数据的安全及其的重要&#xff0c;除过我们使用jwt之外&#xff0c;还可以对传送的数据进行加密&#xff0c;就算别人使用抓包工具&#xff0c;抓到数据&#xff0c;一时半会儿也解密不了数据&#xff0c;当然&#xff0c;加密也影响了效率&#xff…

【Linux】awk命令学习

最近用的比较多&#xff0c;学习总结一下。 文档地址&#xff1a;https://www.gnu.org/software/gawk/manual/gawk.html 一、awk介绍二、语句结构1.条件控制语句1&#xff09;if2&#xff09;for3&#xff09;while4&#xff09;break&continue&next&exit 2.比较运…

线性数据结构-手写链表-LinkList

为什么需要手写实现数据结构&#xff1f; 其实技术的本身就是基础的积累和搭建的过程&#xff0c;基础扎实 地基平稳 万丈高楼才会久战不衰&#xff0c;做技术能一通百&#xff0c;百通千就不怕有再难得技术了。 一&#xff1a;链表的分类 主要有单向&#xff0c;双向和循环链表…

陈随易:论技术思维和产品思维

大家好&#xff0c;我是不被定义的前端之虎陈随易。 我的个人网站是&#xff1a;https://chensuiyi.me&#xff0c;欢迎大家眼熟我。 写这篇文章呢&#xff0c;源于一次群聊。 群友有一个产品&#xff0c;其中涉及到免费用户和付费用户对 pdf 的查看权限问题&#xff0c;使用…

EPAI手绘建模APP颜色、贴图、材质、样式

⑦ 颜色选择页面 1) 颜色环选色。 图 65 颜色选择器-颜色环 2) RGB选色。 图 66 颜色选择器-RGB 3) HSL选色。 图 67 颜色选择器-HSL 4) 国风颜色库选色。 图 68 颜色选择器-国风 5) CSS颜色库选色。 图 69 颜色选择器-CSS 6) 历史颜色&#xff1a;保存最近使用的多个颜色&…

鸿蒙开发仿咸鱼TabBar

鸿蒙开发自定义TabBar&#xff0c;实现tabBar 上中间按钮凸起效果 第一步、定义数据模型 export default class TabItemData{defaultIcon: ResourceselectedIcon: Resourcetitle: stringisMiddle: booleanconstructor(defaultIcon:Resource, selectedIcon:Resource, title:st…

基于改进暗原色先验和颜色校正的水下图像增强,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…