如何使用ltrace跟踪应用层程序调用系统库情况?
2025-04-01
ltrace
是一个用于跟踪进程调用动态库函数的工具,主要用于调试和分析程序运行时与共享库(.so 文件)的交互情况...
2025-04-01
ltrace
是一个用于跟踪进程调用动态库函数的工具,主要用于调试和分析程序运行时与共享库(.so 文件)的交互情况...
2025-03-30
struct platform_device
是用于描述硬件信息的驱动,其他驱动可以通过名称和它进行匹配。一旦匹配成功后,可以通过它来获取硬件的信息。下面的例子就演示了如何进行驱动匹配和获取硬件信息...
2025-03-29
id_table
是一个指向struct platform_device_id
数组的指针,用于定义驱动可以匹配的设备ID列表。当内核检测到一个平台设备时,会检查其名称或ID是否与驱动提供的id_table
中的任一条目匹配,从而决定是否绑定该驱动...
2025-03-28
struct platform_device
是Linux内核中用于表示平台设备的重要数据结构,它是Linux设备模型的一部分,特别用于那些不通过传统总线(如 PCI、USB 等)连接的设备...
2025-03-27
Linux hrtimer(高分辨率定时器)是Linux内核提供的一种高精度定时机制,用于支持微秒(μs)甚至纳秒(ns)级别的定时操作,相比传统的定时器(如timer_list
)具有更高的精度和灵活性...
2025-03-26
在Linux内核的struct platform_driver
驱动结构中,id_table
和of_match_table
都用于驱动与设备的匹配,但它们的用途和工作方式有所不同...
2025-03-26
在Linux内核中,struct pwm_device
是用于描述和管理PWM(脉冲宽度调制)设备的核心数据结构。它通常定义在include/linux/pwm.h
中,主要作用是为PWM控制器(硬件)和消费者(驱动)之间提供统一的抽象接口...
2025-03-25
struct tasklet_struct
是Linux内核中用于实现"小任务"(tasklet)机制的数据结构。Tasklet是一种底层的延迟执行机制,常用于中断处理的下半部(Bottom Half)...
2025-03-25
struct work_struct
是Linux内核中用于实现延迟工作(deferred work)机制的重要数据结构,属于工作队列(workqueue)子系统的一部分...
2025-03-24
One-Wire是由Dallas Semiconductor(现为Maxim Integrated)开发的一种通信协议,允许主设备(如微控制器或嵌入式Linux 系统)通过单根线与一个或多个从设备进行低速数据交换...
2025-03-24
struct input_dev
是Linux内核中用于表示输入设备的数据结构,定义在<linux/input.h>
头文件中。它用于管理和描述输入设备(如键盘、鼠标、触摸屏等)及其事件...
2025-03-23
在用户态访问spi从设备也是比较常用的功能。下面的例子就实现了如何读取和设置spi从设备的GPIO引脚...
2025-03-22
在用户态访问i2c从设备也是比较常用的功能。下面的例子就实现了如何读取和设置i2c从设备的GPIO引脚...
2025-03-21
用户态使用串口进行通信也是比较常用的功能。下面的例子就实现了如何使用raspi3b串口进行收发数据...
2025-03-20
从用户空间访问GPIO也是比较常用的功能。下面的例子就演示了如何在Linux用户空间访问GPIO,并控制其引脚电平...
2025-03-18
链表是一种常用的数据结构,在开发中经常会使用到。在Linux内核中同样也是一个很常用的数据结构,而且内核对链表实现了很多相关函数,极大方便了链表的使用。内核中的链表和一般的链表使用方法是不一样的...
2025-03-18
每次打开字符设备驱动文件都会重新创建一个struct file
结构体。如果想为每个打开的文件保留私有的数据,可以使用file->private_data
成员...
2025-03-18
Linux的sysfs是一种虚拟文件系统,用于将内核对象、属性和关系导出到用户空间,方便用户和管理员查看和配置内核及硬件信息。sysfs通常挂载在/sys
目录下...
2025-03-17
mmap是Linux系统中的一种系统调用,用于将文件或设备映射到进程的地址空间,从而实现内存映射文件或共享内存的功能。通过mmap,进程可以直接访问文件内容,而无需使用传统的read和write系统调用...
2025-03-16
一般来说,驱动是不会访问文件系统的,更不会在文件系统上创建除设备驱动文件外的其他文件。但是有时为了满足某些奇怪的需求,会有访问文件系统的需求...
2025-03-16
DMA(直接内存访问,Direct Memory Access)是一种允许硬件设备直接访问系统内存的技术,无需通过CPU的干预。它主要用于提高数据传输效率,减少CPU的负担...
2025-03-15
在Linux驱动中,信号量是很常用的工具,可以保证数据安全。下面的例子实现使用信号量模拟自旋锁,保证不同线程安全的访问临界空间数据...
2025-03-15
在Linux驱动中,可以使用completion
进行同步。下面的例子就使用完成量等待定时器回调函数返回...
2025-03-14
在Linux驱动中,自旋锁是很常用的工具,可以保证数据安全。因为自旋锁会一直占用CPU,所以一般用于保护能够快速完成的临界区...
2025-03-14
在Linux驱动中,定时器是很常用的工具,可以让延时执行一些函数。下面的例子实现了延时一秒钟执行一次定时器回调函数...
2025-03-14
在Linux驱动中,原子操作是很常用的工具,可以保证数据安全。一般为了保护数据安全会使用锁机制,不过锁的开销比较大。如果是简单的整数运算...
2025-03-14
在Linux驱动中,互斥锁是很常用的工具,可以保证数据安全。下面的例子实现不同线程安全的访问临界空间数据...
2025-03-13
在Linux内核中,miscdevice是一种用于简化字符设备驱动注册的机制。它适用于那些不需要主设备号的简单设备驱动。miscdevice使用一个固定的主设备号(10)...
2025-03-12
很好奇I2C设备是如何与驱动进行匹配的吧?一般是通过设备树文件来描述I2C从设备的信息,例如名称和地址等。驱动通过和名称与从设备进行匹配...
2025-03-12
监听GPIO引脚变化是嵌入式开发的基础知识。在Linux驱动中监听GPIO电平变化也是很方便的。下面的例子就演示了如何监听GPIO引脚电平变化...
2025-03-11
GPIO引脚控制是嵌入式开发的基础知识。在Linux驱动中控制GPIO也是很方便的。下面的例子就演示了如何初始化GPIO引脚,并获取和设置GPIO引脚电位...
2025-03-11
SPI是嵌入式开发中常用的一个通信协议,下面的例子给大家演示如何使用IIO子系统来和SPI设备进行通信,并获取设备的信息...
2025-03-10
格式化磁盘后,会将磁盘分割成一个个大小相同的块。这些块就是磁盘管理的最小单位。那么是如何找到空闲位置存储一个文件的呢?下面先来了解几个常用的概念...
2025-03-10
Industrial I/O (IIO)是 Linux 内核中的一个子系统,专为处理工业应用中的模拟数字转换器(ADC)、数字模拟转换器(DAC)、惯性测量单元(IMU)、光传感器、压力传感器等设备而设计...
2025-03-09
串口通信是嵌入式开发的常用通信方式之一。下面就给大家演示一下,如何使用Linux驱动来进行串口通信?下面的例子主要实现了串口通信回显功能...
2025-03-09
i2c
是嵌入式开发的常用协议,下面我们学习通过Linux驱动来读写i2c
设备的数据。通过设备树来获取i2c
的信息,使用Linux内核的i2c
子系统提供的接口来控制读写数据...
2025-03-08
动态内存分配是一个很重要的功能,如果没有动态内存分配,所有的变量都分配到堆上,堆栈很容易就会溢出。动态内存分配一般都是用来分配需要长期使用的内存或大块的内存...
2025-03-08
点亮第一个LED灯是嵌入式开发的Hello World
程序。下面我们学习通过Linux驱动来点亮LED灯。通过设备树来获取LED的信息,使用Linux内核的GPIO子系统提供的接口来控制LED灯...
2025-03-07
进行嵌入式开发的主流方法是使用设备树文件添加设备信息,驱动通过获取设备信息对设备进行操作。下面将演示如何写一个设备树插件文件和驱动代码...
2025-03-06
进行嵌入式开发一般都需要嵌入式开发板,但是购买嵌入式板需要一定费用。对于初学者也不知道选择哪种类型的嵌入式板才比较合适...
2025-03-05
/sys/kernel
是Linux系统中的一个虚拟文件系统目录,位于sysfs
文件系统下,主要用于提供内核相关的信息和配置接口。通过它,用户和应用程序可以访问和调整内核的某些运行时参数和行为...
2025-03-05
写简单的驱动,一般一个源文件就足够了。写复杂的驱动,不仅要按照不同的功能模块组织项目。而且还有可能在一个项目里构建几个驱动。所以源文件也会比较多...
2025-03-04
proc
文件系统并不是真正存在于磁盘上的文件系统,而是由 Linux 内核动态创建的,用于提供一种访问内核数据结构和运行时系统信息的接口。它通常挂载在/proc
目录下...
2025-03-03
在Linux内核驱动中创建线程是一个很常见的功能。下面的例子使用两种方法来创建线程。其中kthread_run
函数不需要创建线程,直接就让线程运行起来,比较方便...
2025-03-03
如果给Linux驱动实现fasync
函数,那么驱动就能够通过信号机制异步通知客户端程序。这个方法一般比较少用,但我们也要熟悉这种方法。下面就给大家带来一个完整的例子...
2025-03-03
send_sig_info
是Linux内核中的一个函数,用于向指定进程发送信号。它允许内核代码向特定进程发送信号,并附带一些额外的信息(通过struct siginfo
结构体传递)...
2025-03-02
线程同步在编程中是很常见的功能。在Linux内核中也提供了等待队列同步机制
,可以很方便进行线程同步。下面就给出了完整的例子,写入操作触发等待队列,等待队列中的等待者会得到执行的机会...
2025-03-02
一个驱动实现了poll
函数,就能够让客户端程序使用select
或epoll
等异步IO系统调用进行读写驱动,大大丰富了驱动的使用。下面的例子就带大家看看如何去实现...
2025-03-01
应用层客户端程序使用ioctl
来控制设备的状态是一种很常见的情况。下面的例子就演示了如何去实现一个这样的字符串设备驱动...
2025-02-28
一个驱动可以管理多个设备文件,通过不同的从设备号
来区分它们。下面就提供了实例代码实现如何创建多个从设备文件
和区分不同的从设备文件
的访问请求...
2025-02-27
每次安装字符设备驱动都需要使用mknod
命令,在/dev
目录下创建对应的字符设备。这显然是一件麻烦的事情...
2025-02-26
字符设备驱动在Linux系统中是很常见的。字符设备驱动是Linux内核中用于管理字符设备的模块。字符设备以字节流形式进行数据传输,通常不支持随机访问...
2025-02-26
dmesg
是一个用于显示或控制内核环形缓冲区消息的命令。它主要用于查看系统启动时的内核消息,以及系统运行期间内核产生的各种日志信息...
2025-02-25
panic()
是Linux内核中一个关键函数,用于在发生无法恢复的严重错误时终止系统运行,并打印错误信息...
2025-02-25
dump_stack()
是 Linux 内核中一个关键的调试函数,用于在系统发生异常(如内核panic、oops或死锁)时打印当前线程的调用堆栈信息...
2025-02-25
在Linux系统中,确定哪个程序正在消耗大量网络流量可以通过多种工具和方法实现。以下是几种常用的方法...
2025-02-25
oops
是Linux内核中用于处理严重错误的机制。当内核检测到无法恢复的错误(如空指针解引用、非法内存访问等)时,会触发...
2025-02-25
BUG_ON()
是Linux内核中一个用于调试和错误处理的宏,用于在特定条件为真时触发内核异常(如panic
或oops
),并打印调试信息(包括调用堆栈)...
2025-02-25
在dump_stack
函数的基础上还有一个WARN_ON()
函数。 WARN_ON()
是Linux内核中一个用于调试的宏,用于在特定条件为真时触发警告并打印警告信息,同时输出当前线程的调用堆栈(Call Stack)...
2025-02-24
proc
文件系统是一个由内核动态生成的虚拟文件系统,挂载在/proc
目录下。它不占用物理存储空间,而是通过内存实时反映系统和进程的运行状态...
2025-02-24
uptime
命令输出的load average
反映了系统在1分钟、5分钟、15分钟内的平均负载情况。这里的平均负载并不是CPU
的使用情况...
2025-02-23
这里总结了Linux IO相关的调试工具。包含性能指标和常用功能图表,可以通过图表很方便的找到对应的工具...
2025-02-23
这里总结了Linux 内存相关的调试工具。包含性能指标和常用功能图表,可以通过图表很方便的找到对应的工具...
2025-02-23
这里总结了Linux 网络相关的调试工具。包含性能指标和常用功能图表,可以通过图表很方便的找到对应的工具...
2025-02-23
人在家中睡,锅从手机来。某天深夜接到几十条夺命短信,床头的手机不停地振动。你妈的,谁他妈在深夜不停发短息。匆忙拿起床头的手机,刺眼的屏幕亮瞎了程序员的狗眼。一阵恍惚后,定眼一看,坏事了...
2025-02-23
在Linux
内核中,一般使用ioremap
将物理地址映射到内核虚拟地址空间,使内核能够通过指针访问设备的内存或寄存器。主要用于访问设备的内存映射I/O
区域...
2025-02-23
这里总结了Linux内核调试的常用工具。包含了CPU,内存,IO和网络相关的调试工具。每个类别都有对应的性能指标和常用功能图表,可以通过图表很方便的找到对应的工具...
2025-02-23
这里总结了Linux CPU相关的调试工具。包含性能指标和常用功能图表,可以通过图表很方便的找到对应的工具...
2025-02-23
应用层的程序一般都会依赖一些外部的库,驱动程序也不例外。驱动间也可以形成一个依赖链,将驱动的功能分割到不同的驱动。能减少驱动的复杂性和增加可维护性...
2025-02-23
在Linux中top
命令应该是最常使用的性能分析工具,可以通过top
命令获取CPU、内存、进程状态和中断等信息,是排错和调试一把好手...
2025-02-22
在进行嵌入式Linux开发的过程中,经常需要和i2c
设备打交道。所以需要获取i2c
设备的状态,进行读写操作。在开源的世界里,当然有大神已经为我们写好了对应的工具:i2c-tools
...
2025-02-22
之前写过一篇关于devmem
工具的文章:在Linux中使用devmem快速操作物理地址。这个工具就是通过读写/dev/mem
字符设备来操作物理地址的...
2025-02-22
在进行代码重构的过程中,经常需要对代码中的变量名进行批量修改,使用vscode
等现代化的IDE
或编辑器,能很快的进行修改。但使用vim
且没有安装对应插件的情况下,就没那么方便了...
2025-02-21
在调试嵌入式Linux开发板的过程中,很多时候都需直接操作物理地址。例如设置GPIO
地址。如果单独写一个驱动,就有点高射炮打蚊子了。正好在有一个工具devmem
能快速操作物理地址...
2025-02-20
在Linux
内核中,likely
和unlikely
是用于优化条件分支预测的宏,定义在compiler.h
头文件中。它们通过提示编译器某个条件更可能为真或假,帮助生成更高效的代码...
2025-02-19
access_ok
函数用于验证用户空间指针在内核空间中是否有效且可访问。这是一项重要的安全检查,确保内核不会无意中访问无效或恶意的用户空间内存,否则可能导致安全漏洞、崩溃或未定义行为...
2025-02-18
Sysdig
是一款功能强大的开源系统监控和故障排查工具,主要用于Linux
系统的监控、分析和诊断。它能够捕获系统的实时活动,并提供详细的系统调用信息,帮助用户深入了解系统行为和性能问题...
2025-02-18
在编程的时候,经常听见buffer
和cache
,很多时候我们都不区分它们。但在操作系统
中,它们是完全不同的两个概念。下面我带大家来看看它们两个到底是什么多西...
2025-02-17
SystemTap
是一种用于Linux
系统的动态追踪工具,允许用户监控和分析内核及用户空间程序的运行情况。它通过编写脚本插入探针,实时收集数据,帮助诊断性能问题、调试代码和理解系统行为...
2025-02-17
在写函数的时候,为了控制内部的运行逻辑或者对内部进行初始化,一般都会给函数传入参数。同样的为了控制内核驱动的行为,我们也希望在驱动加载的时候给它传入初始化参数...
2025-02-15
bpftrace
是一个基于eBPF
(扩展的伯克利包过滤器)的高级跟踪工具,用于动态追踪Linux
系统的行为和性能。它允许用户通过简单的脚本语言编写跟踪程序,实时监控内核和用户空间的活动...
2025-02-14
BCC(BPF Compiler Collection)
是一个用于创建高效内核跟踪和操作的工具包,基于 eBPF(extended Berkeley Packet Filter)
技术。eBPF
允许用户在不修改内核源代码或加载内核模块的情况下,安全地运行自定义代码...
2025-02-13
perf
是Linux
系统中的一个性能分析工具,用于监控和分析系统及应用程序的性能。它基于内核的perf_events
接口,能够收集硬件(如 CPU 性能计数器)和软件事件(如上下文切换、缺页异常等)的数据...
2025-02-13
trace-cmd
是一个用于控制Linux
内核跟踪工具ftrace
的命令行工具。ftrace
是Linux
内核内置的跟踪框架,能够帮助开发者调试和分析内核行为。trace-cmd
简化了ftrace
的使用,提供了更友好的接口来配置、启动、停止和查看跟踪数据...
2025-02-12
ftrace
是Linux
内核中的一种跟踪工具,用于分析和调试内核行为。它通过在内核函数中插入钩子来捕获函数调用、返回及其他事件,帮助开发者了解内核的执行流程和性能瓶颈...
2025-02-11
之前写了一篇文章介绍如何使用qemu启动Linux?。主要是使用bzImage
和busybox
创建的文件系统来启动Linux
内核。制作文件系统的过程还是比较麻烦的。下面介绍两个简单点的方法...
2025-02-10
在嵌入式Linux
开发的调试过程中,如果需要频繁的更新文件系统中的内容是一个很麻烦的过程。所以Linux
内核提供了能够通过使用nfs
文件系统启动的功能...
2025-02-10
大多数时候我们都不需要将内核驱动添加到内核源码中,可以通过insmod
命令在需要的时候自己手动安装驱动。不过将驱动添加到源码树中有下面的好处...
2025-02-09
学习Linux
内核相关知识从什么角度入手不好把握。有的人喜欢从文档开始看,了解整个内核的体系结构,再看源代码。有的人喜欢一开始就看源代码,不过内核源码有900M
,就算是去除驱动相关代码也有400M
...
2025-02-08
最近在学习内核相关的知识,所以有一个Linux
内核调试环境是非常有必要的。我选择在ubuntu 24.04
上使用qemu
启动内核,主要是qemu
启动速度快...
2023-11-17
我发现一个可以恶搞别人的方法:制作一个体积很小的压缩文件,但是打开后体积会非常大...
2023-10-25
AI
是当下最热门的话题之一。而且大部分的AI
相关框架都是使用python
进行开发。正所谓万事开头难,第一步当然是搭建python
开发环境...
2023-10-24
最近开始写个人博客。一开始使用nginx
对http
协议进行反向代理,但是大部分浏览器都会提示不安全。心想一个纯文本的网站也不涉及隐私数据就没有去管...