自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 资源 (1)
  • 收藏
  • 关注

原创 文件系统预读机制的代码分析

(14)或者,还有一个分支,还可以进入函数blk_mq_delay_run_hw_queues,启动kblockd_workqueue,回调函数是blk_mq_run_work_fn,这个读取是在kworker的上下文中,是一个异步的IO过程,代码路径在本文后面介绍。(10)调用blk_mq_attempt_bio_merge合并bio,同时调用blk_mq_bio_to_request将bio转换为request,调用blk_add_rq_to_plug将request添加到tsk->plug中。

2024-04-23 16:06:28 807

原创 cpu masks的初始化

一开始以为是cpu_possible_mask或者cpu_present_mask有误,但根据dmidecode的源码分析后,看到这些信息是从内核的文件/sys/firmware/dmi/tables/smbios_entry_point中获取,dmidecode的过程如下,见dmidecode.c。还是从start_kernel开始,这个时候cpu0已经启动完成,内核创建了一个线程kernel_init,其余的cpu和在这个函数里进行初始化工作。cpu的信息包括socket都在dmicode信息中。

2024-03-11 17:04:08 917

原创 虚拟地址到物理地址的映射(二)

总结起来,一个变量的寻址过程就是,在编译或运行时被分配虚拟地址和物理内存,内核为该虚拟地址和物理内存的地址以该进程的PGD表为基础,建立映射关系,并将PGD的物理地址交给MMU,MMU根据映射关系通过虚拟地址找到物理地址,并按照程序的要求读写其中的内容。1)编译和链接filemap-addr:0x7fc3d3e4c000 内存映射文件虚拟地址g-addr:0x4c82f0 全局变量虚拟地址stack-addr:0x7ffe03a8ef1c 栈内变量虚拟地址。

2023-09-27 09:51:40 537

原创 虚拟地址到物理地址的映射(一)

从上面信息可以看出0x7fc3d3e4c000所对应的物理地址是0x28ba000,我们之前看到过a.out的pgd的物理地址是47de000,那么47de7f8中的0x7f8就是虚拟地址0x7fc3d3e4c000所对应的PUD的地址在PGD中的偏移量,也就是说47de000 + 7f8这个地址里面,存放着PUD页表的物理地址,从上述信息来看,PUD的物理地址为5f7c000,后面的0x67为该页面的页表属性。这样的话,在qemu虚拟机里,可以使用ctrl a + c进入qemu的控制台。

2023-09-27 08:57:26 355

原创 smp_init过程解析

smp启动过程分析

2023-03-10 15:36:12 984

原创 sigwaittest测试超标的调试过程

sigwaittest调试

2023-03-03 15:47:24 798

原创 objtrace代码调试

objtrace的调试过程

2022-11-03 11:50:45 445

原创 qemu+gdb调试内核

gdb+qemu调试内核

2022-10-21 15:40:08 1862 1

原创 libbpf-tools编译和使用步骤

libbpf-tools的编译和运行

2022-09-19 11:15:34 4599 2

原创 loongarch集成preempt rt后ltpstress死机的问题分析

loongarch集成preempt rt后ltpstress死机的问题分析

2022-07-05 09:01:31 647

原创 ftrace新功能 -- objtrace代码分析

ftrace新功能--objtrace

2022-06-14 15:05:18 587

原创 cyclicdeadline

cyclicdeadline rt-tests

2022-06-09 13:57:32 296

原创 deadline调度器

内核调度器-deadline

2022-06-09 13:55:06 1355

原创 ftrace中没有syscall信息问题的分析

1,ftrace中syscallevents的实现ftrace是内核的一个重要分析供给,在分析内核代码运行路径和时间问题上有着其他工具不可比拟的优势,比如对于系统调用,我们在分析cyclictest测试日志的时候,可以看到这样的信息:cyclicte-305307....09479.661181:sys_enter:NR115(1,1,ffffbbfae420,0,0,ffffbbfaecd0)//系统进入了nanosleep调用,信息包括时...

2022-02-24 12:04:29 865

原创 RTEval实时系统测评工具

