驱动学习篇
随记,不定时更新驱动相关知识,累积驱动开发相关经验
一、知识点
1. bios与vbios的区别
BIOS(Basic Input/Output System)和VBios(Video BIOS)是计算机系统中的两个不同的组成部分,它们具有以下区别:
-
功能不同:BIOS是计算机系统的基本输入/输出系统,负责启动计算机、初始化硬件设备和提供基本的操作系统功能。它包含了一些固化的程序和设置,用于管理计算机系统的硬件和软件。而VBios是显卡的BIOS,主要负责管理和控制显卡的工作,包括显示输出、显存管理、显示模式设置等。
-
定位不同:BIOS是计算机系统的一个整体组成部分,存在于主板上的固化芯片中。它与计算机的其他硬件设备(如处理器、内存等)紧密相关。而VBios则是显卡上的一个独立的固化芯片或固件,与显卡硬件紧密结合。
-
可更新性不同:BIOS通常可以通过固件升级来更新,以支持新硬件或修复现有的问题。而VBios的可更新性相对较低,通常只在显卡制造商发布的驱动程序中进行更新。
-
功能范围不同:由于BIOS是计算机系统的基本组成部分,它涉及到整个系统的初始化和管理,包括处理器、内存、硬盘等。而VBios仅涉及显卡的功能和设置,例如显示输出、分辨率、颜色设置等。
总之,BIOS是计算机系统的基本输入/输出系统,而VBios是显卡的BIOS,负责显卡的管理和控制。它们在功能、定位、可更新性和功能范围等方面存在区别。
2. “烧固件”的固件
在实际应用中,烧录固件时所指的“固件”可以包括各种类型的嵌入式软件程序,用于控制设备的操作和功能。以下是一些常见设备中可能需要烧录的固件类型及其示例:
-
BIOS(基本输入/输出系统):
-计算机的主板上存储的 BIOS,负责初始化硬件、启动操作系统等。 -
UEFI(统一扩展固件接口):
-最新的计算机主板和服务器通常采用 UEFI 替代传统 BIOS,用于提供更先进的引导和系统管理功能。 -
路由器固件:
-路由器中的固件程序,控制网络路由、无线连接、安全设置等功能。 -
嵌入式系统固件:
-嵌入式设备(如智能家居设备、工业控制系统)中的固件,用于控制设备的操作和功能。 -
固态硬盘固件:
-固态硬盘(SSD)中的固件,影响存储器的性能、稳定性和兼容性。 -
显卡固件(VBIOS):
-显卡中的 VBIOS,控制显示输出、分辨率、颜色深度等功能。 -
固件更新程序:
-用于将新固件烧录到设备中的更新程序,确保设备具有最新的功能和修复漏洞。
这些都是常见设备中可能需要进行固件烧录的类型,通过更新固件可以改善设备的性能、功能和安全性。本人工作中常说的“烧固件”一般指的是擦除并写入vbios。
3. 节点
节点有很多含义,这里主要讲属于 Unix-like 操作系统中的一种虚拟文件系统的节点概念。它并不指向传统的硬盘文件,而是指向进程的文件描述符。
类 Unix 操作系统提供了许多虚拟文件节点,用于查看和操作计算机的相关信息。以下是一些常见的虚拟文件系统节点,它们用于提供系统状态、硬件信息和进程数据等:
(1)/proc 目录:
/proc是一个虚拟文件系统,它包含了系统和内核的相关信息。这里的每个 "节点" 实际上都是一个文件或目录,包含了有关系统、进程、硬件的实时数据。- 例子:
/proc/cpuinfo:显示 CPU 信息(核心数量、架构等)。/proc/meminfo:显示内存的使用情况。/proc/uptime:显示系统的运行时间。/proc/[PID]:每个进程的虚拟目录,包含该进程的状态、内存使用、打开的文件等信息。
(2)/sys 目录:
/sys是另一个虚拟文件系统,提供了与内核、设备驱动程序和硬件相关的详细信息。它用于在用户空间与内核进行交互。- 例子:
/sys/class/net:包含所有网络接口的信息,如eth0、wlan0等。/sys/block:提供关于块设备的信息,如硬盘、分区等。/sys/devices:提供系统硬件设备的信息。
(3) /dev 目录(其他节点):
- 除了
/dev/fd,/dev还包含了其他一些设备节点,用于与硬件进行交互或提供设备状态。 - 例子:
/dev/sda:表示第一个 SCSI 磁盘或 SATA 硬盘。/dev/tty*:表示终端设备。/dev/null:表示丢弃任何写入的数据的设备。
(4)/proc/mounts 或 /etc/mtab:
- 这些文件显示当前挂载的文件系统的信息,包括文件系统类型和挂载位置。
(5)/dev/ptmx 和 /dev/pts/:
/dev/ptmx和/dev/pts提供对伪终端(PTY)的访问,通常与远程登录、终端会话和进程通信相关。
(6) /run 目录:
/run用于存储运行时数据,如进程的 PID 文件、锁文件等,提供运行中的系统状态。
小结:
这些虚拟节点提供了丰富的计算机和操作系统信息,用户可以通过读取或写入这些文件来查询系统状态、调试问题,甚至控制某些硬件设备。它们在本质上是虚拟的,不占用物理存储空间,但却提供了大量有用的实时数据。
二、测试工具
1. glxgears-3D
齿轮(glxgears)是一个简单的 OpenGL 渲染器,用于测试 3D 图形的性能。在 Linux 系统中,你可以按照以下步骤下载并安装齿轮:
-
打开终端:在 Linux 中,按下
Ctrl + Alt + T组合键来打开终端。 -
安装 Mesa 工具包:输入以下命令来安装 Mesa 工具包:
sudo apt-get install mesa-utilsMesa 工具包是一个 OpenGL 实现,它提供了许多有用的工具,包括齿轮。
-
运行齿轮:在终端中输入以下命令来运行齿轮:
glxgears这将会启动齿轮应用程序,并显示一个旋转的齿轮。你可以通过关闭应用程序来停止它。
请注意,齿轮并不是一个严格意义上的性能测试工具,因为它只是简单地旋转一个齿轮,而不涉及任何复杂的场景或纹理。因此,它只能提供一个粗略的性能估计。如果你需要一个更全面的性能测试工具,可以考虑使用更专业的测试软件,如 Unigine Heaven 或 3DMark。
-
相关使用:
vblank_mode是一个用于控制垂直同步(V-Sync)行为的环境变量。在使用glxgears这样的 OpenGL 应用程序时,设置vblank_mode可以影响渲染帧的显示方式。 -
vblank_mode=0:禁用垂直同步。在这种模式下,glxgears会尽可能快地渲染帧,可能导致屏幕撕裂,因为帧的更新与显示器的刷新率不同步。 -
vblank_mode=1:启用垂直同步。在此模式下,渲染帧会在显示器的垂直刷新期间更新,从而减少或消除屏幕撕裂现象。不过,这可能会限制帧率到显示器的刷新率,导致某些情况下的性能下降。
总结来说,vblank_mode=0 优化了性能,但可能会有撕裂,vblank_mode=1 则提供更平滑的视觉效果,但可能牺牲一些性能。
2. glmark2-3D
glmark2 使用的 OpenGL 和 OpenGL ES API 进行测试,提供了一系列的渲染场景和测试选项,旨在评估计算机系统的 3D 图形渲染能力。
注意,glmark2 通过测试帧率(FPS)和性能得分,对系统的图形处理能力进行评估和比较。但主要用于比较不同系统或硬件之间的图形性能差异,并不一定代表实际应用程序的性能。在使用 glmark2 进行测试时,需要注意测试环境的一致性和可比性。
要在Ubuntu系统上安装 glmark2,可以按照以下步骤进行操作:
-
打开终端(Terminal)应用程序。你可以通过按下
Ctrl+Alt+T快捷键来打开终端。 -
在终端中运行以下命令,以更新软件包列表和依赖关系:
sudo apt update
- 安装 glmark2 软件包:
法一:通过包管理器安装
sudo apt install glmark2
法二:通过源代码编译安转(kylin系统实操推荐)
首先,确保你的系统上安装了必要的编译工具和依赖项。通常需要安装 git、cmake、gcc、make 等工具,以及 OpenGL 开发库。
# 从它的 GitHub 仓库中克隆源代码:
git clone https://github.com/glmark2/glmark2.git
# 切换到打了tag的发布版本
cd glmark2
git checkout
git checkout xxx
# 查看安装说明
vim README
vim INSTALL
# 此处选择第二种安装方式
# 配置:一般用来测gl,配置选x11-gl
./waf configure --with-flavors=x11-gl
# 编译
./waf
# 安装
./waf install --destdir=DESTDIR
# 运行
glmark2
- 安装完成后,你可以在终端中运行
glmark2命令来启动 glmark2 基准测试程序。
glmark2 会执行一系列的图形测试,并显示性能得分和帧率等信息。你可以根据需要选择不同的测试选项,例如 glmark2、glmark2-es2 或 glmark2-es2-wayland 等。具体的选项可以通过运行 glmark2 --help 命令来查看。
请注意,在运行 glmark2 之前,确保你的系统已经安装了正确的显卡驱动程序,并且显卡支持所需的 OpenGL 版本。否则,可能会出现兼容性问题或无法运行的情况。
3. clpeak
clpeak 是一个用于评估 OpenCL 设备性能的工具,可以测试和比较不同 OpenCL 平台(如 GPU、FPGA 等)的性能。下面是下载、编译和安装 clpeak 的基本步骤:
- 下载
clpeak
你可以从 clpeak 的 GitHub 仓库下载源代码:
git clone https://github.com/krrishnarraj/clpeak.git
- 编译
clpeak
进入 clpeak 源代码目录,并执行以下步骤编译:
cd clpeak
mkdir build
cd build
cmake ..
make
这些命令依次做了什么:
cd clpeak: 进入clpeak源代码目录。mkdir build: 创建一个名为build的构建目录,用于在其中进行编译。cd build: 进入构建目录。cmake ..: 运行 CMake 以生成 Makefile。..表示 CMake 使用上级目录的CMakeLists.txt文件。make: 使用生成的 Makefile 编译clpeak。
- 安装
clpeak
clpeak 编译完成后,可以在构建目录中找到生成的可执行文件 clpeak。你可以选择将其复制到你喜欢的位置,例如 /usr/local/bin,以便全局访问:
sudo cp clpeak /usr/local/bin
- 运行
clpeak
完成安装后,可以通过简单运行 clpeak 命令来测试 OpenCL 平台的性能:
clpeak
这将列出系统中所有可用的 OpenCL 设备,并显示它们的性能指标,如运算性能、内存带宽等。
注意事项
- 确保你的系统已经安装了 OpenCL 运行时和驱动程序,以便
clpeak可以正确识别和测试设备。 - 如果你遇到编译问题或依赖错误,请根据系统和环境进行适当的调整和安装。
通过这些步骤,你应该能够成功下载、编译和安装 clpeak,并使用它来评估你的 OpenCL 设备的性能。
3. firmware固件
固件(Firmware) 是指嵌入到计算机硬件中的软件,它通常是操作硬件设备所必需的低级控制程序。固件在设备的内存中,通常是只读的(或可更新的),并且负责直接控制和管理硬件设备的功能。
固件程序段的内容:
-
引导程序(Bootloader):
- 这是固件的起始部分,负责初始化硬件和引导系统启动。它通常是设备开机时首先执行的程序。
-
驱动程序:
- 固件中包含了设备硬件的驱动程序,这些程序用于控制和操作硬件部件,比如处理器、内存、输入/输出接口等。
-
设备配置:
- 固件负责配置和初始化设备的各个部分,比如设置时钟频率、配置通信接口、调整电源管理等。
-
通信协议:
- 固件实现了设备与其他系统或设备之间通信的协议,例如串行通信、USB协议等。
-
应用逻辑:
- 某些固件还包含了设备的应用逻辑,例如在嵌入式系统中,固件可能实现了特定的功能如传感器数据处理或控制任务。
-
错误处理:
- 处理硬件或通信错误的机制,确保设备在出现问题时能够采取适当的措施,避免崩溃或数据丢失。
-
更新机制:
- 支持固件更新的功能,以便可以通过新的版本修复漏洞或增加新功能。
固件的作用:
-
硬件控制:
- 固件直接控制硬件设备的操作,确保硬件能够按预期运行。
-
系统启动:
- 负责设备的启动过程,包括加载操作系统或应用程序。
-
功能实现:
- 实现设备特定的功能,例如在打印机中控制打印任务,或在路由器中处理网络流量。
-
稳定性和兼容性:
- 确保硬件和软件的稳定性和兼容性,减少系统崩溃和错误发生的概率。
固件的设计和实现需要对硬件有深入的理解,因为固件必须与硬件紧密配合。
三、驱动包
1. Xorg中的三个包
xserver-xorg-video-amdgpu、
xserver-xorg-video-ati、
xorg-server
这里是对这三个包的详细说明:
-
xserver-xorg-video-amdgpu:这是一个 Xorg 服务器驱动程序包,用于支持基于 AMD GPU 的显卡设备。它提供了与 AMD 显卡硬件通信所需的功能和接口。 -
xserver-xorg-video-ati:这也是一个 Xorg 服务器驱动程序包,用于支持基于 ATI(现已归并入 AMD)GPU 的显卡设备。它提供了与 ATI 显卡硬件通信所需的功能和接口。然而,值得注意的是,从 Ubuntu 18.04 开始,AMDGPU 驱动已成为默认的开源驱动选择,因此在最新版本的 Ubuntu 中,xserver-xorg-video-ati包通常不再被推荐使用。 -
xorg-server:这是 X Window System 的服务器端实现,也被称为 Xorg 服务器。它是一个开源的图形显示服务器,负责管理输入设备(如键盘、鼠标)和输出设备(如显示器)之间的通信,以及处理图形渲染和窗口管理等任务。xorg-server提供了通用的框架和接口,使得各种显卡驱动程序能够与 Xorg 服务器进行交互,并提供图形显示功能。
联系:
xserver-xorg-video-amdgpu和xserver-xorg-video-ati都是 Xorg 服务器的显卡驱动程序包,它们旨在支持不同系列的 AMD 显卡设备。它们的目标都是提供适当的接口和功能,从而使 Xorg 服务器能够与相应的显卡硬件进行交互。xorg-server是 Xorg 服务器本身,它是一个通用的图形显示服务器,可以与多种显卡驱动程序进行配合。
区别:
xserver-xorg-video-amdgpu和xserver-xorg-video-ati针对的是不同的 AMD 显卡系列。前者主要支持新一代的 AMDGPU 驱动程序,后者则支持旧一些的 ATI 驱动程序。xserver-xorg-video-amdgpu和xserver-xorg-video-ati是作为 Xorg 服务器的插件或模块提供的,它们需要依赖xorg-server来运行。而xorg-server则是整个 X Window System 的核心组件。
本人工作中常用的三包区别:
- Linux kernel是操作系统的核心,负责所有硬件的管理;
- xorg-server是一个图形服务器,提供图形用户界面的基础;
- xserver-xorg-video-amdgpu是针对特定显卡(AMD)的驱动,负责图形输出和处理。
3. 火焰图 FlameGraph
火焰图(Flame Graph)是一种可视化工具,主要用于分析和展示程序运行时的采样数据,特别是用于CPU性能分析。通过火焰图,可以直观地看到程序的性能瓶颈,识别出占用大量CPU时间的代码路径。以下是分析火焰图结果的一些要点:
(1)理解火焰图的结构:
- X轴(水平轴):代表不同的代码路径或调用栈。每个矩形表示一个函数调用,宽度表示该函数在总样本中的比例。
- Y轴(垂直轴):代表调用栈的深度。下往上看,可以追踪一个函数是被哪些上层函数调用的,从而了解整个调用链条。
(2)热点识别:
- 火焰图最重要的应用是识别性能热点。如果某个矩形(函数调用)特别宽,说明该函数占用了较多的CPU时间,是一个潜在的性能瓶颈。
- 关注火焰图中最大的、最宽的“火焰”,这些通常是你需要优化的地方。
(3)颜色含义:
- 一般情况下,火焰图的颜色并没有特定的含义,只是为了区分不同的函数。
(4)过滤和聚焦:
- 大多数火焰图工具允许你对某些部分进行放大、过滤或者聚焦。这对于大型应用程序尤为重要,因为它们的火焰图可能非常复杂。
- 你可以通过这种方式专注于某个子树或者特定的代码路径,进行详细分析。
(5)结合代码分析:
- 在识别出性能热点之后,往往需要回到具体的代码中,检查相应的函数实现,寻找可能的优化点。
- 有时候,性能瓶颈可能是由于算法效率低下、资源争用、高频率的I/O操作等问题导致的,需要具体问题具体分析。
总之,通过火焰图,你可以直观地看到程序执行过程中各个函数所占用的CPU时间,从而找到性能瓶颈,进行针对性的优化。
在Kylin系统上运行火焰图的过程大致如下:
- 安装必要工具
首先,在Kylin系统上安装所需的性能分析工具和火焰图生成工具。以下是一些必要步骤:
(1)安装perf
perf是一个强大的Linux性能分析工具,通常在许多Linux发行版中都包含。
sudo yum install perf # 对于Yum-based系统,如CentOS
sudo apt-get install linux-tools-common linux-tools-generic # 对于Debian-based系统,如Ubuntu
(2)安装 FlameGraph
火焰图工具由Brendan Gregg开发,可以从GitHub获取。
git clone https://github.com/brendangregg/FlameGraph.git
- 收集性能数据
使用perf记录目标程序的性能数据。例如,如果你想分析一个名为my_program的程序:
sudo perf record -F 99 -a -g -- ./my_program
这会生成一个名为 perf.data 的文件,该文件包含了性能数据。
具体参数的含义如下:
- sudo: perf通常需要权限来获取系统性能数据。
- perf record: 表示要进行性能数据的记录。
- -F 99: 指定采样频率为99赫兹,即每秒进行99次采样。
- -a: 采集所有进程的数据,而不是只针对指定的进程。
- -g: 采集调用关系(Call Graph)信息,可以显示函数调用关系。
- -- ./my_program: 表示要执行的程序是"my_program",这里可以替换成你要监测的具体程序。
你可以根据自己的需求添加其他参数选项,例如:
- -p
: 只监测特定进程的性能数据。 - -e
: 监测指定的硬件事件,比如指令数、缓存访问等。 - -o
: 将输出保存到指定文件中,以便后续分析。
根据实际需求,你可以结合perf的文档或手册来了解更多参数选项,并根据需要进行配置。
- 生成火焰图
接下来,使用perf工具将性能数据转换为可以生成火焰图的格式。
sudo perf script > out.perf
然后,使用 FlameGraph 工具将 perf 数据转换为火焰图。
cd FlameGraph
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > flamegraph.svg
- 查看火焰图
生成的flamegraph.svg文件是一个SVG格式的火焰图,可以使用Web浏览器打开并查看。
xdg-open flamegraph.svg # 在Linux桌面环境下
示例总结
以下是完整的流程汇总:
# 1. 安装必要工具
sudo yum install perf
git clone https://github.com/brendangregg/FlameGraph.git
# 2. 收集性能数据
sudo perf record -F 99 -a -g -- ./my_program
# 3. 生成火焰图
sudo perf script > out.perf
cd FlameGraph
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > flamegraph.svg
# 4. 查看火焰图
xdg-open flamegraph.svg
注意事项
- 需要具有超级用户权限来运行
perf和其他一些性能分析工具。 - 确保目标程序在收集数据期间有足够的负载,以便生成有意义的火焰图。
4. 内核模块修改操作
此处主要讲命令sudo depmod -a、命令sudo update-initramfs -k uname -r -u和命令lsinitramfs /boot/intrd.img的作用及使用场景。
这三条命令分别是与 Linux 系统的内核模块和 initramfs (初始化文件系统) 相关的命令。每条命令的作用不同,但它们通常在某些操作系统更新或维护过程中一起使用,尤其是在内核更新后。让我们逐一分析它们的作用及使用场景:
(1)sudo depmod -a
作用:
depmod是一个工具,用于生成内核模块依赖关系表。它扫描当前系统的内核模块并生成一个文件,记录内核模块之间的依赖关系。这个依赖关系表通常保存在/lib/modules/$(uname -r)/modules.dep文件中。-a选项意味着生成所有模块的依赖关系。
何时使用:
- 通常在安装新的内核模块或内核版本时,运行此命令可以更新模块的依赖关系表。
- 如果你安装了新的驱动程序或编译了新的内核模块,你需要运行
depmod以确保内核能正确加载这些模块并解决它们之间的依赖。
(2) sudo update-initramfs -k \uname -r` -u`
作用:
update-initramfs是用于更新 initramfs(初始内存文件系统)镜像的工具。-k \uname -r`表示指定当前正在运行的内核版本(通过uname -r命令获取)。-u` 参数表示更新现有的 initramfs 镜像,而不是重新生成它。initramfs是一个包含必要驱动程序和配置文件的文件系统映像,在 Linux 启动时会加载到内存中,帮助系统引导。
何时使用:
- 当更新内核时,通常需要更新或重新生成 initramfs,以确保新的内核能够正确识别硬件并加载所需的驱动程序。
- 如果在内核中添加了新的模块,或者对系统做了更改(比如安装了新硬件驱动),你也可能需要使用
update-initramfs来更新 initramfs。
(3)lsinitramfs /boot/initrd.img
作用:
lsinitramfs命令用于列出 initramfs 文件内容。它可以查看initrd.img或initramfs镜像内的文件和目录结构。- 这个命令能帮助你验证 initramfs 中是否包含了你期望的文件,尤其是在你更新或更改了内核模块时。
何时使用:
-
你可能在检查或调试 initramfs 镜像的内容时使用此命令。如果你想确认某些文件是否正确包含在内存文件系统中,或者想查看引导过程中的文件结构,它非常有用。
-
这三条命令的连续使用场景:
在内核更新、模块添加或硬件更改后,通常会按以下顺序执行这些命令:
sudo depmod -a:首先更新内核模块的依赖关系表,确保新的或修改过的模块可以被正确加载。sudo update-initramfs -k \uname -r` -u`:接着更新 initramfs,确保它包含与当前内核兼容的驱动和配置。lsinitramfs /boot/initrd.img:最后,可以使用lsinitramfs命令来检查更新后的initramfs文件,确认相关文件是否正确存在。
总结:
这三条命令通常在内核更新后一起使用,目的是确保新内核和相关模块能够正确加载,并且系统能够使用最新的初始化文件系统镜像。
四、常见操作
1. 禁用集显
- 两种方式:
第一种,bios禁用集成显卡;第二种,修改grub配置文件(内核引导参数)禁集显。
前者是直接从硬件上禁用,使系统识别不到集显;后者是移除集显的驱动,使它无法加载,也可以达到禁用的目的。 - 具体操作:
- bios禁用集显:不同固件禁用操作略微不同,可自行百度。
样例:开机按delete进bios,进入display,选择显示优先顺序为独显。 - 修改内核引导参数禁用:
(法一,kylin服务器使用过)
- 首先确认台子存在集显和独显(其他显卡亦可)
lspci | grep VGA
- 查看集显具体信息
lspci -s 09:00.0 -vv
lspci -s 09:00.0 -vv 命令用于显示特定 PCI 设备的详细信息,包括其配置寄存器、驱动程序信息等。下面是该命令各部分作用:
lspci: 该命令用于列出系统中所有的 PCI 设备信息。-s 09:00.0: 指定要显示详细信息的 PCI 设备的地址。在这里,09:00.0是一个示例地址,实际使用时应根据系统中具体的 PCI 设备进行替换。-vv: 这是lspci命令的选项之一,用于显示更为详细的信息。每个-v选项增加一层详细程度,因此-vv表示显示更详细的信息。
- 查看此时运行的内核的命令行参数:
cat /proc/cmdline
- 修改内核引导参数,即grub配置:
vim /boot/efi/EFI/kylin/grub.cfg
在module_blacklist=phytium_mci_pci后添加内容"module_blacklist=phytium_mci amdit=0"(若有某一部分则该部分无需添加)(目的是将集显加入黑名单)
- 重启系统以应用新的内核引导参数,禁用集成显卡。
(法二,可能有效,没试过)
- 以管理员身份编辑配置文件。你可以使用以下命令打开 GRUB 配置文件进行编辑:
sudo vim /etc/default/grub
- 找到
GRUB_CMDLINE_LINUX_DEFAULT行,该行包含内核引导参数。将其修改为包含video=disconnected参数,例如:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=disconnected"
- 保存文件并关闭编辑器。然后更新 GRUB 配置,使更改生效。运行以下命令:
sudo update-grub
- 重启系统以应用新的内核引导参数,禁用集成显卡。
请记住,具体操作可能会因操作系统版本和配置而有所不同,建议在操作前做好备份并确保了解自己系统的相关信息。
2. 接串口看信息
- 用串口线(含3端:TX、RX、GND)接上主板上标有CPU_UART的三个针孔。
注意:一般情况下除了串口地线GND对应主板GND,其他两个反着接。即串口GND-主板GND,串口TX-主板RX,串口RX-主板TX。
注意:先确定串口位置和串口类型,主板间不一样。其中地线GND和主板电压想通,用万用表测没有电压差的即为GND针。
2. 串口一端接调试台的CPU_UART三个针孔,一端接主机(本人为windows),长度不够使用usb延长线。如图,串口使用的CH340 USB转TTL。
(龙芯:使用USB转RS232,需要下载对应该串口类型驱动)
4. 主板需要相应串口驱动,查看主机设备管理器,端口是否有“ USB-SERIAL CH340(COM4)”,括号对应主机的usb接口号。
主机ssh连接调试台,识别到端口后,通过修改ssh的属性信息使串口打印信息显示在ssh上,修改内容如下图:


