❶ 如何查看linux内核中printk打印的信息
printk() 和 printf() 几乎没有什么两样, 唯一的差别是 printk() 会把输出的结果,送到内核的环缓冲区回 (ring buffer)里面。这个缓冲区是系答统所有信息集中的地方,就像开机时所看到的信息,都可以在这个环缓冲区找到。 任何时候, 我们都可以用 dmseg 命令查看环缓冲区的内容, 或是直接检验 /proc/kmsg 这个文件。
❷ linux如何保护共享资源
主要有一下几种:中断屏蔽、 原子操作、自旋锁、信号量、环形缓冲区。在本文中对于这些机制的具体的实现函数,以及原理不再做任何的表述。本 一、原子变量 假设我们所需要保护的共享资源只是一个整数值,此时我们可以采用的机制有自旋锁,信号量,和原子变量,当然中断屏蔽也是可以的。但是如果选择最优的机制,我们应该选择原子变量。原因:1.对一个整数值的操作是很简单的,也就是说此对全局变量形成的临界区是很小的.如果我们采用其他的机制,例如锁的机制,信号量等就显得有些浪费.也就是说,你的锁机制的代码量可能比临界区的代码量还要多.2. 对一个缺乏经验的程序员来讲,由于思维缺乏逻辑,使用锁机制会存在很多潜在的风险.例如: 死锁.等问题;而采用原子变量的方法,可以避免锁机制产生的弊端. 二、自旋锁自旋锁机制和信号量机制都可以对资源进行互斥访问,但是从性能上讲,自旋锁的性能优于信号量。但是自旋锁机制本身在不停的自旋(也就是查询锁是否可用),导致此机制有一些缺点:1。假定我们的驱动程序获得了一个自旋锁,在临界区开始了他的工作期间,驱动程序丢掉了处理器。也许他调用了一个函数,这个函数使进程休眠。也许发生了内核的抢占。但是我们的代码拥有这个自旋锁,如果其他的进程想要获得此自旋锁,需要等很长时间,甚至造成死锁。所以我们应用自旋锁时应遵循:任何拥有自旋锁的代码必须是原子的。所以他不能休眠,所以不能调用能够引起休眠的函数。例如:_to_user,_from_user,kmalloc等。也不能因为任何原因放弃处理器,除了中断以外(有时中断也不行,可以采用禁止中断的自旋锁函数操作)。 三、信号量拥有信号量的进程是可以休眠的。这也正是他对于自旋锁的优势。 其他的暂不论述。
❸ 求助求助 red hat linux操作系统实现electron模块加载的指令
内核模块的程序结构
模块加载函数(必须)
当通过insmod或modprobe命令加载内核模块时,模块会自动被内核执行,完成模块的相关初始化工作。
一般以 __init标识声名函数,并且用“mole_init(初始化函数名)”来初始化
模块卸载函数
模块许可证声名
模块参数
模块导出符号
模块作者等信息声名
独立编译Makefile
#makefile for kernel mole
MODNAME=helloworld
ifeq ($(PLATFORM), PC)
KERNELDIR?=/lib/moles/$(shell uname -r)/build
else
KERNELDIR?=你的linux源码编译路径
endif
obj-m := $(MODNAME).o
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles
clean:
@rm -rf *.o *.ko *.mod.* *.tmp* mole* Mole*
123456789101112131415
注意ifeq 后面要有个空格
模块测试源码
#include <linux/init.h>
#include <linux/mole.h>
static int __init helloworld_init(void)
{
printk(KERN_DEBUG "My first hello world kernel mole!\n");
return 0;
}
static void __exit helloworld_exit(void)
{
printk(KERN_DEBUG "Bye,cruel world !\n");
}
mole_init(helloworld_init);
mole_exit(helloworld_exit);
1234567891011121314151617
编译
初始化变量 export PLATFORM=PC
编译: make
执行make后得到对应的.ko文件
模块加载及卸载
insmod helloworld.ko
rmmod helloworld
执行加载命令时我们希望打印 My first hello world kernel mole!
卸载时我们希望能打印 Bye,cruel world !
然而实际上什么都没打印,lsmod查看helloworld.ko有成功加载
printk输出
在Linux中,内核打印语句printk()会将内核信息输出到内核信息缓冲区中,内核缓冲区是在
kernel/printk.c中通过如下语句静态定义的:
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
1
内核信息缓冲区是一个环形缓冲区(Ring Buffer),因此,如果塞入的消息过多,则就会将之前的消
息冲刷掉。
printk()定义了8个消息级别,分为级别0~7,级别越低(数值越大),消息越不重要,第0级是紧急
事件级,第7级是调试级
通过/proc/sys/kernel/printk文件可以调节printk()的输出等级,该文件有4个数字值:
控制台(一般是串口)日志级别:当前的打印级别,优先级高于该值的消息将被打印至控制台。
默认的消息日志级别:将用该优先级来打印没有优先级前缀的消息,也就是在直接写printk(“xxx”)而不带打印级别的情况下,会使用该打印级别。
最低的控制台日志级别:控制台日志级别可被设置的最小值(一般都是1)。
默认的控制台日志级别:控制台日志级别的默认值。
用户可以通过dmesg命令查看内核打印缓冲区,而如果使用sudo dmesg -c命令,则不仅会显示__log_buf,还会清除该缓冲区的内容。
————————————————
版权声明:本文为CSDN博主「linyplhm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43777852/java/article/details/101852495
❹ 获取Arch Linux上存储设备信息的一些记录
2019-06-04 遇到的一点小问题
需要获取在Arch Linux设备上的USB存储设备的信息,并按格式展示在web端。
同事让先了解几个命令,试了试:
在 ArchWiki 上有专门的 fdisk介绍 。
fdisk -l 获取的设备型号被截断了,而且信息有点乱,筛选麻烦。
lsscsi应用 ,这篇 说明 挺详细的。
lsscsi -s 以表格信息获取设备型名、大小,可惜型号会被截断。
usbutils应用 ,这篇 List USB Devices Linux 有提到一些。
lsusb 、 lsusb -v 、 usb-devices 、、、列出了不少ID,不过没打算用这个,先不管。
hdparm应用 ,随便 搜索 时,刚好看到的。
hdparm -i /dev/sdb 这个主要是获取或设置硬盘参数的,获取的信息挺全的,也符合预期,可惜不支持读取USB上的设备信息。
同事推荐的这篇文章, 16 commands to check hardware information on Linux ,列出了很多检查Linux上的硬件信息的命令。试了试:
lshw应用 ; lshw介绍 。
lshw 默认输出太多了。
lshw -class disk -json 还好这个可以筛选需要的,而且还能以json格式输出。可惜输出的多条信息中间需要自己加逗号 , ,两头加方括号 [] 。
hwinfo应用 ;没有在 Arch manual pages 搜索到命令说明书,链接是别的网站的。
hwinfo 默认输出太多了,还好可以加上 --short 。
hwinfo --short --usb 可以只输出缩略信息,同时支持筛选,比如只显示usb相关,具体可以看 说明令 。
lsblk 默认输出 可以获取完整大小、分区大小,也有一项 MOUNTPOINT 可以看到挂载的位置,也可惜显示的大小数据不是想要的。
lsblk -b 可以按bytes格式获取大小后再计算。
lsblk -p 可以完整显示路径名称。
lsblk -S 可以获取完整的品牌型号名,没有被截断;而且名字中间的分割符也不是空格 ,是下划线 _ ,能很方便地使用 awk 获取。
翻了翻 说明文件 ,发现 lsblk 功能还是很多的,可以使用 -n 去表头;可以使用 -o +SIZE 来增加输出的信息列;可以使用 -o NAME,MODEL,SIZE 限定只输出哪些信息列;可以使用 -d /dev /sda 来限定只输出某个设备的信息行;可以使用 -J 以json格式输出信息。
dmesg命令 :
介绍是 dmesg - print or control the kernel ring buffer , 检查和控制内核的环形缓冲区 。在搜索的时候也有看到用这个命令来 查看 刚插入的usb信息,当然 dmesg 主要不是做这个的。记录一下。
还试了些其他命令,懒得整理了。
目前先不安装其他应用,先使用 lsblk -p -S -b -o NAME,MODEL,SIZE -n 去掉表头,然后只显示完整的路径,完整的型号名称,以及按照bytes格式获取存储设备的大小;已使用的容量大小就等 mount U盘后使用 df 来获取。
❺ linux iio子系统adc支持多高的采样率
最近由于工作的需要,接触了Linux iio子系统,对于这个目录其实以前是很少接触,接下了对 Linux iio 子系统进行分析。
1、首先 iio子系统在内核树中位置:drivers/staging/iio
详细的iio子系统说明文档位置:drivers/staging/iio/Documentation(文档是个好东西,详细阅读文档,有利于更深层次的理解iio子系统)
2、简介:
iiO子系统全称是 Instrial I/O subsystem(工业 I/O 子系统),此子系统的目的在于填补那些分类时处在hwmon(硬件监视器)和输入子系统之间的设备类型。在某些情况下,iio和hwmon、Input之间的相当大的重叠。
3、iio目录结构架构:
[plain] view plain
iio
├── accel
├── adc
├── addac
├── cdc
├── dac
├── dds
├── Documentation
│ └── dac
├── gyro
├── impedance-analyzer
├── imu
│ └── mpu
│ └── inv_test
├── light
├── magnetometer
├── meter
├── pressure
├── resolver
└── trigger
4、iio 目录结构说明:
进入相应目录,里面都有相关IC的驱动,网上查阅资料,对iio子系统做如下简要的说明:
accel :
该文件夹下是一些加速度传感器,例如:adis16201、kxsd9、lis3l02dq、sca3000等
adc :
该文件夹下是一些模数转换器,将模拟信号转换成数字信号,例如:ad7192、adt7310(数字温度传感器)等
addac :
Temperature Sensor 温度传感器,例如:adt7316
cdc :
电容数字转换,例如:ad7150
dac :
一些数模转换器,将数字信号转换成模拟信号,例如:ad5064、ad5791(单通道、20位、无缓冲电压输出DAC)等
dds :
频率扫描仪,频率合成器,例如:ad5930、ad9951等
Documentation :
iio子系统相关文档说明,相关说明比较详细,说明文档是个好东西……
gyro:
陀螺仪,例如:adis16060(角速度陀螺仪)、adis16260(数字陀螺仪)、adxrs450(角速率陀螺仪)等
impedance-analyzer :
阻抗测量芯片,只有一个芯片ad5933
imu:
惯性陀螺仪、磁力计、加速度计,例如:adis16400,其中的mpu子目录有些重要的传感器(目前工作中正在使用)
imu
└── mpu:有MPU3050(三轴)、MPU6050(六轴)、MPU9150(整合了MPU6050及AK8975电子罗盘)、MPU6515等
light :
光学传感器,例如:isl29018、tsl2563等
magnetometer :
地磁传感器、磁力计传感器,例如:hmc5843、ak8975
meter :
有功功率和电能计量,例如:ade7759(电能计量数据转换器)、ade7753等
pressure :
压力传感器,例如:bmp182
resolver :
旋转变压器/数字转换器,例如:ad2s1200(旋转变压器输出的模拟信号转化为数字信号)等
trigger:
触发器
5、iio子系统架构图:
6、iio子系统功能:
(1)、设备注册和处理
(2)、通过虚拟文件系统(VFS)轮训访问设备
(3)、chrdevs事件
chrdevs事件包括阈值检测器,自由下落检测器和更复杂的动作检测。chrdevs事件的输入,iio为底层硬件触发与用户空间通行提供了通道,chrdevs事件本身已经不仅仅是一个事件的代码和一个时间戳,与chrdevs事件相关联的任何数据必须通过轮询访问。
(4)、硬件环缓冲支持
现在很多传感器芯片上本身就包括 fifo / ring 缓冲,通过sensor自带 fifo / ring 缓冲,可以大大的减少主芯片处理器的负担。
(6)、触发和软件缓冲区(kfifo)支持
在许多数据分析中,触发和软件缓冲区(kfifo)支持就显得非常有用,能够更加高效的捕捉到外部信号数据。这些触发包括(数据准备信号、GPIO线连接到外部系统、处理器周期中断、用户空间访问sysfs中的特定文件等),都会产生触发。
7、iio子系统的内核接口
为各种sensor提供了内核接口
8、iio子系统环形缓冲区(如下图)
iio子系统采用环形缓冲区,环形缓冲区本质是一个数据结构(单一,固定大小,可调并首尾相连),这种结构非常适合缓冲数据流。这些缓冲区通常用来解决生产者消费者问题,在一些应用中,它被设计成生产者会(例如一个ADC)覆盖消费者(例如一个用户空间应用程序)无法暂时处理的过期数据。但是通常这种缓冲会被设置为适当的大小,以使这种情况不会发生。