千家信息网

内核对象初始化链表组织方式是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"内核对象初始化链表组织方式是什么",在日常操作中,相信很多人在内核对象初始化链表组织方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"内核对象初
千家信息网最后更新 2026年11月02日内核对象初始化链表组织方式是什么

这篇文章主要介绍"内核对象初始化链表组织方式是什么",在日常操作中,相信很多人在内核对象初始化链表组织方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"内核对象初始化链表组织方式是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

背景

  • 最近在看RT-Thread内核的源码,内核对象使用链表组织。

  • RT-Thread内部有完整的【双向链表】与【单向链表】的操作API与实际用例

  • 内核对象,内核派生的如线程、定时器、设备等,都是由链表链起来管理的。

链表介绍

/** * Double List structure */struct rt_list_node{    struct rt_list_node *next;                          /**< point to next node. */    struct rt_list_node *prev;                          /**< point to prev node. */};typedef struct rt_list_node rt_list_t;                  /**< Type for lists. */
  • 链表是一种数据结构,跟其他的结构体类似,初始化后,本身占用内存空间,自身有内存地址。

  • 一般双向链表,内部的成员,是链表本身结构体的指针,注意,指针的指向,初始化后,并没有确定。

  • RT-Thread 的双向链表,初始化时,内部的指针,指向自己本身的地址,也就是给链表的成员,赋好了初值(指针内容,一般是地址)。

  • 链表使用,节点一般都是【全局结构体变量】,全局静态初始化,或动态内存申请(全局)。

  • 不用全局的链表节点,注意不要链入链表结构,否则节点地址因为【生命周期】结束内存释放了,地址就不对了,就无法管理各个链表的节点了。

双向链表API

  • 这里注要提一下链表节点的插入【次序】,因为遇到了一点小困惑,所以深入的研究了下。

  • 理解:【最新节点】【前一个节点】【最早节点】

  • 链表的头的问题:内核对象使用【对象容器】,全局的,对象初始化后,用了 rt_list_insert_after

/* 来自:object.c :rt_object_init */        /* insert object into information object list */        rt_list_insert_after(&(information->object_list), &(object->list));
  • 注意,rt_list_insert_after,插入的位置,【不是链表的尾部插入,是第一个链表节点【第一个参数】的后面。】

  • 也就是说,如果创建了3个内核对象,默认的排序如下:

不是:【容器head】 --- [obj1] --- [obj2] --- [obj2] 而是:【容器head】 --- [obj3] --- [obj2] --- [obj1]
  • 如果把链表插入到【尾部】后面,就要先把链表指针移到尾部,再执行:rt_list_insert_after.

查看内核对象

  • 其实,thread,device等对象,都是内核对象【派生】出来的。

  • RT-Thread 提供list_thread、list_device等,查看内核的对象。

  • 查看线程初始化【次序】,看看最后打印的线程,就是【最先】首个创建的线程。

  • 一般从链表【头部】开始遍历各个链表节点。如下:最后一个节点是:main线程.

  • 其实,main线程,是第一个创建的。

msh />list_threadthread   pri  status      sp     stack size max used left tick  error-------- ---  ------- ---------- ----------  ------  ---------- ---persim    16  suspend 0x000001ec 0x0000c000    08%   0x00000003 000sens      28  suspend 0x000000d8 0x00001000    13%   0x00000019 000hws       28  suspend 0x000000d8 0x00000800    10%   0x00000032 000dcm_tpo   10  suspend 0x00000090 0x00000800    14%   0x00000004 000dcm_tpo   10  suspend 0x00000090 0x00000800    14%   0x00000002 000dcm_tpo   10  suspend 0x00000090 0x00000800    15%   0x00000004 000tshell    20  running 0x000001fc 0x00001000    26%   0x0000000a 000touch     16  suspend 0x00000098 0x00000800    18%   0x00000013 000usbd       8  suspend 0x000000ac 0x00001000    04%   0x00000014 000at_clnt    9  suspend 0x000000c0 0x00000600    12%   0x00000002 000ulog_asy  30  suspend 0x00000084 0x00000c00    09%   0x00000006 000mmcsd_de  22  suspend 0x000000a0 0x00000400    48%   0x00000014 000alarmsvc  10  suspend 0x000000a8 0x00000800    27%   0x00000003 000rils      12  suspend 0x000000b0 0x00000800    08%   0x0000001e 000tidle0    31  ready   0x00000058 0x00000800    04%   0x0000001d 000timer      4  suspend 0x00000074 0x00000800    08%   0x00000009 000main      10  suspend 0x00000120 0x00000800    41%   0x00000012 000  /* 最先创建的线程,最后打印 */
  • 内核对象初始化的链表【次序】:

到此,关于"内核对象初始化链表组织方式是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

对象 内核 节点 线程 全局 地址 指针 结构 方式 内存 双向 学习 容器 尾部 次序 也就是 成员 指向 更多 最先 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 广州淘业互联网络科技 西安互联网科技 善班互联网科技 互联网金融科技创新 壕鑫互联网络科技 科技互联网公司logo 睿民互联网科技 湖南洣水互联网科技有限公司扣款 哈尔滨新华互联网科技学院 昭通互联网科技选哪家 四川慕妮娅互联网科技有限公司 中和天地互联网科技有限公司 山东星卡互联网科技有限公司官网 卡尔迅互联网科技有限公司 福建互联网展示科技馆设计 中国互联网公司的科技投入 陕西彩京云互联网科技有限公司 保山浩联互联网科技有限公司 伍佰万互联网科技是干嘛的 圆梦互联网科技 美国互联网科技巨头监管 互联网科技公司发展 上海致骋互联网科技 美国互联网前沿科技 茂名市互联网科技产业园 贵州叶脉互联网科技有限公司所属行业 互联网公司黑科技创始人 梅州GM互联网络科技有限公司 好易买互联网科技
0