5. 调试台关机。重新启动后能在ssh上修改的属性窗口看到相应的串口打印信息(如果打印信息较少,可能是没有打开系统的信息,方法可以百度尝试解决)
本次串口打印信息依次为:进入BIOS的信息、进入系统的信息(从”按下xx键进入“开始)
3. 将所有信息实时打印到串口
调试时系统卡死,重启后无法获取相关log,将信息实时打印到串口可得到一手消息(出问题的log记录)
要将内核信息加入到串口打印中,可以参考以下步骤:(龙芯+UOS系统接RS232串口实测)
法一:修改系统配置文件(永久生效)
修改 /etc/grub.d/10_linux 配置文件:
-
打开
/etc/default/grub文件,找到GRUB_CMDLINE_LINUX_DEFAULT行,并在其中添加一个参数console=ttyS0,115200n1 loglevel=7。这个参数指定了将系统控制台输出重定向到串口设备 ttyS0,波特率为 115200,并将log信息详细程度开到最大7。例如:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0,115200n1 loglevel=7" -
打开
/etc/grub.d/10_linux文件,找到linux_entry()函数,然后在函数中找到类似以下的代码块:(此步实测不需要)if [ -z "${recovery_mode}" ] ; then echo " linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}" else echo " linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro single ${args}" fi
在这个代码块中添加一个参数 console=ttyS0,115200n1,以便将输出重定向到串口设备。例如:
if [ -z "${recovery_mode}" ] ; then
echo " linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} console=ttyS0,115200n1"
else
echo " linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro single ${args} console=ttyS0,115200n1"
fi
保存文件并退出。
- sudo权限看
/boot/grub.cfg实际文件是否修改成功:
sudo su
vim /boot/grub.cfg
-
运行以下命令更新 grub 配置:
sudo update-grub -
重新启动系统,内核信息将会被输出到串口设备 ttyS0 中。如果你使用的是串口终端软件,可以通过该软件查看输出信息。
注意:请确保你的系统已经连接了串口设备,并且该设备已经正确设置。
法二:修改BIOS界面配置(本质相同,单次生效)
如图,按e进入编辑,此处一条一条的内容即为配置文件中menu_entry函数实现。
加入相关参数:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0,115200n1 loglevel=7"
Ctrl+s保存后登陆系统,即可见串口打印了内核等的相关信息。
4. 制作系统安装U盘
本人工作在windows上常用Refus工具、linux用dd命令去做系统启动盘。
基本操作过程如下:
Windows使用Refus工具
需要:u盘(提前保存内容,后续格式化)、系统镜像、refus工具、windows系统机器
操作:
- 打开Refus,选好如下图选项后开始制作,

