- 品读 Linux 0.11 核心代码
- Linux内核完全注释(修正版v3.0).pdf
- 调试 Linux 最早期的代码
- Linux-0.11操作系统源码调试-在 Ubuntu22 上
- https://github.com/yuan-xy/Linux-0.11
- GNU GRUB Manual 2.12
- 6.1 Simple configuration handling /etc/default/grub
- 17.3.1 serial
- 15 GRUB environment variables
- 配置Grub2实现串口终端控制Linux系统
- Linux串口调试配置_GRUB串口通信_串口登陆
- 针对于grub的让开机信息重定向输出到串口上(内含精简操作指南)
- FT2000+模块在麒麟系统下串口输出功能调试
将GRUB输出重定向到串口步骤如下:
-
同时启用图形终端和串行终端,并设置了串行终端的参数
1 # Generated by deepin-installer vim /etc/default/grub 2 GRUB_BACKGROUND="/boot/grub/themes/deepin-fallback/background.jpg" 3 GRUB_CMDLINE_LINUX_DEFAULT="video=efifb:nobgrt splash ignore_loglevel initcall_debug acpi.debug_layer=0x2 acpi.debug_level=0xffffffff no_console_suspend console=tty console=ttyAMA0,115200 dyndbg='module snd_soc_pmdk_dp +p; file *usb* +p' plymouth.ignore-serial-consoles" 4 GRUB_DEFAULT=0 5 GRUB_DISTRIBUTOR="`/usr/bin/lsb_release -d -s 2>/dev/null || echo Deepin`" 6 GRUB_THEME="/boot/grub/themes/deepin-fallback/theme.txt" 7 GRUB_TIMEOUT=5 8 GRUB_GFXMODE= 9 DEEPIN_GFXMODE_DETECT=1 10 GRUB_TERMINAL="console serial" 11 GRUB_SERIAL_COMMAND="serial --speed=115200 efi0 --word=8 --parity=no --stop=1"
在这个 GRUB 配置中,你配置了同时启用图形终端和串行终端,并设置了串行终端的参数。具体解释如下:
第 10 行 (GRUB_TERMINAL="console serial"): 这一行指示 GRUB 同时启用图形终端和串行终端。这意味着 GRUB 将能够在本地控制台(图形终端)和串行控制台(通过串行端口)上进行交互。
第 11 行 (GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"): 这一行配置了串行终端的参数。具体的参数设置如下:
- --speed=115200:串行通信的波特率设置为 115200 比特每秒。
- --unit=0:串行端口的编号或单元号设置为 0,通常对应于 /dev/ttyS0 或 /dev/ttyAMA0,这是第一个串口。但比如loongarch、ft2000机器, 串口可能注册为了别的名字, 比如efi0。
- --word=8:数据位设置为 8 位。
- --parity=no:不使用奇偶校验。
- --stop=1:停止位设置为 1 位。
这个配置表明 GRUB 将同时在图形终端和串行终端上操作,并且串行终端的参数已设置为常见的串口通信配置。如果你的系统具有串行控制台(例如通过串口连接到终端服务器),这个配置允许你在本地和远程两个终端上查看 GRUB 菜单和启动过程。
-
最大程度开启grub调试信息
grub-editenv /boot/grub/grubenv set debug=all -
更新 GRUB 以应用更改
update-grub
-
The kernel's command-line parameters
initcall_debug no_console_suspend ignore_loglevel initcall_blacklist=phytium_spi_driver_init module_blacklist=spi_phytium_plat dyndbg='module phytium_dc_drm +p; module snd_soc_phytium_i2s +p; module snd_soc_pmdk_es8388 +p; module snd_soc_pmdk_es8336 +p; module snd_soc_pmdk_dp +p; file *usb* +p' -
grub中不加载某个驱动
initcall_blacklist=phytium_spi_driver_initinitcall_blacklist= [KNL] Do not execute a comma-separated list of initcall functions. Useful for debugging built-in modules and initcalls.module_blacklist= [KNL] Do not load a comma-separated list of modules. Useful for debugging problem modules.
dyndbg="QUERY", module.dyndbg="QUERY", or ddebug_query="QUERY"三者的区别?
If foo module is not built-in, foo.dyndbg will still be processed at boot time, without effect, but will be reprocessed when module is loaded later. dyndbg_query= and bare dyndbg= are only processed at boot.
-
foo.dyndbg:
如果 foo 模块不是内核的一部分,而是在运行时可加载的模块,foo.dyndbg 的设置会在系统启动时被处理,但在此时不会产生实际效果。这是因为 foo 模块尚未加载,所以动态调试设置在这个时候并不影响任何东西。
当稍后加载 foo 模块时,foo.dyndbg 的设置会被重新处理并生效。因此,动态调试设置在模块加载后才真正生效。
-
dyndbg_query= 和 dyndbg=:
这两种设置(全局动态调试设置)只在系统启动时被处理,而不会在系统运行时重新处理。一旦系统进入运行状态,这些设置就不再生效。
这意味着如果你想要在系统运行时动态调整调试设置,你应该使用模块特定的设置,比如 foo.dyndbg,而不是全局设置。
综合来说,foo.dyndbg 在系统启动时会被处理,但不会在 foo 模块加载前生效。而 dyndbg_query= 和dyndbg= 这两种设置只在系统启动时生效,进入系统后不再生效。
在grub中新增 dyndbg 参数:
dyndbg='module phytium_dc_drm +p; module snd_soc_phytium_i2s +p; module snd_soc_pmdk_es8388 +p; module snd_soc_pmdk_es8336 +p; module snd_soc_pmdk_dp +p; file *usb* +p'update-grub进入系统后:
echo 'module phytium_dc_drm +p; module snd_soc_phytium_i2s +p; module snd_soc_pmdk_es8388 +p; module snd_soc_pmdk_es8336 +p; module snd_soc_pmdk_dp +p; file *usb* +p' > /sys/kernel/debug/dynamic_debug/control-
linux kernel: defconfig和.config
make savedefconfig
-
make clean # 删除大多数的编译生成文件, 但是会保留内核的配置文件.config, 还有足够的编译支持来建立扩展模块 make mrproper # 删除所有的编译生成文件, 还有内核配置文件, 再加上各种备份文件 make distclean # mrproper删除的文件, 加上编辑备份文件和一些补丁文件
在 Linux 内核构建过程中,make deb-pkg 和 make bindeb-pkg 是用于生成 Debian 包的两个目标。这两个目标的主要区别在于生成的 Debian 包的内容和形式:
make deb-pkg:
- 这个目标生成的是一个包含完整内核源代码、配置文件和构建所需的所有内容的 Debian 源码包(source package)。
- Debian 源码包一般包括
linux-<version>.tar.xz源码压缩包、debian/ 目录中的维护文件以及其他构建所需的文件。这个包允许其他人在其系统上重新构建内核。 - 也包含
make bindeb-pkg产物。
make bindeb-pkg:
-
这个目标生成的是一个包含已编译内核二进制文件、头文件、模块、配置文件等内容的 Debian 二进制包(binary package)。
-
Debian 二进制包的形式为
linux-image-<version>_<architecture>.deb。这个包通常用于直接在 Debian 或基于 Debian 的系统上安装内核二进制文件,而不需要重新构建整个内核。
在debian12中下载内核源码:
apt source linux=6.1.55-1将内核原源码拷贝到deepin 23上:
rsync -avzP linux-6.1.55 wujing@10.20.53.48:~/code/linux-6.1.55-1在deepin 23 上构建deb包(包含 linux-perf):
cd code/linux-6.1.55-1/linux-6.1.55dpkg-buildpackage -b -nc -uc -us -j16- Ubuntu Debug Symbol Packages
- Linux内核调试的方式以及工具集锦
- 如何下载或安装 RHEL 系统的内核调试信息包?
- Linux 之十八 Ubuntu 22.04 配置内核版本、GRUB 引导、远程桌面、包后缀(-dev、-dbg等)
- (转载)ubuntu 安装 dbgsym (debug-info)
- dpkg-buildpackage error
-
Linux内核驱动学习-编写最简单Linux内核模块HelloWorld
KVERS = $(shell uname -r) # Kernel modules obj-m += hello.o # Specify flags for the module compilation. #EXTRA_CFLAGS=-g -O0 build: kernel_modules kernel_modules: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
-
make CONFIG_SPI_PHYTIUM_PLAT=m -C /data3/home/yuanqiliang/code/arm-kernel-5.10/kernel M=/data3/home/yuanqiliang/code/arm-kernel-5.10/kernel/drivers/spi modules
- 玩转内核链表list_head,教你管理不同类型节点的实现,建议收藏
- Linux内核中经典链表 list_head 常见使用方法解析
- Linux内核中的常用宏container_of其实很简单
- Linux内核中container_of的原理及其使用详解
- Linux 内核 hlist 详解
- hlist用法以及hlist_for_each_entry 使用举例
- Linux 驱动开发 二:module_init机制
- initcall 机制
- linux内核中do_initcalls函数的执行逻辑分析
- initcall_debug来查看开机慢问题
- Linux 各种 initcall 的调用原理
- 【Linux内核源码分析】initcall机制与module_init
-
安装 POSIX 系统帮助手册:
sudo apt-get install manpages-posix-dev
查看所有系统调用:
man syscalls
查看open系统调用:
man open man 2 open