自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

九天小哥的专栏

天道酬勤

  • 博客(176)
  • 资源 (2)
  • 收藏
  • 关注

原创 cpufreq子系统

cpufreq通过sysfs向用户态暴露接口,这些节点部分是为了展示内核的配置,部分节点是可以配置的,通过这些节点可以控制cpufreq的一些行为。cpufreq子系统的核心层,负责管理子系统中的policy、governor和driver组件,是三者的纽带,通过core层,实现了调频策略和调频机制的分离。调频策略,每个CPU都有一个调频策略,规定了该CPU的最大、最小可运行频率等信息。可以独立于core层实现,通过规定的接口和core层交互。

2024-01-06 14:07:05 1016

原创 Linux调度域与调度组

这篇笔记重点分析了内核调度域相关的数据结构以及内核用于构建调度域的代码实现,以此来加深对调度域的理解。调度域是调度器进行负载均衡的基础。

2023-11-21 23:55:22 306

原创 Linux CPU拓扑

CPU拓扑相关的概念见的介绍。这篇笔记重点关注内核部分的代码实现。CPU拓扑的管理是和体系结构相关的,这里我们以ARM64为例进行分析。

2023-11-16 23:43:15 400

原创 Linux组调度

RT任务组的优先级保存在任务组运行队列的rt_rq.highest.curr字段中。为了维护RT任务组的优先级,在调度实体入队和出队时需要进行优先级的更新,具体的函数为__enqueue_rt_entity()-->inc_rt_tasks()-->

2023-11-12 16:55:42 472

原创 Linux RT带宽控制

所谓。Deadline调度器、RT调度器、CFS调度器均支持这种能力。这篇笔记记录了RT调度器的带宽控制相关实现。RT调度器的带宽控制核心思想是:限制CPU运行队列上的任务在内占用的CPU时长不能超过,检测周期和限定时长正是RT调度器带宽控制的两个可配置参数。带宽控制可以在CPU级别(即CPU运行队列上)实现;支持组调度后,带宽控制还可以扩展到在分组级别(即任务组的运行队列上)。

2023-11-12 16:42:32 493

原创 linux任务优先级

这篇笔记记录了linux任务(指线程而非进程)优先级相关的概念,以及用户态可以用来操作这些优先级的系统调用。

2023-10-21 18:24:20 366 1

原创 GCC链接脚本语法

在操作系统之上编程时我们是不需要关注这部分内容的,因为按照ld默认的行为链接即可,然后所有的事情都交给作系统处理完成。但是在嵌入式开发过程中,特别是移植Bootloader和内核的时候,链接脚本就显得格外的重要了。因为这个时候程序的运行环境都是裸机环境,没有任何的内存管理功能,代码操作的是物理地址,所以就要求我们对程序二进制镜像在链接和运行时的内存布局进行理安排。下面介绍的链接脚本就是干这件事的。详细的链接脚本语法可以参考官方文档《Using as》。链接脚本格式首先,链接脚本就是文本文件。其中

2022-04-17 19:49:54 3208 3

原创 GCC内嵌汇编

这篇笔记录的内容来自GCC手册中关于内嵌汇编的说明。通过asm关键字,可以实现在C/C++代码中插入汇编代码,GCC提供了两种格式的内嵌汇编代码:1)基本asm汇编(无操作数);2)扩展asm汇编(有一个或多个操作数)。推荐使用扩展asm汇编,但也有些场景是必须使用基本asm汇编来完成。基本asm汇编基本asm汇编语法如下:asm [ volatile ] ( AssemblerInstructions )asm是GNU扩展的关键字,如果可以使用__asm__(对编译选项有要求),那么

2022-04-17 19:32:54 3088

原创 ARM的异常处理机制

目录异常种类异常中断向量表异常处理进入部分复位异常未定义指令异常SWI软件中断指令预取中止异常中断数据访问中止异常中断IRQ异常FIQ异常离开部分SWI软件中断未定义指令异常中断IRQ和FIR异常中断指令预取中止异常数据访问中止异常异常种类ARM共有如下7种异常模式:复位(RESET):当处理器复位引脚有效时,系统产生复位异常中断。复位异常中断通常在系统加电和系统复位时发生,直接跳转到复位中断向量处执行称为软复位。 未定义的指

2022-04-01 21:12:28 4593 1

原创 Generic Netlink机制

文章目录数据结构genl_familygenl_ops多播组: genl_multicast_groupGeneric Netlink框架Generic Netlink消息消息头部消息API消息的封装消息的解析消息的发送协议初始化family的管理family的注册&去注册family操作集的注册&去注册控制familyfamily查询命令: ctrl_getfamily()消息接收: genl_rcv()genl_rcv_msg()Generic Netlink组播多播组的注册&去

2022-03-27 13:11:55 1518

原创 Netlink协议族核心操作