RTEval是一个python应用程序,用于测试和分析实时系统的实时性,RTEval首先在待测试的目标系统上运行两个系统负载,分别为hackbench和解压缩并编译一份linux kernel的源码,与此同时,运行cyclictest对实时系统进行测试。当运行设定时间后,系统负载和cyclictest同时停止,RTEval输出cyclictest的测试结果,并对其进行分析,并将分析结果输出至一xml文件。RTEval的配置项在rteval.conf和Makefile中,比如duration,在mak

2021-11-24 11:10:55 1491

原创 trace rtsl的代码分析和使用

概念Cyclictest是目前测试实时系统最主要和最常用的工具,但cyclictest有其局限性,它只提供了测试得到延时的结果,但从调度路径的角度来看,从中断到高优先级任务的调度要分成如下几部分,中断响应,任务抢占,任务切换等,期间还有关中断,关抢占等操作干扰,cyclictest的测试结果是不能给出这些步骤具体的执行时间以便分析延时产生的原因的。所以,cyclictest被定义为一个黑盒测试。RTSL定义了系统调度路径中的如下参数:poid = Preemption or Interrup.

2021-11-23 13:57:04 325

原创 osnoise代码分析和rtla的使用

1,kernel -- osnoise内核5.14-rc1引入了一个新的tracer,从一个线程的角度讲系统的噪声全部罗列出来,供开发者分析系统状况,其中所述的噪声包括:nmi,irq,softirq以及thread。代码位置在kernel/trace/trace_osnoise.c.tracer osnoise工作原理如下:注册traceevent,包括thread_noise,softirq_noise,irq_noise,nmi_noise,sample_threshold (includ

2021-11-12 15:35:46 902

原创 preempt rt对pagefault的处理

在项目中我们发现了实时系统的pagefault开销比非实时要高,所以本文对pagefault做一下分析和对比。1,pagefault调用栈(以arm64为例,内核版本为4.19.90)el1_da(arch/arm64/kernel/entry.S)--arm64发生dataabort的异常处理入口 do_mem_abort inf=esr_to_fault_info(fault_info,异常向量表,见arch/arm64/mm/fault.c+...

2021-11-04 11:30:36 294

原创 /dev/mem mmap失败 -- 使用ftrace function_graph来查看代码运行路径

客户反应应用在打开/dev/mem,然后通过mmap来映射内存的时候,mmap会失效。还有一个信息就是该应用在4.4内核运行正常,在4.19内核运行失效我对/dev/mem这个设备代码不是很了解,最多也就是直到代码在/driver/char/mem.c, file operations里面mmap对应的函数是mmap_mem.我在4.19内核的mmap_mem加了printk,但很不幸,printk的打印并没有出现,说明没有运行mmap_mem函数。那么,从用户空间调用mmap到内核设备的mmap(

2021-06-23 10:35:55 1062

原创 集成preempt-rt patch后发生panic的调试过程

内核版本:4.19.90preempt rt patch: patch-4.19.90-rt35.patch1, 串口信息[ 13.479558][ 2] ---[ end trace 0000000000000003 ]---[ 13.479563][ 2] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000[ 13.479563][ 2] Mem abo...

2021-05-21 14:19:11 780

原创 sigwait延时较大的原因

使用cyclictest对sigwait做了分析,大体如下:命令:trace-cmd start -e all;./cyclictest -p 90 -m -c 0 -i 1000 -a 3 -b 300日志分析:1)正常的流程irq_handler_entry -- ktimersoftirq -- cyclictest2)本例在测试过程中,来了一个中断,irq_handler_entry: irq=39 name=nvme0q4然后进入了该中断的处理线程ir...

2021-03-09 19:56:20 456

原创 preempt_disable导致的cyclictest测试延时超标

1,内核:4.19.90 preempt rt 架构:arm642,测试步骤和结果1)cyclictest -p 90 -m -c 0 -i 1000 (v1.10)2)ltpstress.sh -p -n -t 48测试结果:cyclictest的最大延时超过10毫秒3,ftrace log1)方法trace-cmd start -e all;cyclictest -p 90 -m -c 0 -i 1000 -b 1000 --tracemarkltpstre...

2021-01-29 15:31:12 901 1

原创 rtc问题引起的内核驱动初始化的探究

1,问题描述4.19内核集成了preempt rt patch之后,使用timedatectl和hwclock -w出错,进一步发现系统没有/dev/rtc设备2,调试过程1)rtc-efi驱动模块的注册流程 (init/main.c)[ 3.297202][ 1] [<ffffffc0009d9e5c>] rtc_device_register+0x2fc/0x310[ 3.303545][ 1] [<ffffffc0009d9f3c>] devm_r...

