
linux内核
文章平均质量分 89
老王不让用
芝兰生于幽谷,不以无人而不芳; 君子修身立德,不为穷困而改节
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
linux并发机制Ⅲ---信号量机制分析
1概述信号量semaphore,是操作系统中一种常用的同步与互斥的机制; 信号量允许多个进程(计数值>1)同时进入临界区; 如果信号量的计数值为1,一次只允许一个进程进入临界区,这种信号量叫二值信号量; 信号量可能会引起进程睡眠,开销较大,适用于保护较长的临界区; 与读写自旋锁类似,linux内核也提供了读写信号量的机制;2信号量2.1 流程分析可以将信号量比喻成一个盒子,初始化时在盒子里放入N把钥匙,钥匙先到先得,当N把钥匙都被拿走完后,再来拿钥匙的人就需要等待了,只有等...转载 2022-05-19 15:13:57 · 725 阅读 · 0 评论 -
linux并发机制Ⅱ---mutex机制分析
目录1概述2optimistic spinning2.1 MCS锁2.2 osq流程分析2.2.1 osq_lock2.2.2 osq_unlock2.2.3osq_wait_next3mutex3.1 数据结构3.2 加锁流程分析3.2.1 fast-path3.2.2 mid-path3.2.3 slow-path3.3 释放锁流程分析1概述Mutex互斥锁是Linux内核中用于互斥操作的一种同步原语; 互斥锁是一种休眠锁,...转载 2022-05-18 17:44:46 · 1155 阅读 · 0 评论 -
linux并发机制Ⅰ--- spinlock/rwlock/seqlock原理剖析(基于ARM64)
目录1概述2spinlock原理分析2.1spin_lock/spin_unlock2.2spin_lock_irq/spin_lock_bh3rwlock读写锁4seqlock顺序锁1概述吹起并发机制研究的进攻号角了!作为第一篇文章,应该提纲挈领的介绍下并发。什么是并发,并发就是:你有两个儿子,同时抢一个玩具玩,你一巴掌打在你大儿子手上,小儿子拿到了玩具。并发是指多个执行流访问同一个资源,并发引起竞态。来张图吧:图中每一种颜色代表一种竞...转载 2022-05-18 11:21:58 · 1077 阅读 · 0 评论 -
linux进程调度器Ⅰ----名词解释
目录1概述2概念2.1 进程2.2 进程状态2.3 scheduler 调度器2.4 runqueue 运行队列2.5 task_group 任务分组3调度程序3.1 主动调度-schedule()3.2 周期调度 -schedule_tick()3.3 高精度时钟调度 -hrtick()3.4 进程唤醒时调度 -wake_up_process()1概述从这篇文章开始,将开始Linux调度器的系列研究了。本文也会从一些基础的概念及数...转载 2022-05-05 14:30:32 · 773 阅读 · 0 评论 -
linux进程调度器Ⅱ----CPU负载
目录1 概述2全局CPU平均负载2.1 基础概念2.2 流程2.3 计算方法3运行队列CPU负载4PELT4.1 PELT计算方法4.2 PELT计算调用1 概述CPU负载(cpu load)指的是某个时间点进程对系统产生的压力。来张图来类比下(参考Understanding Linux CPU Load)CPU的运行能力,就如大桥的通行能力,分别有满负荷,非满负荷,超负荷等状态,这几种状态对应不同的cpu load值; 单CPU满负荷运...转载 2022-05-05 14:09:05 · 563 阅读 · 0 评论 -
linux进程调度器Ⅲ----进程切换
目录1 概述2抢占2.1 用户抢占2.1.1 抢占触发点2.1.2 抢占执行点2.2 内核抢占2.2.1 抢占触发点2.2.2 抢占执行点2.3 preempt_count3上下文切换3.1__schedule()3.2context_switch()1 概述进程切换:内核将CPU上正在运行的进程挂起,选择下一个进程来运行。ARM架构中,CPU上一次只能运行一个任务,内核需要为任务分配运行时间来进行调度,以便同时能处理多个任务请求。如下...转载 2022-04-28 19:06:33 · 390 阅读 · 0 评论 -
linux进程调度Ⅳ----组调度及带宽控制
目录1概述2task_group2.1 调度关系2.2 权重(shares)3cfs_bandwidth3.1 数据结构3.2 流程分析3.2.1 初始化流程3.2.2 用户设置流程3.2.3throttle限流操作3.2.4 总结1概述组调度(task_group)是使用Linuxcgroup(control group)的cpu子系统来实现的,可以将进程进行分组,按组来分配CPU资源等。比如,看一个实际的例子:A和B两个用户使用同一...转载 2022-04-28 16:58:04 · 759 阅读 · 0 评论 -
linux进程调度Ⅴ----CFS调度器
目录1概述2数据结构2.1 调度类2.2 rq/cfs_rq/task_struct/task_group/sched_entity3流程分析3.1 runtime与vruntime3.2 CFS调度tick3.3 任务出队入队3.3 任务创建3.4 任务选择1概述Completely Fair Scheduler,完全公平调度器,用于Linux系统中普通进程的调度。 CFS采用了红黑树算法来管理所有的调度实体sched_entity,算法效率为...转载 2022-04-28 09:55:58 · 864 阅读 · 0 评论 -
linux进程调度Ⅵ----实时调度器
目录1概述2数据结构3流程分析3.1 运行时统计数据3.2 组调度3.3 带宽控制3.4 调度器函数分析3.4.1 pick_next_task_rt3.4.2 enqueue_task_rt/dequeue_task_rt1概述在Linux内核中,实时进程总是比普通进程的优先级要高,实时进程的调度是由Real Time Scheduler(RT调度器)来管理,而普通进程由CFS调度器来管理。实时进程支持的调度策略为:SCHED_FIFO和SCHED...转载 2022-04-27 20:41:11 · 1205 阅读 · 0 评论 -
linux 内核 高精度定时器(hrtimer)实现机制
目录1 hrtimer 概述2 相关数据结构2.1hrtimer2.2hrtimer_clock_base2.3hrtimer_cpu_base3 高精度定时器相关API3.1 高精度定时器层初始化hrtimers_init3.2 定时器初始化 hrtimer_init3.3 定时器移除remove_hrtimer3.4 定时器激活hrtimer_start_range_ns3.5 定时器的迁移switch_hrtimer_base3.6 查找...转载 2022-02-18 14:41:50 · 8938 阅读 · 1 评论 -
linux 内核 定时器(timer)实现机制
目录1 相关数据结构1.1timer_list1.2timer_base2 定时器工作过程2.1 桶编号计算2.2 通过定时器找到对应的timer_base结构体2.3 定时器的删除2.4 定时器的添加和修改2.5 定时器的迁移2.6 tick 到来的处理(时间轮)3 使用实例1 相关数据结构1.1timer_list定时器层是基于tick层(高精度定时器)之上的,是根据系统jiffies来触发的,精度相对比较低。利用定时器,我们可以设定...转载 2022-02-16 19:27:41 · 5545 阅读 · 0 评论 -
linux内核调试技术——进程上下文R状态死锁监测(LOCKUP_DETECTOR)
目录1 R转态死锁/死循环检测概述2 lockup detector机制分析3 示例演示3.1 首先确认启用内核配置3.2 然后确认内核调度策略配置3.3 编写演示程序4 总结1 R转态死锁/死循环检测概述前一篇博文介绍了内核监测D状态死锁的hung task机制,本文介绍另一种死锁状态的监测手段——R状态死锁监测。R状态死锁指的是某一任务一直处于TASK_RUNNING态且一直占用着CPU,从而导致其他进程得不到调度而饿死的情况。一般情况下,R状态死锁较可能是由于程序出转载 2022-02-14 17:25:31 · 1917 阅读 · 0 评论 -
linux内核调试技术——进程D状态死锁检测
目录1 TASK_UNINTERRUPTIBLE 状态概述2 hung task机制分析3 示例演示4 总结1 TASK_UNINTERRUPTIBLE 状态概述Linux的进程存在多种状态,如TASK_RUNNING的运行态、EXIT_DEAD的停止态和TASK_INTERRUPTIBLE的接收信号的等待状态等等(可在include/linux/sched.h中查看)。其中有一种状态等待为TASK_UNINTERRUPTIBLE,称为D状态,该种状态下进程不接收信号,只能通过wak转载 2022-02-11 19:15:33 · 2742 阅读 · 0 评论 -
linux generic netlink实现机制:通信实例
目录1 demo 概述2 创建内核Demo Genetlink2.1 定义Demo Genetlink3 内核注册Demo Genetlink3 应用层初始化Genetlink套接字4 用户空间和内核空间通信4.1 用户查询Demo Family ID4.2 向内核Demo Family发送消息4.3 内核Demo Family 回发消息4.4 应用层接收内核Demo Family回发消息1 demo 概述示例程序:demo_genetlink_kern.c(转载 2022-02-11 15:27:27 · 2127 阅读 · 0 评论 -
linux generic netlink实现机制:注册、创建
目录1Generic Netlink 概述2 Generic Netlink相关结构体2.1 Generic Netlink消息头结构:struct genlmsghdr2.2 Generic Netlink Family结构:struct genl_family(内核中完成注册)2.3 Generic Netlink Family命令处理结构:struct genl_ops(内核中完成注册)2.4 Generic Netlink Family内核接收消息结构:struct gen.转载 2022-02-11 14:30:29 · 2930 阅读 · 0 评论 -
linux netlink实现机制:通信
目录1 netlink 通信数据结构1.1 netlink 消息报头:structnlmsghdr1.2 socket 消息数据包结构:struct msghdr1.3 netlink消息处理宏2 应用层向内核发送netlink消息3内核向应用层发送netlink消息4 应用层接收内核netlink消息1 netlink 通信数据结构1.1 netlink 消息报头:structnlmsghdrstruct nlmsghdr { __u32 nlmsg_l...转载 2022-02-10 19:57:19 · 2755 阅读 · 0 评论 -
linux netlink实现机制:注册、创建
目录1 netlink 概述2 Netlink子系统初始化3 内核Netlink套接字3.1 内核netlink配置结构:struct netlink_kernel_cfg3.2 netlink属性头:struct nlattr3.3 netlink有效性策略:struct nla_policy3.4 netlink套接字结构:netlink_sock3.5 创建内核netlink套接字4 应用层 Netlink 套接字4.1 套接字地址数据结构 sockaddr_n转载 2022-02-10 19:09:03 · 2886 阅读 · 0 评论 -
Linux内核协议栈--ipsec收发包流程
1 ipsec收包解封流程流程路径:ip_rcv() --> ip_rcv_finish() --> ip_local_deliver() --> ip_local_deliver_finish()解封侧一定是ip报文的目的端,ip_rcv_finish中查到的路由肯定是本机路由(RTCF_LOCAL),调用 ip_local_deliver 处理。下面是贴的网上的一张图片。ip_local_deliver_finish中 根据上次协议类型,调用对应的处理函数。inet..转载 2022-01-27 15:57:40 · 4543 阅读 · 0 评论 -
XFRM -- ipsec协议的内核实现框架
目录1 Overview1.1 XFRM 实例1.2 Netlink 通道1.3 XFRM State1.3 XFRM Policy2 接收发送IPsec报文2.1 接收2.2 发送IPsec协议帮助IP层建立安全可信的数据包传输通道。当前已经有了如StrongSwan、OpenSwan等比较成熟的解决方案,而它们都使用了Linux内核中的XFRM框架进行报文接收发送。XFRM的正确读音是transform(转换), 这表示内核协议栈收到的IPsec报文需要经过转换才转载 2022-01-24 20:06:00 · 4234 阅读 · 0 评论 -
virtio-net 实现机制
virtio 前端驱动详解转载 2021-10-08 14:16:29 · 9278 阅读 · 4 评论 -
ixgbe网卡驱动Ⅰ----网卡初始化及收发数据概览
目录1 网卡中断逻辑2 操作系统网络初始化3 网卡初始化4 网卡硬中断处理流程5 软中断处理数据6 关于接收数据时 RPS1 网卡中断逻辑网卡接到数据后,触发中断,内核回调中断处理程序 ISR. 一般中断都会分成上半部和下半部 (bh), 上半部执行时间短,不允许程序休眠,并且此时中断处于禁止状态。下半部有多种实现,网卡使用软中断,由 ksoftirqd 处理,耗时较长。在石器时代,网卡中断只由一个 cpu 处理,但是在大数据高吐吞时,就会把某个核(一般是 cpu0) 拖转载 2021-06-02 10:34:22 · 1794 阅读 · 0 评论 -
ixgbe网卡驱动 Ⅳ----收发包流程详解
目录1 ixgbe_ring 结构2 ixgbe 的中断上下部2.1 ixgbe硬件中断入口 ixgbe_msix_clean_rings2.2 ixgbe硬件中断入口 ixgbe_intr3 ixgbe 的中断下部3.1所有收包软中断入口函数 net_rx_action3.2注册poll函数 ixgbe_poll3.2.1 收包队列处理函数ixgbe_clean_rx_irq3.2.2 发包队列处理函数ixgbe_clean_tx_irq1 ixgbe_r...转载 2021-06-01 19:59:18 · 4559 阅读 · 0 评论 -
ixgbe网卡驱动 Ⅲ----收发队列资源分配
目录1ixgbe_netdev_ops 类函数列表2 接口 ixgbe_open()2.1 发送环形队列描述符分配 ixgbe_setup_all_tx_resources2.2接收环形队列描述符分配 ixgbe_setup_all_rx_resources2.3 网卡配置ixgbe_configure()2.3.1 网卡接收队列配置ixgbe_configure_rx()2.3.2 网卡发送队列配置ixgbe_configure_tx()2.4 注册中断 ixgb...转载 2021-06-01 18:54:33 · 2045 阅读 · 0 评论 -
ixgbe网卡驱动Ⅱ---- 驱动注册
目录1 ixgbe 网卡注册驱动1.1 ixgbe_driver 类1.2ixgbe_driver 注册/注销2 ixgbe 的 PCI 注册驱动流程 pci_register_driver()3 ixgbe 网卡探测 ixgbe_probe()【核心】3.1 ixgbe_info 选取3.2 net_device/ixgbe_adapter分配3.3读取eeprom中的mac地址,写入hw->mac.perm_addr3.4ixgbe_init_in...转载 2021-06-01 16:40:01 · 2844 阅读 · 0 评论 -
linux 内核网络中 RPS/RFS 原理Ⅱ
目录1 RPS/RFS出现的原因2 多队列网卡3 RPS/RFS介绍4 RSS介绍5 网卡的 affinity 特性6 小结7 使用举例1 RPS/RFS出现的原因RPS/RFS功能是在 Linux- 2.6.35 中有google 的工程师提交的两个补丁,这两个补丁的出现主要是基于以下两点现实的考虑:这两个补丁的出现,是由于服务器的CPU越来越强劲,可以到达十几核、几十核,而网卡硬件队列则才4个、8个,这种发展的不匹配造成了CPU负载的不均衡。 上面的提到的是..转载 2021-05-28 20:43:00 · 2369 阅读 · 0 评论 -
linux 内核网络中 RPS/RFS 原理Ⅰ
目录1 自带 irqbalance 瓶颈2 RPS/RFS 数据结构以及更新函数2.1 CPU 负载表 rps_map2.1.1rps_map 解析函数(store_rps_map)2.2设备流表 rps_dev_flow_table2.2.1 设备流表初始化函数 store_rps_dev_flow_table_cnt2.3全局的数据流表(rps_sock_flow_table)2.3.1 全局流表更新函数 ( rps_record_sock_flow )3RP...转载 2021-05-28 19:59:17 · 1767 阅读 · 0 评论 -
linux 网络软中断 softirq 底层机制及并发优化
目录1 软中断2网络软中断定义3软中断调用(__napi_schedule)3.1 唤醒中断 ( __raise_softirq_irqoff )4触发软中断5 收发包软中断执行6并行优化6.1RSS/RPS/RFS/XPS6.1.1 RSS (Receive Side Scaling) (接收侧的缩放)6.1.2 RPS Receive Packet Steering (接收端包的控制)6.1.3 RFS Receive Flow Steeri...转载 2021-05-28 16:04:57 · 5285 阅读 · 0 评论 -
module_init 和 late_initcall 区别
在kernel\include\linux\init.h中有如下定义:#define pure_initcall(fn)__define_initcall("0",fn,1)#define core_initcall(fn)__define_initcall("1",fn,1)#define core_initcall_sync(fn)__define_initcall("1s",fn,1s)#define postcore_initcall(fn)__define_init...转载 2021-04-08 14:50:46 · 424 阅读 · 0 评论 -
linux 使用 DETECT_HUNG_TASK 选项来追踪内核D状态线程
问题描述和追踪方法在iMX6 SoloX开发板子上面运行Linux 4.9.11的时候发现了High IO问题,使用top命令可以看到IO Wait一直接近100%,同时可以看到6号内核线程kworker/u2:0一直处于D(不可中断)状态:top - 01:14:45 up 1:08, 4 users, load average: 3.27, 3.23, 3.15%Cpu(s): 0.7 us, 0.7 sy, 0.0 ni, 0.0 id, 98.4 wa, 0.0 hi,转载 2021-03-23 21:55:29 · 1048 阅读 · 0 评论 -
linux 系统进程冻结(freezing of task)
目录1 概述2 相关变量和接口3如何请求冻结一个进程try_to_freeze_tasks()【核心】3.1 发送冻结信号freeze_task()4 用户态进程冻结fake_signal_wake_up()4.1 signal_wake_up() /signal_wake_up_state()4.1.1 发送 cpu 中断kick_process()5 内核线程冻结5.1 执行休眠动作 try_to_freeze()1 概述进程冻结是当系统hib...转载 2021-03-23 10:57:39 · 5313 阅读 · 0 评论 -
u-boot SPL的理解
uboot分为uboot-spl和uboot两个组成部分。SPL是Secondary Program Loader的简称,第二阶段程序加载器,这里所谓的第二阶段是相对于SOC中的BROM来说的,之前的文章已经有所介绍,SOC启动最先执行的是BROM中的固化程序。BROM会通过检测启动方式来加载第二阶段bootloader。uboot已经是一个bootloader了,那么为什么还多一个uboot spl呢?这个主要原因是对于一些SOC来说,它的内部SRAM可能会比较小,小到无法装载下一个完整的uboo转载 2021-02-20 15:36:21 · 1142 阅读 · 0 评论 -
linux网络报文接收发送浅析
linux网络报文接收流程netif_rx-->netif_rx_schedule-->net_rx_action-->process_backlog-->netif_receive_skb-->上层协议栈处理(ptype_base的HASH表中已注册.type与.func协议处理函数)linux网络报文发送流程上层发送协议栈组装需发送的报文有队列设备:fun_xmit-->dev_queue_xmit-->qdisc_run-->qdsi转载 2021-01-02 23:24:21 · 2945 阅读 · 1 评论 -
/proc/sysrq-trigger 机制浅析
目录1 系统请求开关2 常用方法3 说明文档 sysrq.txt(linux-2.6.38)1 系统请求开关怎么打开和关闭SysRq组合键 ?为了安全起见,默认SysRq组合键是关闭的。 打开这个功能,运行:echo 1 > /proc/sys/kernel/sysrq关闭这个功能:echo 0 > /proc/sys/kernel/sysrq如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1。重新启动以后,原创 2020-10-15 10:27:16 · 4539 阅读 · 0 评论 -
linux内核协议栈 套接口层之传输控制块同步锁socket_lock_t
linux内核中的struct sock结构是L3、L4和套接口层中的一个重要结构,代表了一个套接字,该结构在进程上下文和软中断上下文都会被使用,所以保证这些场景下该结构数据的一致性将非常重要,而且理解其锁机制对于理解代码也非常有意义。目录1 锁结构socket_lock_t2进程上下文的访问操作 lock_sock / release_sock2.1 lock_sock()2.2 release_sock()3 软中断上下文的访问操作4传输控制块引用计数5总结1...转载 2020-10-08 10:35:54 · 1385 阅读 · 0 评论 -
linux内核 自旋锁+中断 spin_lock_bh/spin_unlock_bh
spin_lock_bh通常用在进程中,用来禁止抢断和禁止软中断。spin_lock_bh()中首先会调用local_bh_disable()禁止当前CPU的软件中断。而函数spin_unlock_bh()则调用local_bh_enable()来势能本地CPU的软件中断。在软件中断被禁止的时候,本地CPU的所有软中断都不会被执行。如果一个softirq 与 用户上下文共享数据,就有两个问题:首先,当前的用户上下文可能被softirq中断;其次,临界区可能会在别的CPU进入。这时spin_lock_转载 2020-10-08 10:21:50 · 3847 阅读 · 0 评论 -
Linux内核 等待队列的几种用法
Linux内核里的等待队列机制在做驱动开发时用的非常多,多用来实现阻塞式访问,下面简单总结了等待队列的四种用法,希望对读者有所帮助。1. 睡眠等待某个条件发生(条件为假时睡眠):睡眠方式:wait_event, wait_event_interruptible唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要把条件变为真)2. 手工休眠方式一:1)建立并初始化一个等待队列项DEF...转载 2020-10-08 10:18:47 · 661 阅读 · 0 评论 -
linux内核协议栈 socket 创建流程
目录1、socket 概述2、socket 创建入口2.1、sys_socketcall2.2、sys_socket3、socket 创建过程3.1、sock_create(__sock_create)3.2、socket 节点分配以及初始化(sock_alloc)3.3、根据指定协议族继续初始化3.3.1、inet_create注册(inet_init)3.3.2、inet_create调用(核心)1、socket 概述为了建立Socket,程序可以调用So转载 2020-09-11 16:17:11 · 3137 阅读 · 0 评论 -
linux内核信号的处理过程
目录1、什么是信号2、进程对信号的响应操作3、注册信号处理函数4、Linux下信号处理机制4.1、进程如何发现和接受信号?4.2、信号检测和响应时机4.3、进入信号处理函数4.4、信号处理函数执行完后怎么办?1、什么是信号信号本质上是在软件层次上对中断机制的一种模拟,其主要有以下几种来源:程序错误:除零,非法内存访问…外部信号:终端Ctrl-C产生SGINT信号,定时器到期产生SIGALRM…显式请求:kill函数允许进程发送任何信号给其他进程或进程组。转载 2020-09-10 14:14:20 · 2239 阅读 · 2 评论 -
一次用户态进程死循环案例的分析
1、问题现象业务进程(用户态多线程程序)挂死,操作系统反应迟钝,系统日志没有任何异常。从进程的内核态堆栈看,看似所有线程都卡在了内核态的如下堆栈流程中:[root@vmc116 ~]# cat /proc/27007/task/11825/stack[] retint_careful+0x14/0x32[] 0xffffffffffffffff2、问题分析2.1、内核堆栈分析从内核堆栈看,所有进程都阻塞在 retint_careful上,这个是中断返回过程中的流程,代码(汇编)如下:转载 2020-09-11 19:15:42 · 894 阅读 · 0 评论 -
Linux 下系统调用过程以及方法
目录1、系统调用过程2、系统调用三种方法2.1、通过 glibc 提供的库函数2.2、使用 syscall 直接调用2.3、通过 int 指令陷入系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口。当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。1、系统调用过程以 Linux 0.11 为例简述调用过程,没有查证现代操作系统是否有所变化,不过基本思路应该差不多。如下转载 2020-09-09 18:44:30 · 5644 阅读 · 0 评论