文章目录数据结构传输控制块: netlink_sock套接字操作集: netlink_ops协议族地址: sockaddr_nl创建: netlink_create()__netlink_create()绑定: netlink_bind()netlink_autobind()netlink_insert()连接: netlink_connect()消息发送: netlink_sendmsg()单播发送: netlink_unicast()单播发送给内核: netlink_unicast_kernel()单播

2022-03-26 23:14:37 1830

原创 Netlink协议族

文章目录数据结构协议对象: netlink_table协议族初始化Netlink协议管理Netlink协议注册: netlink_kernel_create()Netlink消息消息头消息整体格式相关API消息payload格式相关API消息属性格式相关API内核其它消息API消息的构造消息的解析消息的发送消息属性相关API用户态消息宏这篇笔记记录了Netlink协议族的初始化,并对Netlink消息格式及对应的内核态API进行了详细解释。Netlink用户态编程麻烦的一点是用户态对Neltink消息的处

2022-03-26 23:13:57 2134

原创 Netlink组播机制

文章目录数据结构协议对象: netlink_table传输控制块: netlink_sock组播发送控制信息: netlink_broadcast_data协议注册时套接字绑定时netlink_realloc_groups()更新签约信息: netlink_update_subscriptions()更新监听信息: netlink_update_listeners()套接字连接时套接字发送时do_one_broadcast()小结数据结构下面仅罗列了和组播机制相关的数据结构及其字段。协议对象: net

2022-03-26 23:12:05 2777

原创 linux网络校验和计算API

文章目录校验和算法IP首部校验和计算APIip_compute_csum()ip_fast_csum()ip_send_check()ip_decrease_ttl()通用校验和计算APIskb_checksum()csum_fold()csum_partial系列csum_block_add/sub()csum_add/sub()skb_checksum_help()csum_tcpudp_magic()校验和算法发送方先把校验和字段置为0,然后对参与校验的数据每16bit进行二进制反码求和,然后将结

2021-12-18 14:06:37 1533

原创 套接字缓存区sk_buff

文章目录数据结构缓存区: sk_buffskb指针: sk_buff_data_t协议头指针缓存区队列: sk_buff_headskb共享信息: skb_shared_info片段: skb_frag_t数据组织格式关于数据长度skb的分配alloc_skb()dev_alloc_skb()skb的释放skb_release_all()skb_release_head_state()skb_release_data()数据预留和对齐skb_reserve()skb_push()skb_put()skb_p

2021-12-15 02:03:50 1880

原创 邻居子系统之代理功能

文章目录代理条件通用代理机制延时处理请求代理请求入队列: pneigh_enqueue()代理请求处理定时器: neigh_proxy_process()代理类型目的地址代理配置项: pneigh_entry目低地址代理配置项查询: pneigh_lookup()ARP代理arp_process()arp代理启用条件: arp_fwd_proxy()邻居子系统支持代理功能,即主机在收到一个目的地址查询不属于自己地址的ARP请求时,可以代替真正的主机做出响应,这就是邻居代理。代理条件当然,主机不能对任何

2021-11-29 22:17:00 1807 1

原创 邻居子系统之邻居项的回收

文章目录邻居项的销毁: neigh_destroy()垃圾回收同步清理异步清理邻居项的刷新L3地址变化: neigh_ifdown()L2地址变化: neigh_changeaddr()neigh_flush_dev()邻居项删除涉及邻居子系统的垃圾回收机制,所以这里单独分析其代码实现。邻居项删除主要有如下三个原因:邻居子系统感知到该邻居项不可达,将邻居项状态设置成了NUD_FAILED,这种邻居项会有异步垃圾回收机制回收;该邻居项关联的L2地址发生了变化,但是它L3地址不变,这种邻居项需要先进入

2021-11-29 22:15:33 533

原创 邻居子系统之Netlink接口