2021-01-11 16:48:07 1075

原创 find latency sources -- 一次实时指标调试的过程

1,环境1)硬件: 联志通达开发板,rk3399处理器,arm64,六核2)内核:4.4.131 内核 + 4.4.131 preempt rt patch2,问题描述在使用cyclictest测试系统实时指标的过程中,偶然发现,插拔usb设备,比如u盘或者usb键鼠,会导致cyclictest max latency突然从原来的50us左右增加到200+us,甚至更多。3,调试过程1)初步分析,怀疑是xhci在中断处理时关掉了外部中断,从而导致了hrtimer中断的延时。但是,理论

2020-12-14 14:19:17 395

原创 一次oops的定位过程

一次oops的定位过程移植ipipe到4.19内核,启动的时候内核发生了panic,信息如下:[3.055412][0]UnabletohandlekernelNULLpointerdereferenceatvirtualaddress0000000000000000[3.064620][0]Memabortinfo:[3.067837][0]ESR=0x86000005[3.071314][0...

2020-11-09 16:08:50 2042

原创 内核启动过程中init进程和驱动初始化的时间关系

从start_kernel讲起。start_kernel会打印“Booting kernel”这样的log,这个是我们在内核启动过程中看到的最早的一些log.start_kernel会首先启动内核必要的元素:setup_arch(&command_line);page_alloc_init();mm_init();ftrace_init();rcu_init();early_irq_init(); init_IRQ();......都很重要,就不一一列举了...

2020-08-19 12:22:45 517

原创 eBPF初体验

eBPF(aka extended berkeley package filter)是最近比较热门的内核调试方法和工具。我个人目前还是更喜欢用trace-cmd+ftrace来调试内核的问题,但ebpf据说是可以更加灵活的设置调试信息。ebpf的原理是使用tracepoint静态监测点和kprobe动态监测点来对内核进行函数级别的监测,可以监测内核运行的代码流是否正确,更可以监控内核运行的效率。我在github上fork了一份bcc(https://github.com/iovisor/bcc)的代

2020-08-13 15:01:10 1586

原创 使用kretprobes来查找耗时长的中断处理函数

在实时系统中,如果top half时间过长,会导致实时任务得不到调度,产生比较高的延时。使用kretprobes可以查看中断处理的时间,代码如下(参考kretprobe_sample.c做了一些改动):/** kretprobe_example.c** Here's a sample kernel module showing the use of return probes to* report the return value and total time taken for pro...

2020-07-17 17:44:52 402

原创 提升实时系统实时指标的一个方法

isolcpus可以使选定的几个cpu核不参与负载均衡的调度,这样的话,我们可以在系统启动的时候,在cmdline中增加如下参数:isolcpus=4,5,6,7(假如我们想保留这四个cpu核的话)这样的话,系统通常的负载都会跑到系统其他的cpu核,我们保留了这四个核给实时任务。然后,我们可以使用cpu affinity来将实时任务亲和到保留的几个核的其中一个,比如:cyclictest -a 7 -- cyclictest使用pthread_setaffinity_np将实时任务亲和到指定

2020-07-17 17:34:55 492

原创 移植xenomai到树莓派4B

内核版本:4.19.122Xenomai版本:3.1IPIPE版本:ipipe-core-4.19.115-arm64-6.patch步骤:1,git clone https://github.com/raspberrypi/linux.git (最好加上--depth=1,否则时间会很长)2,打ipipe patch patch -p1 < ../ipipe-core-4.19.115-arm64-6.patch 会有几个小冲突,但比较容易解决,至少比之...

2020-06-04 19:37:45 4114 3

原创 使用ftrace定位xenomai实时内核中断延时的一个实例

1,背景1)硬件:飞腾ft2000ahk,双核,1.8G2)软件:内核:4.14.4桌面:银河麒麟sp2 实时方案:Xenomai 3.13)描述:麒麟内核4.14.4版本加xenomai的实时方案,硬件环境为飞腾ft2000ahk处理器开发板,测试标准是在空载情况下,cyclictest的延时小于50us。2,问题描述运行cyclictest -p...

2020-02-17 17:09:38 2001

原创 搭建实时linux环境的方法和步骤(四)--三种方式的比较

最后,讲前述几种实时内核的方式进行一下比较:方案id 方案名称 方案简介 方案优势 备注 1 实时补丁(preempt rt) kernel+ingo molnar patch(preempt_rt)方式,主要修改包括中断线程化, Spinlock可休眠,以及优先级继承 1,操作简便,主线kernel加对应版本的patch即可 (打开C...

2019-08-22 15:28:38 311

原创 搭建实时linux环境的方法和步骤(三)-- xenomai mercury(signal kernel)

xenomai mercury模式是基于宏内核的,所以需要先编译preempt rt patch的内核,请参考:https://blog.csdn.net/chensong_2000/article/details/100014255在mercury方式,不需要给内核打ipipe patch,所以直接进入xenomai的目录进行配置和编译:./configure --with-core=m...

2019-08-22 15:22:22 726

原创 搭建实时linux环境的方法和步骤(二)-- xenomai cobalt(dual kernel)

搭建xenomai的步骤比preempt rt patch要复杂一些,本节介绍xenomai的cobalt模式,既宏微内核。1,分别下载linux-4.4.43ipipe-core-4.4.43-x86-6.patchxenomai-3.0.32,给kernel打ipipe相关的patchcd linux-4.4.43patch:./xenomai-3.0.3/script...

2019-08-22 15:17:31 1524

原创 搭建实时linux环境的方法和步骤(-)-- preempt patch

最近公司开始了实时linux的项目,我开始做了一些前期的调研。实时linux通常有两种方案,一个是preempt rt的patch,patch的主要内容是中断线程化,优先级继承以及spinlock的mutex化。还有一种方案是宏微内核,目前在国内做的比较好的公司是RT-THREAD。我们采用了开源的xenomai方案,xenomai是一种开源的方案,提供两种模式,一种是dual kerne...

2019-08-22 14:40:51 1255

原创 简单的cgroup小实验

做了两个简单的关于cgroup的实验,记录一下步骤:1,ubuntu下安装cgroup-binsudo apt-get install cgroup-bin安装以后并没有出现网上教程讲的两个配置文件,/etc/cgconfig.conf和/etc/cgrules.conf,但在/sys/fs里已经出现了cgroup的目录。2,cpu1)进入cd /sys/fs/cgro

2017-05-27 16:58:44 660

原创 to be a janitor(3)

出差几天,回来继续搭建qemu环境。qemu主要是比较方便的仿真x86和arm的环境,调试起来比其他方式要便捷。1,x86的虚拟机安装1),安装qemu我参考了一些资料,有使用apt-get install, 也有自己下载代码后安装的,我都做了。 加载x86的kernel时,我直接使用了apt安装的。2),编译kernelmake mrpropercop

2017-05-18 15:11:39 263

原创 to be a janitor(2)

kernel hacking的准备工作还是比较复杂的,特别是对于像我这种windows guy,手笨,命令参数快捷键也记不住的人。所以,还是要仔细阅读下面的链接,按照步骤一步一步的做一遍https://kernelnewbies.org/FirstKernelPatchhttps://kernelnewbies.org/OutreachyfirstpatchSetup?action=s

2017-05-12 10:34:44 350

原创 To be a janitor

最近准备开始在业余时间做一些linux kernel的开发工作。kernel是一个很庞大的系统,而且在社区的开发需要与其他人协同工作,工作方式要符合社区的流程。社区有提供了https://kernelnewbies.org/,为准备开始hacking的工程师提供了详细的指导,新手可以参阅。作为一个做开发工作的新手,首先应该打开左侧的链接https://kernelnewbies.org

2017-05-09 08:00:20 350

原创 lep开发笔记 -- 内存泄漏

运行lepd的时候,发现在运行PS命令之后,lepd会有将近1M的内存泄漏。内存泄漏使用mtrace来调试,需要如下几步:1,在编译选项cflag加上-g2,需要调试的代码中加入如下两行,我在ps_main中加入setenv("MALLOC_TRACE", "output", 1); mtrace(); 3,编译,运行4,运行结束以后,在console中运行如下

2016-12-08 16:17:34 406

rgba8888转yuvsp420

RGBA8888转换为YUV NV21格式的几种算法

2013-10-28

空空如也

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

TA关注的人

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