简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
作为一名初级的嵌入式底层开发人员,若想要深入学习Linux内核,需要谨慎地选择开发环境和开发工具。与应用层开发不同的是,Linux内核的学习和开发调试通常是比较困难的,原因之一在于可用的Linux内核调试工具比较少。很久以前笔者注意到安卓工程中使用到了QEMU虚拟机模拟了安卓硬件设备,可以完整地运行安卓系统(从物理按键和显示、触摸屏,到Linux内核,直至Framework层)。还有QEM...
本文探究在AArch64平台,Linux内核任务切换的实现机制。使用的调试工具主要为gdb及qemu虚拟机,调试的内核版本为5.3.12。笔者在实际工作中遇到一些互斥锁的操作;当一个进程或内核线程尝试对互斥锁加锁时,若该锁已被锁住,该进程或内核线程就会进入挂起、阻塞状态。此过程就会引发任务切换,通过调用kernel/sched/core.c中的schedule函数,逐步切换到其他的内核任务...
BPF的内核调试方法一直以来,笔者对BPF功能的认知一直停留在与tcpdump工具进行网络抓包相关;最近几年BPF已成为内核的顶级子系统,从网络抓包的内核支持模块演进成为内核调试、性能跟踪的复杂模块。其对内核的调试(也可用于应用的调试)是动态的;不过该动态调试过程并不需要编译内核模块并加载之,而是将调试应用编译成为eBPF字节码,并通过bpf系统调用将该字节码加载到内核中的BPF虚拟机中解析执行,
一.前言 作为一名初级的嵌入式软件开发从业者,工作中大部分项目以C语言实现。使用C语言来编写代码,通常我们可以预测到编译生成的汇编/机器编码的大致情况,在不同的芯片架构上,有其相应的ABI标准。而近年来逐渐流行起来的Go语言编程,虽然同样语法上和C语言语法都有较为简单的特点,也都是编译型的静态语言,但我们对它在基本类型——函数参数的传递方式就了解很少了。另外,Go语言的函数可以有多个返回
基于Linux内核的应用性能分析技术Linux内核有良好的分层设计,但了解并实时跟踪内核的行为并不容易。为此,Linux内核开发者实现了跟踪点(tracepoint)、性能监测(perf_event)、函数跟踪(ftrace)等功能,用于Linux的调试和性能分析。最近几年已经成熟的eBPF内核子系统带来了内核性能分析技术的飞跃,常用的主要有bcc、bpftrace;二者同属于github的iov
获取当前芯片平台的相关信息为了深入了解ARM 64位芯片架构,笔者为u-boot添加了archinfo命令,以获取CPU当前的工作状态等信息。不过在增加完整的64位ARM架构信息查看功能之前,笔者首先增加了简单的获取当前PC指针及栈指针的函数:diff --git a/arch/arm/lib/arch-info.c b/arch/arm/lib/arch-info.cnew file mode
使用GCC编译器生成头文件依赖复杂的C/C++工程中的头文件比较多,在编写GNU Makefile时,手动指出其源代码文件的头文件依赖关系是不可行的,需要通过编译工具自动生成头文件的依赖关系。GNU GCC的-MXX命令行选项用于生成某个代码文件的依赖关系,通常使用的命令行选项为:-MT object.o -MP -MMD -MF object.d其中,-MT用于指定与源文件对应的目标文件名(此处
make的命令行变量参数在Makefile脚本中,可以通过$(MAKE)递归执行其他的Makefile。make的一些命令行选项(例如禁止输出当前目录的选项--no-print-directory等),会对其行为产生一些影响,而递归调用的make也应当继承这一类选项。此外,在编译u-boot或Linux内核等工程时,常用的命令为:make ARCH=arm64 CROSS_COMPILE=aarc