文章目录数据结构邻居项Netlink命令消息: ndmsg命令行添加邻居项: neigh_add()删除邻居项: neigh_delete()设置邻居协议参数: neightbl_set()在邻居子系统框架的系统初始化函数neigh_init()中,有看到其向RtNetlink注册了几个事件用于配置邻居项,这篇笔记分析下邻居项的配置过程。数据结构邻居项Netlink命令消息: ndmsgstruct ndmsg{ __u8 ndm_family; __u8 ndm_pad1; __u16

2021-11-29 22:13:15 848

原创 入口流量控制

文章目录handle_ing()入口数据包过滤: ing_filter()接收方向qdisc: ingress_qdiscingress_qdisc私有数据结构: ingress_qdisc_data入队: ingress_enqueue()在驱动将数据包递交给协议栈的最后一步netif_receive_skb()函数中,有这个宏CONFIG_NET_CLS_ACT控制的相关逻辑是入口流量控制。handle_ing()static inline struct sk_buff *handle_ing(s

2021-11-06 13:38:24 368

原创 u32过滤器

文章目录命令行说明示例数据结构match参数: tc_u32_key/tc_u32_sel命令行参数解析: u32_parse_opt()内核态实现数据结构tc_u_commonfilter对象: tc_u_hnodematch信息: tc_u_knodeu32 filter操作集: cls_u32_ops初始化: u32_init()获取filter对象/match对象: u32_get()修改参数: u32_change()分类: u32_classify()u32是最通用的一个数据包filter,它

2021-11-06 13:37:42 1452

原创 分类流控qdisc之htb

文章目录tc参数配置示例算法思想用户态实现数据结构htb全局配置参数: tc_htb_globhtb类配置参数: tc_htb_optqdisc配置参数解析: htb_parse_opt()class配置参数解析: htb_parse_copt()内核实现数据结构qdisc操作集私有数据: htb_schedhtb类结构: htb_classqdisc操作集: htb_qdisc_ops初始化: htb_init()qdisc类操作集: htb_class_opschange()回调: htb_change

2021-11-06 13:36:49 1730

原创 流量控制机制概述

文章目录数据结构qdiscqdisc句柄qdisc对象: Qdiscqdisc操作集: Qdisc_opsqdisc类操作集: Qdisc_class_ops注册qdisc: register_qdisc()classclass的IDclass哈希表: Qdisc_class_hashclass哈希表的分配和初始化: qdisc_class_hash_init()class公共信息: Qdisc_class_commonfilterfilter对象: tcf_protofilter操作集: tcf_prot

2021-11-06 13:32:56 1662

原创 设备接口层NetPoll机制

文章目录数据结构NetPoll对象: netpollNetPoll信息: netpoll_info模块初始化: netpoll_init()注册NetPoll对象: netpoll_setup()发送数据: netpoll_send_udp()netpoll_send_skb()延时发送任务: queue_process()接收数据netpoll_poll()poll_napi()netpoll_rx()__netpoll_rx()NetPoll是设备接口层基于NAPI模式提供的一种纯粹的轮询接收数据包机

2021-10-20 15:38:22 918

原创 设备接口层初始化

这篇笔记分析了设备接口层的初始化代码实现,其中有些数据结构的详细情况会在后续相关的笔记中进一步说明。

2021-10-14 17:45:18 262

原创 CAN核心RAW协议

文章目录数据结构sock对象raw_sockPF_CAN协议族地址: sockaddr_can初始化raw_sock初始化: raw_init()socket接口实现绑定: raw_bind()使能过滤器: raw_enable_allfilters()设置socket选项: raw_setsockopt()发送数据: raw_sendmsg()接收数据: raw_recvmsg()raw_rcv()数据结构sock对象raw_sockstruct can_frame { canid_t ca

2021-10-12 21:11:41 2153

原创 CAN核心初始化流程

文章目录初始化PF_CAN接口socket创建接口: can_create()协议注册: can_proto_register()初始化static __init int can_init(void){ printk(banner); // 创建接收者高速缓存 rcv_cache = kmem_cache_create("can_receiver", sizeof(struct receiver), 0, 0, NULL); if (!rcv_cache)

2021-10-12 16:40:47 1223

原创 CAN核心帧收发流程

文章目录数据结构CAN数据接收链表dev_rcv_listsCAN数据接收者receiver接收流程接收者列表维护CAN核心收到数据can_rcv()CAN核心分发接收数据: can_rcv_filter()发送流程数据结构CAN数据接收链表dev_rcv_listsCAN核心为每个CAN类型网络设备都关联一个该链表对象(表头为can_rx_dev_list),用于保存所有对该CAN网络设备数据感兴趣的接收者。enum { RX_ERR, RX_ALL, RX_FIL, RX_INV, RX_EFF

2021-10-11 20:40:27 1352

原创 libnl资料

开发指导:http://www.infradead.org/~tgr/libnl/doc/core.html#_introductionAPI手册:http://www.infradead.org/~tgr/libnl/doc/api/index.html

2021-07-03 00:11:21 202

原创 Python模块学习之unittest

文章目录概述测试用例测试夹具断言测试套件添加测试用例测试用例加载器测试执行者用例执行结果其它主题总结这篇笔记记录了Python内建模块unittest的知识点,所记录的内容均来自unittest的官方文档。概述unittest是Python标准库中的一个模块,使用它可以对Python代码进行单元测试,它支持如下特性:测试自动化;共享测试夹具(即测试用例的setUp()和tearDown()代码);将测试用例组织成集合;测试用例和测试报告框架之间相独立;为了支持上述特性,unittest实

2020-12-20 23:51:53 333 1

原创 ARM指令集之伪指令

文章目录

2020-12-20 14:10:29 1371 1

原创 ARM指令集之杂类指令

文章目录状态寄存器访问指令MRSMSR信号量操作指令SWP字交换指令SWPB字节交换指令异常中断产生指令SWI软中断指令BKPT断点中断指令这篇笔记记录了如下几类ARM指令:状态寄存器访问指令;信号量操作指令;异常中断产生指令;状态寄存器访问指令ARM提供了两条指令用于在状态寄存器和通用寄存器直接交换数据。MRS:Move Register <-- State,将状态寄存器的值传送到通用寄存器中;MSR:Move State <-- Register,将通用寄存器的值传送的

2020-12-19 23:50:58 646 2

原创 ARM指令集之批量Load/Store指令

2020-12-16 22:30:44 2442

原创 ARM指令集之Load/Store访存指令(二)

文章目录寻址方式LDRH(半字数据读取指令)STRH(半字数据写入指令)LDRSB(有符号字节数据读取指令)LDRSH(有符号半字数据读取指令)这篇笔记记录了第二类Load/Store指令,即操作数为16位半字和有符号字节数据的Load/Store指令。助记符说明LDRH半字数据读取指令STRH半字数据写入指令LDRSB有符号字节数据读取指令LDRSH有符号半字数据读取指令寻址方式这类指令拥有一致的寻址方式,具体介绍见这里。语法说明

2020-12-16 21:54:32 1146

原创 ARM指令集之Load/Store指令寻址方式(二)

文章目录

2020-12-16 21:31:36 571

原创 ARM指令集之Load/Store访存指令(一)

文章目录

2020-12-15 23:44:38 4103

原创 ARM指令集之Load/Store指令寻址方式(一)

文章目录语法格式寻址方式立即数偏移量寻址寄存器偏移量寻址寄存器移位偏移量寻址这篇笔记记录的是操作32位子类型和无符号字节数据的Load/Store指令所使用的寻址方式。所有类型的Load/Store指令的寻址方式都是由基址加偏移量组成的,基址用任意的通用寄存器指定,偏移量的指定方式有如下三种:立即数;寄存器;寄存器和一个移位常数;寻址方式的计算又有如下三种方式:偏移量方法;事先更新方法;事后更新方法;.注意:上述内容适用于所有类型的Load/Store指令。语法格式操作32位

2020-12-10 00:05:38 2223

原创 ARM指令集之乘法指令

文章目录

2020-12-06 23:55:46 2729

原创 ARM指令集之数据处理类指令

文章目录数据处理指令1. MOV传送指令2. MVN传送指令3. ADD加法指令4. ADC带进位加法指令5. SUB减法指令6. SBC带位减法指令7. RSB逆向减法指令8. RSC带位逆向减法指令数据处理指令常见的数据处理指令如下表所示,它们支持相同的寻址方式,详情可见笔记。助记符说明实现逻辑MOV数据传送Rd = Rn(Rn可能需要运算)MVN数据取反传送Rd = ~Rn(Rn可能需要运算)ADD加Rd = Rn + op2ADC带进位加

2020-11-26 00:08:31 864

原创 ARM指令集之数据处理指令寻址方式

文章目录数据处理指令寻址方式1. 立即数寻址2. 寄存器寻址3. 寄存器逻辑左移立即数寻址4. 寄存器逻辑左移寄存器寻址5. 寄存器逻辑右移立即数寻址6. 寄存器逻辑右移寄存器寻址7. 寄存器算数右移立即数寻址8. 寄存器算数右移寄存器寻址9. 寄存器循环右移立即数寻址10. 寄存器循环右移寄存器寻址11. 寄存器扩展循环右移寻址所谓的寻址方式,是指当一个指令中的操作数涉及内存访问时,那么指令已什么样的方式来确定内存的地址。ARM的寻址方式分好几类,这篇笔记记录了数据处理类指令的寻址方式。数据处理指令

2020-11-19 02:13:05 1262

原创 ARM指令集之跳转指令

文章目录跳转指令B指令和BL指令长跳转指令ARM中有两种程序跳转方式:跳转指令;向PC写入目标地址值;跳转指令通过跳转指令,可以实现从当前指令向前或者向后32MB的地址空间跳转(一般来讲也足够了,基本上没有需要使用汇编语言写超过32MB程序的场景),总共有4种跳转指令:B:跳转指令;BL:带返回的跳转指令;BLX:带返回和状态切换的跳转指令;BX:带状态切换的跳转指令;带X的指令中的状态切换指的ARM状态和Thumb状态的切换,我们不关注,所以这些指令暂不介绍。B指令和BL指令

2020-11-18 00:36:15 3529

实验代码: vcard.rar

和https://blog.csdn.net/fanxiaoyu321/article/details/102768690配合的源码

2019-10-27

linux内核完全剖析

力顶呀,非常好,耐着性子看完一定会功力大增

2013-04-21

空空如也

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

TA关注的人

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