Linux内核
文章平均质量分 89
weijitao
这个作者很懒,什么都没留下…
展开
-
core文件分析
刚开通博客,想写博客很久了,今天终于开通了。先把之前写的学习笔记贴上来吧。在程序运行出现segmentfault后,我们会通过gdb来调试core文件定位问题,下面我们来分析下core文件是什么?首先需要明确的一点就是core文件也是ELF格式的,ELF的格式如下: ELF文件参与程序的链接和运行,从链接的角度看有上面左边所示的Linking View,从程序运行的原创 2015-06-10 19:52:00 · 3698 阅读 · 1 评论 -
Mcelog笔记
最近测试过程中panic并报如下错误:Kernel panic - not syncing: Timeout synchronizing machine check over CPUs经查找Linux内核代码是与mce相关的错误导致的系统panic。 收集mce的log信息,需要安装mcelog工具。Mcelog能够记录和统计运行在x86架构下的Linux OS的一些machine ...原创 2018-03-18 22:04:23 · 9805 阅读 · 6 评论 -
调度器分析
Linux中有两种调度器,一个是主调度器,一个是周期性调度器。主调度器函数就是schedule函数,当进程打算睡眠或者其他原因放弃CPU时,就会直接调用此函数。周期性调度器就是schedule_tick函数,它在时钟中断中调用,以固定的频率运行。周期性调度器 内核会按照频率HZ自动调用schedule_tick函数。周期性调度器不负责进程的切换,只是更新调度相关的信息,...原创 2018-03-11 17:15:22 · 700 阅读 · 0 评论 -
sched_setscheduler分析
之前在chinaunix上看到有人问了下面这个问题:#define _GNU_SOURCE#include <sched.h>int main(){ int prio = 99; sched_setscheduler(0, SCHED_FIFO, (struct sched_param*)&prio); while(1); ...原创 2018-03-01 21:37:05 · 3904 阅读 · 0 评论 -
QEMU+GDB调试内核
用GDB来调试用户态程序是一个方便快捷的定位问题的方法,极大的缩短了调试程序和定位问题的时间。而对于内核或者驱动ko的调试或者我们想了解内核运行的某些过程,我们也可以借助于gdb工具。 GDB+QEMU的方式是一种比较常见的调试内核和驱动的方法,这里写的是我在安装和使用GDB+QEMU时碰到的一些问题的笔记总结。环境准备QEMU安装Qemu的安装比较简单,可以选择下载源码进行编译;也...原创 2018-03-07 22:25:45 · 10736 阅读 · 0 评论 -
wait_event_interruptible_timeout函数分析
在intel F10A进行DMA读写操作时,会首先调用queue_work函数将当前work压入工作队列中,然后调用wait_event_interruptible_timeout函数等待DMA读/写操作的完成,在调试的过程中偶尔会出现超时返回的情况。 下面结合Linux 3.9.6源码分析下wait_event_interruptible_timeout函数的实现,看看为什么会出现超时返回...原创 2018-02-13 16:08:37 · 4847 阅读 · 0 评论 -
RT throttling分析
Linux上调度策略为SCHED_FIFO的实时进程是根据优先级抢占运行的。当没有更高优先级的实时进程抢占,而此进程又由于bug等原因长时间运行,不调度其它进程,系统就会出现无响应。这里要分析的RT throttling就是针对此种情况的,它通过限制每个单位时间内分配给实时进程的CPU运行时间,来防止上述情况的出现。标准的设置是1s的时间内,实时进程的运行时间是950ms,其余原创 2016-11-26 22:25:19 · 11193 阅读 · 0 评论 -
Softlockup分析
在Linux环境机器上面进行测试的时候,经常会报softlockup的问题,而导致系统panic。Softlockup是内核中进行死锁检查的一种机制,在2.6.X内核中是在softlockup.c的文件中实现,在新的3.X内核中是在watchdog.c文件中实现的。Softlockup是用来检测内核长时间不发生调度的情况,它的工作原理是在内核中启动一个优先级为MAX_RT_PRIO原创 2016-11-08 20:35:32 · 6828 阅读 · 0 评论 -
中断下半部分析之软中断softirq
中断下半部分为三种:软中断、tasklet和工作队列。软中断softirq软中断softirq是用于不紧急的延期操作,是tasklet的基础。网卡接收数据的过程中,首先网卡发起中断告诉cpu取数据,然后内核从网卡读取数据存入缓存中,再由内核解析数据并将数据送到应用层。上面的整个过程如果都由中断处理程序来处理,耗时太长,会丢失新来的中断。因此解析数据这些不紧急的部分就放到软中断中执行原创 2015-06-13 13:10:03 · 1689 阅读 · 0 评论 -
edge中断分析
目前正在调试msix中断,在测试过程中发现会概率性的丢失中断。Msix中断默认是edge触发的中断,edge触发的中断是在中断对应pin发生电平信号跳变的时候,会发出一个中断请求。因为跳变是一瞬间的,不会像level触发中断那样一直保持电平不变,这样就可能会漏掉某一个跳变的瞬间,表现就是丢失了一个中断。 内核中处理edge触发中断的函数为handle_edge_irq,此函数有do_IRQ原创 2015-07-19 10:57:01 · 3085 阅读 · 0 评论 -
调度时机分析之被动调度(之内核态抢占调度)
之前写的两个博客中讲了调度时机的用户态抢占调度部分,分别讲了系统调用返回和中断处理返回这两个点的用户态抢占的一些情况。这篇博客会写内核抢占调度的部分。-------------------------------------------------------------------------------------------------------------------------原创 2015-08-05 22:25:59 · 1631 阅读 · 0 评论 -
调度时机分析之被动调度(之中断处理返回)
之前一篇博客中是关于被动调度的系统调用返回部分,这篇博客将接着写被动调度的中断返回部分。 分析基于内核版本2.6.12.6Linux进程的调度主要分为主动调度和被动调度两大类。整个linux运行过程中,被动调度分为用户态抢占调度和内核态抢占调度。用户态抢占调度发生在当系统调用、中断处理、异常处理等返回用户态时,或者进程的时间片用完时。这篇博客就是写用户态抢占调度的中断处理返原创 2015-07-16 22:26:24 · 3638 阅读 · 0 评论 -
上下文切换
进程调度是linux系统中再常见不过的事情,对于进程的调度,这里不管什么调度策略什么的,直接来看看进程的切换做了些什么事情。这里从内核的上下文切换函数context_switch开始分析。static inline task_t * context_switch(runqueue_t * rq, task_t *prev, task_t *next) {原创 2015-06-11 21:01:16 · 1523 阅读 · 0 评论 -
调度时机分析之被动调度(之系统调用返回)
分析基于内核版本2.6.12.6 在什么情况下,会触发调度?Linux进程的调度主要分为主动调度和被动调度两大类。◆主动调度主动调度就是进程自己缺少相应的所申请的资源,显示调用schedule,让出处理器。◆被动调度在整个linux运行过程中,被动调度又可细分为两种:●用户态抢占调度●内核态抢占调度 下面就结合内核代码分析上述各种调度时机的详细情况。原创 2015-07-13 20:07:04 · 4740 阅读 · 0 评论 -
中断类型标志
在调用request_irq函数申请一个IRQ时,会传入相应的中断类型标志。对于这些标志新旧版本的内核实现是不完全相同的。 IRQF_DISABLED3.16.7-ct7版本内核中此标志是没有地方用到的。此标志表示中断在处理的时候是关中断的,不能被另外的中断所打断。(http://lwn.net/Articles/380931/)这篇文章里有讲到此标志在新内核中被废弃的原因。之前老原创 2015-07-02 22:16:10 · 2607 阅读 · 0 评论 -
中断下半部分析之Tasklet
上一个博客写了中断下半部的软中断softirq部分的一些学习笔记,这批博客接着写tasklet微任务部分。仅仅是平时看代码中的一些笔记,记下了怕忘了。Tasklet是中断下半部的一种,它工作在中断上下文。同一个tasklet对象同一时刻只能在一个cpu上运行。Tasklet的数据结构为struct tasklet_struct {原创 2015-06-13 16:05:37 · 834 阅读 · 0 评论 -
msix中断分析
此文档是基于linux-3.6.10内核代码对msix中断相关进行分析。PCIe设备可以使用msix报文向处理器提交中断,下面首先看下PCIe设备中的MSXI Capability结构。此结构在PCIe设备配置空间偏移0x68的位置处。字段含义Capability IDCapability结构的ID号Next Cap Ptr下一个Capability结构的位置Message Control当前PC...原创 2015-06-19 23:18:01 · 15409 阅读 · 0 评论 -
中断初始化
下面的分析是基于3.6.10内核版本。中断描述符硬中断产生之后通过门描述符来寻找中断处理程序的入口。中断描述符表的每个表项由8字节组成,叫做一个门描述符。主要包括三种门描述符:陷阱门、中断门和系统门。这里看下中断门描述符的结构:中断门描述主要包括中断如理程序所在的段选择符和段内偏移及一些标志位。低4字节的bit16~bit31为段选择符,bit0~15为段内偏移量的低16位,高原创 2015-06-22 15:05:49 · 4346 阅读 · 0 评论 -
通过pid查找进程task_struct结构体
如何通过进程id查找进程的描述符task_struct?在实际的工作中,我的驱动中需要通过读取写进内存中的进程id值查找对应的进程是否还在运行,或者是已经退出。通过阅读内核代码,内核中已有相应的API函数来供我们使用。下面是我在使用过程中的一些笔记总结。 linux系统上运行的进程可能成百上千的,或者更多,如何能够快速的通过pid值反向的查找task_struct,内核的方法是通过H...原创 2018-04-12 20:23:58 · 6184 阅读 · 0 评论