
Linux驱动
monkey_llll
这个作者很懒,什么都没留下…
展开
-
更改Linux console输出等级
最近在调试问题的时候,发现有些日志没有通过串口终端打印出来。排查发现是内核里面配置的串口日志等级较高,导致有些日志没有打印。在内核的配置文件里面,更改CONFIG_CONSOLE_LOGLEVEL_DEFAULT的值。原创 2024-11-06 14:57:32 · 164 阅读 · 1 评论 -
通过dlopen使用动态库
在和别人合作开发的时候,往往存在一方提供库供另一方调用。这个过程存在编译依赖问题,库更新问题。为了解耦,这里可以使用dlopen的方式去使用动态库。原创 2024-10-16 15:39:16 · 369 阅读 · 0 评论 -
panic_on_rcu_stall
之前项目在开发阶段,有个版本,内核很容易就挂了。后面排查发现,是因为内存用完了,导致内核出现了panic。当时一直很疑惑,为什么内存没有了,导致内核出现了panic。后面发现,在启动的时候,/proc/sys/kernel/panic_on_rcu_stall里面被人写入了1。内存在耗尽的时候,导致RCU出现了问题。进而导致内核出现了panic。内核运行时的参数,在/proc/sys/目录下都存在对应的文件。查看内核运行时参数的命令:sysctl -a。原创 2024-09-09 10:15:19 · 291 阅读 · 0 评论 -
uboot、kernel通过KCFLAGS控制代码编译
很多时候,为了便于代码管理,我们希望在编译的时候,根据传入的参数去编译我们指定的代码。这样可以大大的减少我们的工作量。原创 2024-08-19 15:35:40 · 251 阅读 · 0 评论 -
kmallc、kzalloc、vmalloc使用
vmalloc() 函数则会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移。kzalloc是kmalloc的变种。GFP_ATOMIC:分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断;原创 2024-03-14 16:54:12 · 307 阅读 · 0 评论 -
Linux 相关宏介绍
解释一下Linux里面定义的各种宏。原创 2024-03-05 16:22:07 · 475 阅读 · 0 评论 -
list_head的使用方法
定义一个list_head类型的head将我们自定义的结构体里面的所有的list_head串起来。后面我们需要的时候,就遍历head变量的所有list_head节点,找到的每一个节点,都使用container_of来找到该节点结构体的首地址,来判断是不是我们找寻的目标。最近用到了list_head,在这里记录一下。如果要搞清楚list_head的使用方法,需要了解container_of的原理。上面代码实现了list_head的增删改查的操作。里面有个我自己定义的删除函数,请忽略。原创 2024-02-28 18:19:05 · 217 阅读 · 0 评论 -
container_of宏的简介及使用
container_of宏之前看了一下内核里面的使用方法,然后就直接依葫芦画瓢用了。没有深究其实现原理。最近使用list_head的时候,发现也用到了container_of。所以就详细看看container_of的实现原理。那么问题又来了,我们根据结果或者结构体的定义,可以知道这个8是怎么来的。但是我们只知道t.c的地址,和t的类型,怎么来得到这个8呢?结合上面的代码,问个问题,如果我们知道t.c的地址,怎么计算t的地址。计算方式如下:t=t.c-8。原创 2024-02-28 17:49:29 · 143 阅读 · 0 评论 -
contain_of的原理与实现
contain_of原理介绍与实现原创 2023-02-16 23:01:16 · 1469 阅读 · 0 评论 -
添加代码版本控制信息到dmesg里面
添加代码版本控制信息到dmesg里面原创 2022-10-02 18:00:17 · 507 阅读 · 0 评论 -
Linux查看分区label信息
知道分区的label信息,怎么查找到对应的是哪一个设备文件,以userdata分区为例:执行如下命令:/sbin/blkid | grep "userdata" | awk -F'[":"%]+' '{print($1)}'命令输出:Linux的分区label查看方式如下:执行命令:/sbin/blkid输出如下:/dev/sde50: PARTLABEL="multiimgoem" PARTUUID="8c92ee74-0b82-1c43-7c7a-3c2d64f原创 2022-05-10 16:41:18 · 2150 阅读 · 0 评论 -
Linux查看设备树节点的相关信息
内核升级以后,devices的信息就在设备树里面进行描述了。某些时候,我们可能需要查看当前外设对应的设备树里面配置的信息,比如分辨率、时钟等。在这里做一个记录。比如mmc里面存在如下属性:compatible、bus-width、clock-names、max-frequency上面的属性,有些是string类型,有些是int类型。对于string类型,我们只需要找到对应的文件,直接cat,就能获取对应的信息。对于int类型,我们只需要找到对应的文件,通过hexdump来获取,hexdu原创 2022-04-28 15:39:34 · 3595 阅读 · 0 评论 -
Linux设备驱动程序源码
「Linux设备驱动程序第三版源码」https://www.aliyundrive.com/s/6aRKP1cZQ7z 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。原创 2022-01-17 19:34:16 · 1589 阅读 · 0 评论 -
Linux驱动-bootargs的使用
这个文章是转载的,转载链接:Linux内核解析BootLoader中命令行参数的三种方法 - 程序员大本营文章内容没有去验证,先做个记录。Linux的bootargs目前我知道的有2种来源:1、uboot2、dts那么,kernel在解析bootargs的时候,究竟是使用哪一个来源了,看到了如下博客:可以通过配置kernel,以此来解决确定来源问题。第一种:如果在uboot命令行中设置了bootargs,那就只有bootargs有效,kernel中默认的CONFIG_CMDL转载 2021-12-24 11:08:49 · 1124 阅读 · 0 评论 -
Linux驱动-符号导出
MakefileARCH=armCROSS_COMPILE=arm-poky-linux-gnueabi- obj-m += use_export_symbol.o export_symbol.o KDIR := /home/lqd/tiny4412/linux5.0/tiny4412-master/linux-5.0 #如果是用于arm平台,则内核路径为arm内核的路径 EXTRA_CFLAGS +=-g PWD = $(shell pwd)all: make A原创 2021-12-23 00:08:11 · 607 阅读 · 0 评论 -
Linux驱动-编译驱动模块的Makefile和脚本
Makefile内容:ARCH=armCROSS_COMPILE=arm-poky-linux-gnueabi- #也可以同时编译多个模块 obj-m += export_symbol.o export_symbol1.o export_symbol2.oobj-m += export_symbol.o KDIR := /home/lqd/tiny4412/linux5.0/tiny4412-master/linux-5.0 #内核源码的路径 EXTRA_CFLAGS +=原创 2021-12-23 00:02:19 · 1144 阅读 · 0 评论 -
Linux驱动-printk打印等级和模块传参
#include <linux/module.h> //所有模块都需要的头文件#include <linux/init.h> // init&exit相关宏#include <linux/kernel.h>#include <linux/moduleparam.h> int param_int = 10;unsigned short param_ushort = 20;char *param_str = "hello";int.原创 2021-12-22 23:25:09 · 1227 阅读 · 0 评论 -
查找文件被哪些进程打开
先上脚本:#!/bin/sh#example#Find which process /dev/dri/card0 is occupied by#./find_file.sh /dev/dri/card0if [ $# -ne 1 ]thenecho "Incorrect number of parameters, please add a parameter."echo "example:Find which process /dev/dri/card0 is occupied by原创 2021-11-16 20:25:45 · 626 阅读 · 0 评论 -
Linux查看某个文件被哪些进程占用
在工作过程中,我们进程需要查找某个文件被哪些进程占用。先上脚本:#!/bin/sh#example#Find which process /dev/dri/card0 is occupied by#./find_file.sh /dev/dri/card0if [ $# -ne 1 ]thenecho "Incorrect number of parameters, please add a parameter."echo "example:Find which process /d原创 2021-10-15 14:59:23 · 4645 阅读 · 0 评论 -
Linux 驱动模块依赖的问题
在Linux驱动开发过程中,一个产品的功能可能由好几个驱动模块组成。模块之间存在依赖的关系。那么怎么处理这种依赖的关系呢。比如一个产品由A和B两个模块组成。在B模块里面调用了A模块的test()函数。那么编译的时候,是怎么实现的呢?在编译模块的过程中,我们会发现有一个Module.symvers文件生成。这个文件,如果你的驱动代码里面没有调用EXPORT_SYMBOL这个宏,那么这个Module.symvers文件里面就是空的,如果调用了,那么里面就是对应的内容。下面的代码来自网友://内原创 2020-09-13 16:10:32 · 3028 阅读 · 0 评论 -
串口错误标志位解读
串口错误标志位解读:FE:帧错误,指示当前字符是否存在帧错误(缺少停止位)并且可能已经损坏BRK:BREAK检测,指示当前字符是否为BREAK字符,数据位和停止位均为0OE:接收器超限,指示接收过程中,是否存在数据来不及接收的现象PRERR:RS-485模式下,它保存接收到的9位RS-485数据的第9个数据位。在RS-232/IrDA模式下,它是奇偶校验错误标志。指示是否检测到当前字符是否具有奇偶校验错误并且可能已经损坏Error Detect:错误检测,指示RX_DATA字段是否具有错误-OE原创 2020-07-29 09:16:56 · 3046 阅读 · 0 评论 -
Linux 定时器+延时工作队列+外部中断例程
先上代码:#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/gpio.h>#include <linux/fs.h>#include <asm/uaccess.h>#include <linux/platform_device.h>#include <linux/of_gp原创 2020-06-08 22:19:10 · 548 阅读 · 1 评论 -
Linux 延时工作队列的简单使用
先上代码,代码如下:#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/gpio.h>#include <linux/fs.h>#include <asm/uaccess.h>#include <linux/platform_device.h>#include <linux/原创 2020-06-08 22:15:07 · 1480 阅读 · 0 评论 -
Linux 定时器的简单使用
主要记录定时器的简单使用,先上代码:#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/gpio.h>#include <linux/fs.h>#include <asm/uaccess.h>#include <linux/platform_device.h>#include &l原创 2020-06-08 21:59:21 · 334 阅读 · 0 评论 -
Linux complete的使用记录
之前使用complete的时候,程序总是wait_for_completion函数先执行,并且每次只有一个wait_for_completion在等待,因此对于complete函数也没有太多的深入了解。后面再次需要使用这个功能的时候,想到如果wait_for_completion函数在complete之后执行会出现上面问题?结论:如果wait_for_completion函数在complete之后执行,那么执行wait_for_completion函数时,添加就直接满足,不会再等待complete函数的原创 2020-06-08 21:27:27 · 1793 阅读 · 2 评论