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();
} ...
Linux单用户模式及运行级别
Linux单用户模式及运行级别背景单用户模式是Linux运行级别其中的一种在不同的初始化系统(init)中略有差异
Linux运行级别runlevel
sysvinit
systemd target
备注
0
poweroff.target
关机
1, s, single
rescue.target
单用户模式, 类似Windows 的安全模式,主要用于系统修复
2, 4
multi-user.target
用户定义/域特定运行级别。默认等同于 3
3
multi-user.target
多用户,非图形化界面,标准字符界面
5
graphical.target
多用户,图形化界面,图形桌面默认级别
6
reboot.target
重启
emergency
emergency.target
紧急shell
切换运行模式grub 配置进入单用户模式在grub的cmdline启动参数后面添加 S, s, 1, single其中一个,内核会将该参数传递给init进程处理,在内核中并未有相应的处理函数。
运行模式相关命令
查看系统当前运行级别:$ runle ...
Linux之系统调用
Linux之系统调用1、背景在应用开发中,我们经常会去操作IO设备,文件,网络,内存等,基本上都是通过高级语音(C/C++,JAVA等)提供的一些标准库或API去操作,那这些是怎么和操作系统联系在一起的呢?答案就是今天的主角–系统调用。
这里我们只讨论:
硬件: Arm64
系统: Linux系统 (Kernel-5.15-rc1)
高级语言: C (glibc-2.34)
模式: 64位 (即未定义CONFIG_COMPAT)
2、什么是系统调用Linux系统分为内核态和用户态,两者是相互隔离的。为了防止各种应用程序可能对系统资源的破坏,用户态的应用程序是没有权限直接去访问系统资源的,当需要访问时,就需要通过系统调用。
系统调用是内核提供给用户态应用程序的一系列统一接口,标准库或API在系统调用的基础上做了进一步抽象和封装。用户态的应用程序可以直接进行系统调用,也可以通过标准库或API来调用
一个系统调用有很多个步骤,其中一个很重要的就是用户态和内核态相互切换,包括CPU模式的切换, 内核栈、用户栈的保护与处理等
大致的流程为:
------------------------- ...
博客主题切换
博客主题切换今天把博客主题从Matery切换为了Butterfly
主要因为:
Butterfly相对更轻量
Butterfly相对更灵活
Hexo博客主题历史Next -> Matery -> Butterfly
lscpu命令详解
lscpu命令详解背景
Kernel源码: v5.15-rc1 (linux-stable)
测试Kernel: v5.4
注: 分析只针对arm64平台
简介**lscpu**: 主要是用来显示CPU结构相关信息对应的help信息:
用法:
lscpu [选项]
显示 CPU 架构信息。
选项:
-a, --all 同时打印在线和离线 CPU (-e 选项默认值)
-b, --online 只打印在线 CPU (-p 选项默认值)
-B, --bytes print sizes in bytes rather than in human readable format
-C, --caches[=<list>] info about caches in extended readable format
-c, --offline 只打印离线 CPU
-J, --json use JSON for default or ...
Debian系软件包降级
Debian系软件包降级背景最近在折腾Kylin的时候, 不知道什么原因导致升级异常,然后系统的设置都没有了~~~手动安装设置软件包报依赖异常,于是就想降级下软件包
降级软件包此方式应该适用于使用apt包管理器的debain系,已在kylin上验证OK
#查看可安装的可用版本
apt-cache showpkg xxx
#安装指定版本
sudo apt-get install xxx=version
延伸:apt相关常见错误:
报错: apt-add-repository:找不到命令 sudo apt-get install software-properties-common
常用命令:
#对指定包的版本hold住,更新的时候就会忽略掉这个包
sudo apt-mark hold xxx
#取消对该包版本的锁定
sudo apt-mark unhold xxx
#下载deb包
apt download xxx
#下载包源码
sudo apt source xxx
#查看依赖
apt-cache depends xxx