一个静态全局变量初始化引发的讨论
一个静态全局变量初始化引发的讨论背景最近在提交的一个补丁,引发了一个静态全局变量初始化的讨论, 主要还是理论基础不够扎实,特此记录
具体的情况是这样的:在一个补丁中,我定义了一个静态的全局变量,来存储启动参数传过来的值。开始补丁中的这部分是这样的:
static bool alc269_restore_verbs = false;
但使用补丁检查工具检查时,报如下的错误:
./scripts/checkpatch.pl 0001-xxx.patch
ERROR: do not initialise statics to false
后面就在提交补丁的时候,把这个初值去掉了,然后在群里引起了一阵讨论。
通过网上查了查,和大家的讨论, 去掉初值主要是基于以下原因:静态全局变量会默认初始化为0,如果初值为0就没必要进行初始化,是多此一举。
在C语音编译的时候,已初始化的全局变量就保存在.data段中,未初始化的全局变量保存在.bss段中。
BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会 ...
内核模块参数
内核模块参数背景接上一篇 内核启动参数cmdline
上一篇主要讨论了不是模块的情况下,内核启动参数的传递解析过程及使用:early_param()和__setup(),这篇主要讨论下模块的情况
相关内核文档:Documentation/admin-guide/kernel-parameters.rst等
内核模块添加参数module_param(参数名, 参数类型, 0644);
MODULE_PARM_DESC(参数名, "参数说明.");
内核模块参数使用分3种方式:
内核启动cmdline模块名.参数=xxx
模块加载cmdlinemodprobe 模块名 参数=xxx
动态修改/ sys / module / <模块名> / parameters/参数
例如:
(kernel command line) usbcore.blinkenlights=1
(modprobe command line) modprobe usbcore blinkenlights=1
内核模块定义和解析过程定义下面是module_param定义(include/ ...
记一次UAC无法使用的bug
记一次UAC无法使用的bug现象最近遇到一个BUG,一个USB摄像头自带的MIC没法在Linux下使用。记录下UAC相关排查过程
分析查看驱动加载及节点使用lsusb可以看到,该UAC的设备已经加载对应通用驱动snd-usb-audio:
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 4: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 1: Dev 6, If 0, Class=Mass Storage, Driver=usb-storage, 480M
|__ Port 2: Dev 8, If 0, Class= ...
Kernel之模块版本检查
Kernel之模块版本检查背景通过insmod或modprobe加载核外驱动ko时,特别是第三方驱动,经常会遇到模块版本检查报错,类似:
version magic '5.4.96-xx SMP preempt mod_unload aarch64' should be '5.4.96-yy SMP preempt mod_unload aarch64'
那我们就来看看模块版本检查的大致过程
Kernel: v5.4.96vermagic: version magic
过程分析内核相关源码:kernel/module.c逻辑过程比较简单check_modinfo() -> same_magic()check_modinfo() 函数首先获取模块相关的modinfo,即modmagic,然后会和内核的vermagic做对比,即same_magic()函数
可以通过cat /proc/version 来查看linux 系统的 vermagic ,对于module, 可以通过modinfo xxx 的方式来查看module的 vermagic
che ...
Kernel之MODVERSION
Kernel之MODVERSION官方说明关于modversion,内核文档官方解释(Documentation/kbuild/modules.rst):
6 Module Versioning Module versioning is enabled by the CONFIG_MODVERSIONS tag, and is used as a simple ABI consistency check. A CRC value of the full prototype for an exported symbol is created. When a module is loaded/used, the CRC values contained in the kernel are compared with similar values in the module; if they are not equal, the kernel refuses to load the module.
Module.symvers contains a list of all export ...
Kernel之vermagic
Kernel之vermagic内核的vermagic内核的vermagic类似于:5.4.96-xx SMP preempt mod_unload aarch64
内核的vermagic即为VERMAGIC_STRING``(include/linux/vermagic.h)
static const char vermagic[] = VERMAGIC_STRING;
/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#elif defined(CONFIG_PREEMPT_RT)
#define MODULE_VERMAGIC_PREEMPT "preempt_rt "
#else
#define MODULE_VER ...
科普贴--电源管理的几种状态
科普贴–电源管理的几种状态G状态针对系统整个平台来定义,肉眼可以识别。我们根据吃电量大小,软件是否工作,外部事件触发到工作状态的延时时间,拆机是否安全等来判断系统处于哪种状态
G0:工作状态,操作系统分发用户线程并执行。在此状态中,外围设备吃电量可以改变。
G1:显示器关闭,用户态线程不再执行。系统状态S1,S3,S4均属G1状态。返回G0状态用时比G2短。
G2:关机状态,硬件不会保存软件环境,需要较长时间才能返回到工作状态。此状态也称为soft off。
G3:也称Mechanicaloff,除RTC电开启外,再无其它电,此种状态下,我们拆机不会有短路风险
S状态系统状态,这种状态是针对OS所定义。G状态中除了G3,其余G0,G1和G2分别有相应的状态与之相对应。S状态的判定:可根据平台吃电量大小,系统返回工作状态的延时时间来判定。
S0:工作状态,和G0相同。
S1:CPU时钟信号被停止,CPU有较低的功耗,返回到S0的时间较短。
S3:即我们常说的睡眠状态。此状态下,系统环境保存在内存里面。设备带电方面:只有内存VCC保留,其余设备全部关闭。时钟方面:只有RTC时钟依然有 ...
科普贴--几种内核文件
科普贴–几种内核文件
vmlinux: ELF文件,编译出来的最原始的内核文件,未压缩, 不可引导,根据vmlinux.lds生成
Image: 经过objcopy处理的只包含二进制数据的内核代码,不是elf格式,未压缩
zImage: 是vmlinux经过gzip压缩后的文件,适用于小内核
bzImage: bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
uImage: U-boot专用的映像文件,在zImage之前加上一个长度为0x40的tag,tag包含了该镜像文件的类型、加载位置、生成时间、大小等信息
vmlinuz: 可引导,压缩,是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接
initrd: “initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态,比如加载ext3 ...
Kernel之seq_file接口
Kernel之seq_file接口背景最近在看/proc/cpuinfo的内核实现时,发现了一个以前没注意的东东: seq_file接口
seq_file(Sequence file:序列文件)接口内核文档: Documentation/filesystems/seq_file.txt
There are numerous ways for a device driver (or other kernel component) toprovide information to the user or system administrator. One usefultechnique is the creation of virtual files, in debugfs, /proc or elsewhere.Virtual files can provide human-readable output that is easy to get atwithout any special utility programs; they can also make life easier ...
ARM平台UART问题
ARM平台UART问题问题背景最近遇到一个问题: 鲲鹏920机器串口无法修改波特率后面发现该硬件使用的是芯片自带的SBSA UART,该UART本身就无法修改波特率, 可见内核文档说明(arm_sbsa_uart.txt):
ARM SBSA defined generic UARTThis UART uses a subset of the PL011 registers and consequently livesin the PL011 driver. It’s baudrate and other communication parameterscannot be adjusted at runtime, so it lacks a clock specifier here.
Required properties:
compatible: must be “arm,sbsa-uart”
reg: exactly one register range
interrupts: exactly one interrupt specifier
current-speed: the ...
Ethtool与EEPROM
Ethtool与EEPROMethtoolethtool命令用于获取或修改以太网卡的配置信息。这个命令比较复杂,功能特别多
使用man ethtool可查看详细的使用说明,这里不再详述
这里主要通过探讨ethtool操作MAC地址与EEPROM相关的内容,来梳理ethtool工具的整个工作流程,下面一系列前提是网卡的MAC地址存放在EEPROM里面!
操作EEPROM里面MAC地址相关的命令:
读取MAC地址: ethtool -e ${ethname}
烧写MAC地址: ethtool -E ${ethname} offset 0 value 0xf4
ethtool -E ${ethname} offset 1 value 0x4d
...
那ethtool工具是怎么和EEPROM操作相关联的呢? 下面分别从内核态和用户态来看看
用户态ethtool软件包源码:http://www.kernel.org/pub/software/network/ethtool/
{ "-e|--eeprom-dum ...
Linux单用户模式console问题分析
Linux单用户模式console问题分析问题背景
Kernel:v5.4.131
ACPI有SPCR表
最近遇到一个问题: 单用户模式, arm64平台, 显示器进不了console,只显示部分log或只有光标在闪烁, 而接的调试串口可以正常进console;MIPS和X86没有这个问题,可以正常在显示器进console
原因分析单用户模式下,首先看下ARM64和X86下dmesg关于console的差异:
ARM64: printk: console [ttyAMA0] enabled
X86: printk: console [tty0] enabled
你会看到ARM64下面使用串口为首选console,而X86是tty0。
通过代码分析,其主要的差异在acpi_table_parse()函数调用这:在ARM64平台:arch/arm64/kernel/acpi.c
if (acpi_disabled) {
if (earlycon_acpi_spcr_enable)
early_init_dt_scan_chosen_stdout();
} ...