linux内核
文章平均质量分 84
温暖的电波
这个作者很懒,什么都没留下…
展开
-
ebpf中的percpu map的注意事项与剖析
ebpf percpu map原创 2023-01-10 22:43:40 · 912 阅读 · 0 评论 -
Linux中的调度参数之sysctl_sched_wakeup_granularity
Linux-5.4为防止唤醒抢占特性使能的情况下出现频繁的切换导致系统产生在任务切换上产生大量开销, 内核引入sysctl_sched_wakeup_granularity参数。该参数的作用是在唤醒新任务时,只有在当前任务curr的虚拟时间比被唤醒任务p的虚拟时间多于sysctl_sched_wakeup_granularity参数的加权平均值时才会考虑让新唤醒任务p抢占当前任务curr。该参数的值在linux-5.4中默认值为1000000UL,单位为nanoseconds。【1】wakeup_g原创 2021-06-29 23:04:02 · 885 阅读 · 0 评论 -
Linux中的调度参数之公平调度中的轮转周期与时间片
基于Linux-5.4当前的Linux中有公平调度、实时(rt)调度、deadline调度等等调度算法;其中公平调度是目前最主要的调度算法之一。公平调度,顾名思义就是要保证公平性,要照顾到所有任务都能够有机会得到CPU调度资源。Linux中有几个参数和"公平性"息息相关。sysctl_sched_min_granularity:公平调度中一个轮转周期内每个任务可运行的最小时间粒度(最小时间片),这样可避免任务运行时间太短导致优先级低的任务受到不公平待遇以及避免任务切换太过频繁的情况。 期默认原创 2021-06-29 22:57:59 · 1154 阅读 · 0 评论 -
Linux中的current与rq->curr浅析
基于linux-5.4背景在内核中检查当前运行任务时有时候会使用rq->curr,而其他时候内核又使用current来作为当前进程使用,究竟二者是什么关系,又什么区别呢? 带着好奇心我扒开内核代码简单进行了分析1 rq->curr浅析rq->curr表示的是rq这个就绪队列上当前正在运行任务的task_struct结构指针,它在调度函数__schedule()中进行更新。在主调度函数__schedule()中,内核先选好下一个将要运行的任务next,然后将任务next更原创 2021-06-23 21:18:24 · 1121 阅读 · 0 评论 -
进程内核态堆栈与用户态堆栈浅析
kernel:linux-4.9cpu: ARMV8背景在广袤的代码中堆栈无疑是一个高热度的技术用语,就linux而言你能常观察到的几个场景有:用户态堆栈函数func_foo中用堆栈来保存寄存器、局部变量等等:原创 2021-06-20 15:30:07 · 2572 阅读 · 3 评论 -
aarch64异常(二)el0_irq
内核版本:linux-4.9.217el0_irq: kernel_entry 0el0_irq_naked: enable_dbg#ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off#endif ct_user_exit#ifdef CONFIG_HARDEN_...原创 2020-05-03 21:45:36 · 1982 阅读 · 2 评论 -
xenomai系统中timer校准简要分析
一、背景Xenomai为了提升系统的响应速度、减少响应延时在各个维度上都做了许多工作。其中为了减少定时器上的延时在定时器上实时了一个叫做gravity的校准,以尽可能的消除timer响应路径上的延时,确保定时器的响应时间更加接近用户的期望到期时间。二、gravity的默认值Xenomai初始化阶段会调用xnclock_init()函数来设置默认的gravity值,逻辑如下:s...原创 2020-06-01 14:26:18 · 1292 阅读 · 1 评论 -
如何为qemu制作Qcow2格式文件系统
一、 制作8G大小的raw镜像文件qemu-img create -f raw ./virt-disk 8G"上面的命名生成一个大小为8G的raw镜像virt-disk。二、将virt-disk于loop设备关联sudo losetup /dev/loop1 ./virt-disk三、对loop1进行分区sudo parted /dev/loop1"#这个步骤是交互...原创 2020-01-21 20:23:57 · 2702 阅读 · 1 评论 -
保留内存lowmem_reserve浅析
一、保留内存的用武之地 要了解内存区的保留内存,我们首先要知道这个保留内存用在何处。实际上它在内核水线计算时会用到,那内核是如何计算水线的呢?保留内存到底在水线计算起到什么作用呢?我们先来跟踪代码一探究竟。 为了方便说明,这里只针对UMA架构。UMA架构物理内存的分配最终由__alloc_pages_nodemask()函数实现。struct page * __alloc_...原创 2019-06-02 23:54:59 · 2400 阅读 · 0 评论 -
从一个问题看isolate出来的cpu的rt_rq的root_domain
现象描述: 在一个8核环境中,内核在启动时传入内核启动参数isolcpus=4,5,6,7 即将cpu4cpu5 cpu6 cpu7置为isolated核。系统启动后cpu4 cpu5 cpu6 cpu7通过cpu亲和性各自运行了一个死循环的实时任务,从top看出4,5,6,7这四个核的cpu利用率只能够跑到95%; 然而将内核启动参数改为isolcpus=3,4,5,6,...原创 2019-06-02 23:55:34 · 1842 阅读 · 0 评论 -
实时任务调度的组织框架
初步探索linux-4.4内核中实时任务调度的组织方式和调度方法原创 2017-02-18 16:34:50 · 1299 阅读 · 0 评论 -
cat /proc/$pid/smaps浅析(一)
引子 当我们执行cat /proc/pid/smaps读取某个进程对应的虚拟内存区间到信息显示给我们,整个过程究竟发生了什么呢? >>用户态open("/proc/pid/smaps")-->内核proc_pid_smaps_operations.open() >>用户态 read(fd) ...原创 2019-07-19 21:46:13 · 4596 阅读 · 0 评论 -
进程托孤
前言 我们知道,一个任务在消亡退出时通常会将子任务(后面用孤儿或者children表示)托付其他任务(后面用reaper表示)以便以后“收尸”,这个流程就是“托孤”。 托孤会为子任务寻找一个新的parent作为new reaper,那这个new reaper选谁呢?怎么选呢?会是传说中的1号进程么?这就是本文要去探索的问题。一、单身父亲的谢幕 作为一个单身父亲,没有...原创 2019-09-25 19:43:28 · 1161 阅读 · 5 评论 -
softlockup原理分析
一、概述 Softlockup主要用于检查cpu上的任务是否有无法被调度的情况发生。其原理就是在cpu上创建一个实时FIFO优先级为99的percpu内核线程(一般情况下可以认为是系统中优先级最高的任务),其名字为watchdog;此任务一般会由一个高精度定时器htimer定期唤醒,唤醒后watchdog线程会去执行“喂狗”操作(具体而言就是将当前的时间戳写到变量watchdog_tou...原创 2019-04-17 22:16:45 · 7551 阅读 · 0 评论 -
Docker容器使用/dev/mem与HOST端映射同一段物理内存
我们知道docker容器与HOST端有一定的隔离性,但同时也共享着一些资源,比如内存资源。今天我们就看一下Docker容器通过/dev/mem设备节点与HOST共享一段物理内存。 要达到这个目的需进行如下操作:1) 划分一段用于映射到/dev/mem设备文件的保留物理内存;2) 准备一段在容器和HOST端可运行的映射和读写物理内存的代码;3) 启动一个带有--privileged参数...原创 2018-03-02 20:48:32 · 3192 阅读 · 0 评论 -
减少 per-cpu kthreads引发的系统抖动
linux/Documentation/kernel-per-CPU-kthreads.txt 此文列出了linux内核中的per-cpu kthreads(每cpu内核线程)并介绍了一些控制它们引发系统抖动的方法。Non-per-CPU 内核线程不在本文讨论范围内,但如果想要减少non-per-CPU kthreads引发的抖动,可以尝试将它们绑定到一个特定的CPU上,让这个原创 2017-09-12 21:01:26 · 2278 阅读 · 0 评论 -
linux通过内核启动参数预留系统内存
内核启动 预留内存原创 2017-08-30 19:15:52 · 9462 阅读 · 0 评论 -
进程调度之--进程的组织
代码基于linux4.4.42在深入探讨进程调度之前,我们想一下如下几个问题:进程创建后组织在哪里?何时去挑选进程来运行?cpu挑选谁作为下一个运行的进程?归纳起来,就是WHERE,WHEN and WHO。一、WHRER要回答这个问题,我们先以公平调度为例来看看一些相关的数据结构:task_struct代表一个任务(进程/线程):task_struct原创 2017-06-09 20:23:02 · 1388 阅读 · 0 评论 -
cgroup中的cgroup_subsys[]数组解析
cgroup中的子系统数组cgroup_subsys[]的定义原创 2017-05-05 21:10:13 · 2194 阅读 · 0 评论 -
rt带宽限制浅析
讲述实时任务的带宽限制的原因、目的和原理。包括带宽限制的初始化、设置和解除。原创 2017-04-10 21:20:39 · 2651 阅读 · 0 评论 -
实时任务的创建与唤醒
主要讨论 实时任务在通过copy_process()初始化相关结构后如何挂载到对应的运行队列上,以有机会得到cpu的调度。原创 2017-02-16 21:07:37 · 1714 阅读 · 0 评论 -
内核模块--使用misc设备
Linux内核为开发人员提供了若干接口以允许用户态与内核态进行通信,包括设备文件,proc文件系统接口,sysfs文件系统接口等等。 这一篇主要通过一个misc设备为例子,讲述如何通过设备节点访问内核的某个数据结构信息--task_struct结构中的comm字段。 #include <linux/module.h>#include <linux/miscdevice....原创 2018-07-04 22:22:36 · 885 阅读 · 0 评论 -
通过简单工具定位ext4文件系统中的裸数据
一、工欲善其事必先利其器 我在系统上通过如下2条命令创建了一个ext4格式的“内存磁盘”mkfs.ext4 /dev/ram0mount /dev/ram0 /ram 接着拷贝一些文件到 /ram目录下,其中一个就是 /ram/uio/uio_begin.sh 首先通过 dumpe2fs /dev/ram0了解到文件系统的如下信息Blocks per group: ...原创 2019-02-03 21:25:20 · 845 阅读 · 2 评论 -
从MAP_SHARED谈RSS与PSS
近期遇到一个问题:统计一个进程使用的物理内存居然远远超过了系统总内存大小。咋一看这个现象被下了一跳,怎么会这样呢?后来慢慢分析,终于了解到其中的奥秘..... 我的 "进程占用物理内存统计" 是通过累加 /proc/pid/smaps中的Rss项来计算的。以往对Rss"Resident Set Size"的理解就是实际占用的内存,但是并没有真正去区分和Pss的区别。 随后我仔细观察...原创 2019-01-23 22:25:16 · 1493 阅读 · 0 评论 -
使用htimer定时计算一个任务的cpu利用率
有时候我们想关注某一个任务的cpu利用率,除了使用top还有什么其他方法可行呢? 实际上cpu利用率的原理就是特定时间内一个任务总的运行时间与时间的比值即可简单的认为是cpu利用率。 那么就有两个问题:1)就是任务在某个时间周期的运行时间;2) 周期性的计算cpu利用率。 第一个问题任务在某个时钟周期的运行时间可以通过当前时间任务总的运行时间p->se.sum_exec...原创 2018-12-24 00:47:59 · 1244 阅读 · 1 评论 -
htimer的使用与处理流程
1 注册hrtimer->function = xxx_timer_fn;hrtimer_start(hrtimer, ns_to_ktime(sample_period), HRTIMER_MODE_REL_PINNED);2 时钟中断void run_local_timers(void){ struct tvec_base *base = __thi...原创 2018-12-22 19:55:46 · 763 阅读 · 0 评论 -
实时调度负载均衡的一个实例
在一个双核系统中,运行着4个实时任务: rt0, rt1, rt2和rt3,它们的优先级分别为10,15,20和25。 其中rt2通过taskset亲和到cpu1上先睡眠,其他3个任务初始运行状态为:cpu0上运行着rt0和rt1,且rt1一直抢占着rt0; rt3运行在cpu1上死循环。 如果此时唤醒rt2会发生什么? 由于rt3一直在cpu1上处于运行状态,r...原创 2018-09-11 22:13:10 · 705 阅读 · 0 评论 -
CFS带宽控制浅析
摘要 什么是带宽控制?简单来讲就是控制一个任务组在给定周期时间内可消耗的CPU时间,如果在周期内消耗的CPU时间超额,则限制这个任务组内的任务调度,直到下一个周期。 本文要讨论的CFS带宽控制,它是专门针对CFS调度策略而言的;相应的,对于RT调度策略还有RT带宽控制。 原理 CFS带宽控制是基于公平调度任务组实现的,因而使用时需要打开CONFIG_FAIR_...原创 2018-09-04 21:29:25 · 3229 阅读 · 0 评论 -
linux中0号任务的创建以及堆栈初始化
0号任务是如何“构造”出来?0号任务长什么样子?内核初始堆栈是什么样的?原创 2017-02-14 21:53:39 · 1742 阅读 · 0 评论