
Linux驱动/内核编程
文章平均质量分 78
Embedded-Xin
沪漂-嵌入式软件开发工程师
正在逐步把之前的笔记整理到博客上,做到稳定的输入与输出!
展开
-
strace工具使用——实战解决文件描述符超限too many open files导致CPU飙高问题
CPU异常飙高,会突然出现飙到百分之110的情况。这周突然飙高大概率和程序死循环执行某事情有关,可以选择拿stace快速定位。原创 2025-01-12 16:39:21 · 374 阅读 · 0 评论 -
Linux-systemd管理——简述常用命令及如何添加一个service
systemd架构是作为所有进程的父进程,以PID为1一直运行在Linux系统中,作为所有进程的父进程,涵盖了Linux操作系统中绝大多数操作,比如用户登陆(loginctl),设备挂载,日志采集(journalctl),网络管理(networkctl)等,以unit file为基本单位。原创 2024-11-17 16:15:08 · 1084 阅读 · 0 评论 -
Linux网络配置及网卡策略-挑重点版
etc/udev/rules.d/70-persistent-net.rules,更改可以实现mac地址绑定网卡名,从而实现自定义#SUBSYSTEM========"ethUSB0"/etc/network/interfaces,更改可以配置不同网卡联网策略5ifup8ifdown8。原创 2024-11-17 16:13:58 · 421 阅读 · 0 评论 -
rsyslog服务日志记录——简述规则及原理
etc/rsyslog.conf rsyslog默认配置文件/etc/rsyslog.d/50-default.conf 默认配置,查看syslog、kern.log等路径例如:kern 的log输出到/userdata/var/log/kern.log。原创 2024-11-17 16:10:05 · 476 阅读 · 0 评论 -
Linux内存管理(1)——MMU内存管理单元及Buddy算法详解
最近复习Linux内存管理部分,简单将自己的理解记录一下:包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE):随机存取存储器,掉电丢失,CPU直接交换数据的内部存储器,也叫主存(内存)。可以随时读写,而且速度很快:只读存储器,掉电不丢失,只读不可写,用于存放计算机的基本程序和数据:高速缓冲存储器,位于CPU与内存之间,读写速度比内存更快。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。原创 2024-08-28 23:26:02 · 1272 阅读 · 0 评论 -
Linux内核(5)——从udev/mdev工作原理到亲手实现SD卡热插拔
手动创建设备节点的命令:可以用于创建设备节点,创建设备节点的逻辑在内核空间(内核2.4版本之前使用):自动创建设备节点的机制,创建设备节点的逻辑在用户空间(从内核2.6版本一直使用至今):是一种轻量级的udev机制,用于一些嵌入式操作系统中,是busybox中自带的一种udev机制。原创 2024-08-19 23:18:54 · 1719 阅读 · 0 评论 -
Linux内核(4)——Linux设备文件open函数从应用到内核全过程解析
用户调用glibc接口Open函数->调用到open_not_cancel_2宏定义->INLINE_SYSCALL宏定义->INTERNAL_SYSCALL_RAW宏定义->系统调用的scno映射到寄存器值,并执行swi软中断指令->此时进入内核态,触发syscall系统调用,执行内核的vevtor_swi函数->获取scno,并根据call.s组成的sys_call_table中找到对应的系统调用函数->执行函数,调用retq指令返回用户态。原创 2024-08-01 23:19:08 · 1680 阅读 · 0 评论 -
Linux内核(3)-内核模块结构详解
lsmod:查看已加载模块ls /sys/module :查看内核已加载模块如果有tree命令,也可以用tree -a以树状查看,其中refcnt是模块引用计数cat /proc/kallsyms:查看内核符号表inmod:加载驱动模块modprobe:加载驱动模块,并加载驱动所依赖其他模块modprobe -r: 卸载驱动模块modinfo:查看驱动信息2.1 模块加载及卸载函数当内核模块被加载时,执行模块加载函数,当内核模块被卸载时,执行模块卸载函数内核驱动加载分为模块动态加载和直接编原创 2024-07-20 23:38:38 · 898 阅读 · 0 评论 -
Linux驱动调试——使用DEVICE_ATTR实现cat、echo指令调试驱动
DEVICE_ATTR宏定义在kernel/include/linux/device.h文件中。struct__ATTR作用:定义一个device_attribute结构体,之后device_create_file使用。_name:名称,在/sys/device/virtual中的名称,##name代表将name的字段直接替换到##_name处,所以假设_name为ap3216c_test,那这边定义的结构体名就是dev_attr_ap3216c_test_mode。原创 2024-06-22 12:35:47 · 1532 阅读 · 0 评论 -
I2C总线驱动——ap3216c光感传感器从寄存器手册开始入手的实战版(附思维导图)
IIC驱动框架,也是一个标准的platform驱动,其中分为I2C总线驱动和I2C设备驱动I2C总线驱动:( 适配器驱动 )一般是原厂维护,主要是提供读写等APII2C设备驱动:是针对具体I2C设备所编写的驱动IIC总线驱动也遵循驱动、设备、总线的匹配规则,设备和驱动匹配成功后,probe函数便会执行,probe函数在i2c_driver中,我们主要需要实现的也是driver这部分。其中i2c_device_match完成IIC总线的设备和驱动匹配。i2c_client:描述设备信息。原创 2024-06-17 12:34:20 · 1526 阅读 · 0 评论 -
块设备驱动(1)-什么是块设备驱动?块设备驱动概念总结
块设备驱动是针对存储设备,例如SD卡、EMMC、NAND FLASH、NOR FLSASH。块设备驱动,当发生写入操作时,并不会立马操作硬盘,因为写之前要擦除,擦写频繁影响flash寿命。对于flash设备而言,,所以对于不对存储设备,Linux里有实现不同的I/O调度算法。而字符设备。借鉴一张在网上找到的图片,框架图当然是学习中必不可备的东西,一眼便能有个清晰的认识其中块设备驱动请求有两种形式,使用requeset_queue请求队列,以及不使用请求队列的。原创 2024-03-10 20:27:33 · 1535 阅读 · 0 评论 -
platfor设备驱动(1)-什么是platform设备驱动?platform设备驱动基础总结
Linux系统内核使用bus_type结构体表示总线,该结构体定义在文其中的match函数用于总线完成设备和驱动之间匹配 dev为设备,drv为驱动,所以每一条总线都必须实现这个函数。platform总线是bus_type的一个示例,在其中使用进行驱动和设备之间的匹配。return!return 1;return 1;= NULL;:设备树的匹配方式,通过compatible属性在OF表匹配,匹配后执行probe函数。原创 2024-02-28 16:31:04 · 1740 阅读 · 0 评论 -
Linux中的并发与竞争(1)并发是如何发生的以及原子操作介绍
A、B、C任务,同时对共享数据段S进行访问A任务对S写入3000个字符"a",B任务对S写入3000个字符"b",C任务负责读取所有数据,当执行顺序如下时,A将数据从用户态拷贝完成后,还未累加当前访问下标,B便对数据进行了访问,此后C获取数据,获取到的数据并不是3000个字符"a",而是3000个字符"b"。原创 2024-02-22 23:55:56 · 433 阅读 · 0 评论 -
Linux中的并发与竞争(2)最简单的自旋锁概念及范例
当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。:如果持有锁的线程能在短时间内释放锁资源,那么竞争锁就不需要做内核态和用户态之间的切换,只需要等到持有锁的线程释放锁,避免了用户进程和内核切换的消耗。:为读和写提供了不同的锁,当没有写操作时,允许多个线程使用读锁,进行并发的读取操作。更适用于读取场合更多的情况。在进入临界区时,线程A获取到锁,并且保存中断状态,禁止了中断,防止被中断服务打断而造成死锁现象。原创 2024-02-22 23:59:07 · 539 阅读 · 0 评论 -
pinctrl/gpio子系统(1)-pinctrl子系统介绍及驱动源码分析
在如今的驱动开发工作中,实际上已经很少去对着寄存器手册进行驱动开发了,一般板子拿到手,已经有原厂的驱动开发工程师,在gpio子系统、pinctrl子系统中将自家芯片的引脚适配好了。我们直接基于设备树已配置好的寄存器值,去使用子系统对应的API函数,就能快速完成驱动开发,不需要再那么关心IO寄存器的值,借助这种驱动分层的思想,快速完成驱动开发。其中配置一个GPIO最重要的几点就是配置:从设备树中获取,PIN 可复用为 I2C、SPI、GPIO,当复用为gpio的时候,就需要用到gpio子系统。原创 2024-01-31 17:24:18 · 1262 阅读 · 0 评论 -
设备树(2)-设备树在Linux系统的具体体现及内核解析设备树文件过程
哈喽~我是Embedded-Xin,沪漂嵌入式开发工程师一枚,立志成为嵌入式全栈开发工程师,成为优秀博客创作者,共同学习进步。这里先不深度去跟踪整个解析流程,能看懂设备树,遇到问题能有解决思路,待之后实际用到遇到问题了,再开始来逐步学习,加强记忆。内核启动时解析dtb文件, 后在/proc/device-tree 目录 生成设备树节点文件,过程大概如下。这里先关注结果,不关注过程,之后实际用到了再来捋这个过程~进入soc节点,soc节点下所有子节点和属性如下。这样的话,可以使用spi0访问节点。原创 2024-01-23 17:21:27 · 818 阅读 · 0 评论 -
设备树(1)-设备树是什么?设备树基础概念及语法
设备树源码文件,采用树形结构描述板级信息,例如IIC、SPI等接口接了哪些设备:设备树头文件,描述SOC级信息,例如几个CPU、主频多少、各个外设控制信息等:DTS编译后得到的二进制文件:设备树工具。原创 2024-01-19 16:32:46 · 1230 阅读 · 0 评论 -
Linux内核(2)-Makefile详解,必须要掌握的编译参数
查看变量V的来源,如果来源于command line,且KBUILD_VERBOSE 赋值为V的值,如果V=1 则quiet=quiet_和Q=@。(MAKEFLAGS)),就是匹配MAKEFLAGS中的s或者-s开头的字符串,如果匹配到的结果不为空,则quiet=silent_启用静默输出。在Makefile中,如果命令前用@,则代表不将命令内容输出,例如@rm -rf $(output)O的来源于 command line,则KBUILD_OUTPUT赋值为变量O的值。%:通配符,匹配任何字符。原创 2024-01-06 16:01:35 · 816 阅读 · 0 评论 -
Linux内核(1)-内核目录介绍,每个人都应该了解的内核目录结构
不同平台的默认配置文件,例如xxx_defconfig。:编译出的Image和zImage Linux镜像文件。:架构相关目录,例如arm、arm64。: 相应平台的驱动和初始化文件。原创 2024-01-06 16:00:09 · 467 阅读 · 0 评论 -
Linux驱动开发(1)-最简单的字符设备驱动开发例子
按照字节流进行读写操作的设备,例如点灯、按键、IIC、SPI、LCD。Linux系统中一切皆文件,驱动加载成功,就会在/dev目录生成文件,对文件操作,则可实现对硬件操作。应用程序运行在用户空间,驱动运行在内核空间,用户空间不能直接对内核操作,因此借助系统调用实现。原创 2024-01-06 16:04:12 · 1247 阅读 · 0 评论 -
裸机开发(2)-裸机实战
Cortex-A内核CPU的所有外部中断都属于IRQ中断,任意外部中断发生都会出发IRQ中断,在中断服务函数中需要判断到底是哪个中断发生。①、复位中断(Rest),CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化 SP 指针、DDR 等等。②、未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。原创 2023-12-22 17:52:11 · 1612 阅读 · 0 评论 -
裸机开发(1)-汇编基础
函数发生调用时,需要进行线程保护,简单来说,就是先进行压栈操作,将调用函数参数、返回值等存到R0-15寄存器中,在执行完毕后,需要将数据内容从寄存器读出,进行出栈操作,而这一系列操作需要SP指针。芯片上电后SP指针(堆栈指针寄存器)还未初始化完毕,无法执行C代码,所以必须要用汇编设置好C语言环境。原创 2023-12-22 17:42:02 · 1235 阅读 · 0 评论 -
内核_设备树_文件系统_uboot
操作系统内核运行前的一段小程序,负责初始化硬件设备(如CPU、SDRAM、Flash、串口),加载内核、设备树文件到内存中并执行内核代码。:是一种描述硬件的数据结构,用于管理各种设备的树状结构,在操作系统引导阶段,将数据结构中的硬件信息传递给操作系统。初学一个东西,还是决定将名词全都熟悉一遍啦,不用了解的太仔细,看到的时候能知道大概是什么东西!:嵌入式Linux系统的核心,负责进程管理、内存管理、文件系统管理、网络和设备驱动等功能模块。:一个开源、轻量级的软件工具/命令集合。原创 2023-12-22 17:23:32 · 611 阅读 · 0 评论 -
uboot学习(1)-uboot目录详解
uboot学习原创 2023-12-17 19:55:07 · 805 阅读 · 0 评论 -
uboot学习(3)-uboot环境变量
uboot环境变量默认值:include/env_default.h。原创 2023-12-17 19:58:58 · 609 阅读 · 0 评论 -
uboot学习(4)-uboot移植
bak等等,并在这些结果中排除RCS_FIND_IGNORE变量值中代表的文件和文件夹(因为RCS_FIND_IGNORE变量值代表的文件和文件夹是不执行删除操作的),随后进行删除操作,完成清理编译文件的目的。总结原因,主要是因为ubuntu未安装对exFAT格式的支持,导致SD卡插上后,并未真正挂载上,而是一个虚假的设备节点,在安装文件系统格式支持后,成功解决该问题~可以看到当前SD卡中,无分区,可直接输入n创建一个新分区,分区的具体参数,可以直接回车选择默认。原创 2023-12-17 20:01:46 · 969 阅读 · 0 评论 -
uboot学习(2)-uboot常用命令
uboot全称Universal Boot Loader。作用:简单来说就是,初始化DDR等外设,将Linux内核从flash中拷贝到DDR中,最后启动Linux内核。原创 2023-12-17 19:54:10 · 636 阅读 · 0 评论 -
栈的向上增长及向下增长解析
所以平时在计算栈偏移地址时,需要注意不同芯片平台栈的增长方向可能不同。1、向下增长,就是从高地址向低地址增长。栈顶即为&arr[254]。2、向上增长,就是从低地址向高地址增长。栈顶即为&arr[0]。压栈操作是从栈顶压向栈底。假设堆栈为数组arr。原创 2023-08-15 23:46:13 · 2147 阅读 · 1 评论