- 完成后将U盘插入台子,BIOS设置启动顺序优先u盘,开始安装系统,安装好后拔出U盘重启即可。
linux使用dd命令
需要:U盘、系统镜像、linux系统机器
操作:
- 插U盘前后,用
df -h查看所有存储设备及其挂载点,从而确定 U 盘的设备路径(如/dev/sdX)。(命令lsblk或fdisk -l也可) - 如果你的u盘被分成多个分区了,你需要全部umount, 命令为
sudo umount /dev/sdb1 - 使用dd命令将镜像写入刚才找到的分区,注意:不用写分区号。
sudo dd if=/home/jack/ubuntu.16.04.iso of=/dev/sdb bs=4M
设置块大小为 4MB,有助于提高写入速度。
小技巧:你可以在另外一个终端观察运行情况。
sudo watch kill -USR1 $(pgrep ^dd)
解释一下:watch观察命令的运行,kill命令发送一段信号,-USR1是dd专用的信号,它接收到该信号,就会显示刻录的进度。 - 当刻录结束后,运行
sync
该命令是检查一下,刻录是否运行完毕,当sync结束后,就可以安全的拔出u盘了。(sudo eject /dev/sdX)
5. dd拷贝及磁盘认知
使用 dd 制作系统盘,确实是将整个系统镜像(通常是ISO文件或者现有的系统镜像)直接拷贝到U盘中。但是,这个过程不仅仅是简单的拷贝文件,它涉及到 启动区的创建,以及使U盘能够启动(即变成一个可引导的系统盘)。(与cp复制不同)
dd 制作启动盘的过程:
-
拷贝整个磁盘镜像:
- 使用
dd命令时,您将把整个磁盘(包括引导区、分区表、文件系统和数据)直接从源设备复制到目标设备(如U盘)上。也就是说,它会将 引导区、分区表、操作系统等一并复制。 - 示例命令:
其中sudo dd if=/path/to/iso of=/dev/sdX bs=4M status=progress/dev/sdX是U盘的设备路径,/path/to/iso是您的镜像文件路径。
- 使用
-
启动区操作:
dd会拷贝镜像文件中的 引导扇区(MBR 或 GPT)到U盘的相应位置。如果镜像本身是一个可引导的操作系统(例如 Linux 或 Windows 安装盘的ISO文件),dd会将这个启动引导程序直接写入U盘,使其具备启动能力。- 这意味着,
dd本身会处理好启动区的配置,无需额外操作。
-
对U盘进行引导设置:
- MBR(主引导记录):如果目标镜像是传统的 BIOS 启动模式,
dd会将 MBR 引导扇区复制到 U盘的开始部分,这使得U盘能够被系统识别并从中启动。 - GPT(GUID分区表):如果是 UEFI 启动模式,
dd会将 GPT 分区表复制到 U盘,同时也会复制 EFI 启动文件。
- MBR(主引导记录):如果目标镜像是传统的 BIOS 启动模式,
-
注意事项:
- 设备路径:确保
of=/dev/sdX指定的是 U盘的正确设备路径,不要指定某个分区(如/dev/sdX1),否则会导致数据丢失。 - 数据覆盖:
dd会把目标设备的所有内容完全覆盖,因此务必确认你选择了正确的设备,否则可能会意外擦除其他重要数据。
- 设备路径:确保
其中:
磁盘通常包括以下几个主要部分:
-
引导区(Boot Sector):
- 作用:引导区是磁盘的最前端区域,存储着启动操作系统所必需的引导信息。在电脑启动时,BIOS会读取引导区的信息,以确定操作系统的位置并加载其引导程序。常见的引导区包括MBR(主引导记录)和GPT(GUID分区表)。
-
分区表(Partition Table):
- 作用:分区表存储磁盘上各个分区的信息,包括每个分区的起始位置、大小和类型等。通过分区表,操作系统知道如何访问磁盘上的不同区域。常见的分区表格式有MBR和GPT。MBR通常支持最多4个主分区,而GPT则支持更多分区。
-
文件系统(File System):
- 作用:文件系统管理磁盘空间并提供文件存储、检索的方式。它定义了如何将数据存储到磁盘上,包括文件的命名、存储位置、访问控制等。常见的文件系统包括FAT32、NTFS(Windows系统常用)、ext4(Linux系统常用)等。
-
数据区(Data Area):
- 作用:数据区是磁盘上用来存储实际用户数据的区域,包括文件、文件夹、程序等。文件系统会在数据区中创建文件存储结构(如文件分配表、inode等),以便于对文件进行存储和访问。
总结一下:
- 引导区负责存储启动信息;
- 分区表管理磁盘的分区布局;
- 文件系统决定如何组织和存储文件;
- 数据区存储实际的用户数据和文件。
6. ip配置注意事项
- IP地址冲突检查
检查IP地址是否与其他设备冲突
arp -a | grep <IP地址>
如果输出中有对应的MAC地址,则表示存在IP地址冲突。
- ssh服务检查(client和server安装、开机自启动)
- 检查ssh的client和server是否安装,否则不能互ping通:
apt list | grep ssh
- 检查SSH服务是否安装并默认启动:
sudo systemctl status ssh
如果SSH正在运行,您将看到类似以下输出:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-05-12 10:12:59 PDT; 1 day 2h ago
Main PID: 1234 (sshd)
Tasks: 1 (limit: 4635)
CGroup: /system.slice/ssh.service
└─1234 /usr/sbin/sshd -D
要检查SSH是否设置为开机自启动,可以使用以下命令:
sudo systemctl is-enabled ssh
如果已经设置为开机自启动,会看到输出 enabled;没有则会看到输出 disabled。
将SSH设置为开机自启动:
sudo systemctl enable ssh
- network服务重启
ip配置好后需要重新network:
sudo systemctl restart network/networking
- 防火墙状态检查
图像界面看防火墙设置是否关闭。下面命令方法暂未验证。
sudo systemctl status firewalld
如果防火墙已关闭,则输出将显示 inactive。
- 网络配置文件静态IP配置检查
检查网络配置文件中是否配置了静态IP地址.
kylin系统:
# /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
其他系统可尝试:(未验证)
cat /etc/sysconfig/network-scripts/ifcfg-<接口名称>
这将显示指定接口的配置信息。检查是否有 BOOTPROTO=static 行以及相应的IP地址配置。
- 网口状态检查
以上事项都没问题但不能互ping通,则考虑是不是网口坏了,换换网线、网口。 - 互ping通但xshell连不上
排除xshell问题后,图像界面切换成单/多用户模式,则能连上。(龙芯+uos遇到过,暂不清楚原因)
# 单次切换
sudo systemctl isolate multi-user.target
# 默认自启动
sudo systemctl set-default multi-user.target
- 相关ip配置命令
(1)可设置ip(未深入了解)
ifconfig <网口名如eth0> <IP地址>
另:补充 S5000C 服务器外网可连接,内网无法连接的处理:
(1)检查网络服务状态:使用命令 systemctl status network 查看 network.service 的状态,确认网络服务是否正常运行。如果服务未启动,执行 systemctl start network 来启动网络服务后依旧为未激活。
(2)定位网口号:
直接插拔网线测试
1)选一个物理网口,插拔网线(或交换机侧重启端口)。
2)立刻在服务器执行:
ip addr | grep -E 'state|link/ether'
3)观察哪个网卡的 state 或 NO-CARRIER 状态变化 → 变化的网卡就是刚操作的物理网口。
(3)修改配置文件
1)Kylin 系统网卡配置文件一般在 /etc/sysconfig/network-scripts/ 目录,比如 ifcfg-eth0 ( eth0 是网卡名,实际以服务器为准,可用 ip addr 确认)。
用命令打开查看:
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
2)关键配置项检查
确保以下核心配置正确(需和内网环境匹配):
BOOTPROTO=static # 或 dhcp,根据内网分配方式;若静态,需配 IP、网关等
IPADDR=172.18.x.x # 内网实际 IP,需和网关在同一网段
NETMASK=255.255.x.x # 子网掩码
GATEWAY=172.18.x.x # 内网网关地址
DNS1=172.18.x.x # 内网 DNS(可选,按需配)
ONBOOT=yes # 开机启动网卡
若有多网卡,避免配置冲突;若用 dhcp ,确保 DHCP 服务器正常,可注释静态配置测试自动获取。
(4)桌面网络设置选择对应网口号,检查ip、网关是否正常,重启网络即可。
7. linux系统 - 单/多用户模式、图形界面(GUI)
在Linux系统中,单用户模式通常用于系统维护和故障排除,而多用户模式是正常的运行状态,允许多个用户同时登录系统,通常具有网络和其他服务的支持。
- 进入多用户模式
(1)单次切换 多用户目标:sudo systemctl isolate multi-user.target
(2)默认开机自启动 多用户模式:
bash sudo systemctl set-default multi-user.target
2. 进入单用户模式
(1) 单次切换 单用户模式:
bash sudo systemctl isolate rescue.target
(2)默认开机自启动 单用户模式(未验证)
bash sudo systemctl set-default rescue.target
3. 进入系统的图形界面(GUI)
(1)单次切换 图像界面
bash sudo systemctl isolate graphical.target
(2)默认开机自启动 图形界面
bash sudo systemctl set-default graphical.target
8. GDB调试Xorg
分析驱动代码xorg时,常结合gdb调试,常用方式有(sudo gdb -p pidof Xorg)和(sudo gdb /usr/lib/xorg/Xorg`)。
GDB具体使用见GDB调试
以下着重讲二者区别:
两种调试方式的区别在于如何指定被调试的进程和可执行文件:
-
sudo gdb -p
pidof Xorg:- 这种方式是通过进程ID(PID)来调试正在运行的进程。具体步骤是:
pidof Xorg命令会返回 Xorg 进程的 PID。sudo gdb -p <PID>将以超级用户权限启动 GDB,并附加到指定 PID 的进程(这里是 Xorg)上进行调试。
- 这种方式适合于已经在运行中的 Xorg 进程,例如,在桌面环境中。
- 这种方式是通过进程ID(PID)来调试正在运行的进程。具体步骤是:
-
sudo gdb /usr/lib/xorg/Xorg:
- 这种方式是直接调试可执行文件本身,而不是正在运行的进程。具体步骤是:
sudo gdb /usr/lib/xorg/Xorg将以超级用户权限启动 GDB,并加载指定的 Xorg 可执行文件。- 这样做允许你在还没有启动 Xorg 或者无法直接进入桌面环境时调试 Xorg 的执行文件。
- 这种方式是直接调试可执行文件本身,而不是正在运行的进程。具体步骤是:
区别总结
-
通过进程ID调试 (
sudo gdb -ppidof Xorg`):- 适用于已经在运行中的进程。
- 可以直接查看和调试当前正在进行的动态行为。
- 需要确保你有足够的权限来附加到目标进程。
-
直接调试可执行文件 (
sudo gdb /usr/lib/xorg/Xorg):- 适用于调试还未启动或者无法直接访问的进程(例如,Xorg 在某些情况下可能无法直接启动或者会直接进入桌面环境)。
- 允许你在启动之前设置断点和进行其他调试准备工作。
- 需要知道可执行文件的确切路径,并确保你有权限访问该文件。
9. ccache提高编译速度
ccache 是一个编译缓存工具,用于加速 C/C++ 编译过程。它通过缓存之前编译过的代码的结果,避免重复编译相同的代码,从而提高编译速度和效率。以下是 ccache 的主要功能和特点:
-
缓存编译结果:
ccache会缓存编译的结果,以便在相同的源代码、编译器选项和预处理器宏条件下,重新编译时可以直接使用缓存中的结果,而不必重新编译。 -
加速编译:通过重用缓存的编译结果,
ccache可以显著减少编译时间,特别是在大型项目中,减少编译时间对开发效率的提升非常明显。 -
透明集成:
ccache可以与现有的编译工具链(如gcc、clang等)透明集成,只需将编译器调用替换为ccache gcc或ccache clang,就能启用缓存功能。 -
配置灵活:
ccache提供了多种配置选项,如缓存大小、缓存清理策略等,可以根据项目需求进行调整。 -
统计和分析:
ccache可以生成编译统计信息,帮助用户了解缓存的命中率、缓存的使用情况等,以便优化编译流程。
要使用 ccache,通常需要先安装它,然后配置编译系统使用 ccache 作为编译器的前置程序(本人实际修改驱动makefile.linux.def文件配置)。例如:
export CC="ccache gcc"
export CXX="ccache g++"
这将使得 ccache 在调用 gcc 和 g++ 时生效,自动处理缓存。
五、配置文件
1. ~/.config/ukui-kwinrc
~/.config/ukui-kwinrc 文件是 UKUI 桌面环境 中用于配置 KWin 窗口管理器的设置文件。
UKUI 桌面环境(Ubuntu Kylin 用户界面)是基于 KDE 和 Qt 技术;
KWin 是 KDE 桌面环境的窗口管理器。
配置项解释:
-
AutoBackend
- 这个配置项决定是否自动选择并启用适合的后端(Backend)来处理窗口的渲染和管理。一般来说,这种配置用于让系统根据硬件和软件条件自动选择最佳的渲染后端。
- 典型的值为
true或false,如果设置为true,则系统会自动选择合适的后端;如果设置为false,则需要手动配置后端。
-
Backend
Backend配置项允许用户手动指定使用的渲染后端。这个后端决定了窗口管理和渲染的方式。例如,可能的后端包括 OpenGL(硬件加速的渲染)或 XRender(较为传统的软件渲染方式)。- 设置具体的后端通常是为了在特定硬件或软件环境中优化性能或者解决兼容性问题。常见的值包括:
OpenGL:硬件加速渲染,提供更流畅的图形效果。XRender:较为传统的渲染后端,通常用于较旧的硬件或不支持 OpenGL 的环境。
** 总结:**
- AutoBackend 控制是否让系统自动选择渲染后端。
- Backend 允许用户手动指定渲染后端(如 OpenGL 或 XRender)。
这些配置项有助于在不同的硬件和环境下优化窗口管理和渲染性能。
更改配置项
sudo vim ~/.config/ukui-kwinrc
要使更改生效,需要重新启动 KWin 窗口管理器或重新启动整个桌面会话。
可以使用以下方法:
- (1)重新启动 KWin:
kwin_x11 --replace &
这个命令会重新启动 KWin 窗口管理器,加载新的配置。
- (2)重新启动桌面会话:
直接注销并重新登录桌面会话,配置将自动生效。
- (3)重新启动整个系统:
如果你希望确保所有设置完全生效,可以选择重新启动计算机。
2. 开机自启动脚本
为了确保在系统启动时执行脚本,而不需要用户登录,我们通过调整 systemd 服务配置来实现:
使用 systemd 服务(无需登录用户)
-
创建或编辑
systemd服务文件/etc/systemd/system/startup_script.service,使用 root 权限。sudo nano /etc/systemd/system/startup_script.service -
在文件中输入以下内容:
[Unit] Description=Custom Startup Script After=network.target [Service] Type=oneshot ExecStart=/bin/bash -c "cd /home/your_user/200 && ./go.sh && source link.sh && service lightdm restart" WorkingDirectory=/home/your_user/200 # 可选项, 确保你在正确的目录运行脚本 User=root # 使用 root 用户执行 Environment=HOME=/root # 设置根目录环境变量(如果是 root 用户) RemainAfterExit=true [Install] WantedBy=multi-user.target解释:
After=network.target:确保脚本在网络服务启动后执行。multi-user.target是一个常见的启动目标,但network.target可以确保你的脚本在网络环境就绪后开始运行。User=root:确保脚本使用 root 用户执行,因此不需要登录任何用户。WorkingDirectory:设置脚本执行时的工作目录(根据实际情况调整路径)。Environment=HOME=/root:设置环境变量HOME为/root,如果你使用的是 root 用户。RemainAfterExit=true:确保即使脚本执行完毕,systemd 仍然认为服务正在运行。
-
保存并退出编辑器。
-
重新加载
systemd配置并启用该服务,使其在系统启动时执行:sudo systemctl daemon-reload sudo systemctl enable startup_script.service -
如果需要立即启动服务以进行测试,可以运行:
sudo systemctl start startup_script.service -
检查服务状态,确保没有错误:
sudo systemctl status startup_script.service -
重新启动计算机,确认脚本是否按预期执行。
sudo reboot
** 总结:**
User=root确保服务在没有用户登录的情况下以 root 权限运行。After=network.target保证脚本在网络可用后启动。
这种方法可以确保在系统启动时自动运行指定的脚本,而不需要登录任何用户。
六、行业认知
1. 主流BIOS制造商
国内主流的 BIOS 制造商包括以下几家:
-
华硕(ASUS):华硕是一家知名的计算机硬件制造商,也生产主板和 BIOS。
-
技嘉(GIGABYTE):技嘉是一家台湾的电脑硬件制造商,在主板领域有一定的市场份额,也生产 BIOS。
-
微星(MSI):微星是一家全球知名的电脑硬件制造商,主要生产主板、显卡等硬件,并提供 BIOS 支持。
-
华擎(ASRock):华擎是主板制造商,也提供相应的 BIOS 产品。
目前可以说不管是御三家(华硕、技嘉、微星)、华擎、映泰台系主板厂商还是国内主板厂商基本上都选择了基于AMI BIOS研发自家的BIOS UI界面(主题外观)和交互逻辑(参数设置调教)。
详细文章可参考:主流BIOS制造商相关介绍
这些厂商在主板行业有一定影响力,他们生产的主板通常配备有各自定制的 BIOS。值得注意的是,随着技术的发展,UEFI 替代 BIOS 的趋势逐渐明显,越来越多的主板使用 UEFI 替代传统的 BIOS。
关于UEFI和BIOS,总的来说,UEFI 相对于传统的 BIOS 具有更快的启动速度、更大的硬盘容量支持、图形化用户界面、更好的安全性功能以及更强的扩展性。
详细文章可参考:如何以简单正确的姿势理解“UEFI”和“BIOS”
2. 窗口管理器 kwin、mutter、marco
-
KWin:KWin是KDE桌面环境的默认窗口管理器,它负责管理窗口的布局、外观、动画效果等。KWin提供了丰富的窗口管理功能,包括窗口最大化、最小化、拖放、工作区切换等,同时也支持丰富的插件和扩展功能。
-
Mutter:Mutter是GNOME桌面环境的默认窗口管理器,它负责管理窗口的显示、布局、交互等。Mutter使用Clutter库来实现硬件加速的图形渲染,同时也支持Wayland显示协议。
-
Marco:Marco是MATE桌面环境的默认窗口管理器,它提供了基本的窗口管理功能,包括窗口装饰、移动、调整大小等。Marco旨在提供简洁而稳定的窗口管理体验,适合对性能要求较低的环境使用。
这些窗口管理器在不同的桌面环境中扮演着类似的角色,它们负责管理窗口的外观和行为,以及用户与窗口的交互。
参考来源
- dd命令使用:linux下使用dd命令写入镜像文件到U盘

浙公网安备 33010602011771号