Skip to content

Latest commit

 

History

History
508 lines (344 loc) · 25.8 KB

kernel.md

File metadata and controls

508 lines (344 loc) · 25.8 KB

kernel

The Linux Kernel documentation

linux内核源码

DebianKernel

内核源码结构

内核源码在线阅读

Linux 0.11

启动过程

grub

grub doc

grub命令

grub串口

将GRUB输出重定向到串口步骤如下:

  1. 同时启用图形终端和串行终端,并设置了串行终端的参数

    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 菜单和启动过程。

  2. 最大程度开启grub调试信息

    grub-editenv /boot/grub/grubenv set debug=all
  3. 更新 GRUB 以应用更改

    update-grub

grub源码

BIOS, UEFI, MBR, GPT, 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_init

    initcall_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.

日志级别

dynamic debug

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

printk

内核 Makefile config

Makefile kbuild

defconfig

clean

  • linux内核配置清理make clean

    make clean      # 删除大多数的编译生成文件, 但是会保留内核的配置文件.config, 还有足够的编译支持来建立扩展模块
    make mrproper   # 删除所有的编译生成文件, 还有内核配置文件, 再加上各种备份文件
    make distclean  # mrproper删除的文件, 加上编辑备份文件和一些补丁文件

编译内核deb包

在 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:

linux-perf deb

在deepin 23上构建 linux-perf deb包

在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.55
dpkg-buildpackage -b -nc -uc -us -j16

内核调试包

内核模块

KBUILD_EXTRA_SYMBOLS

dkms

ASLR

内核 C 语言

likely和unlikely

内核section

内核链表

启动流程

0号进程,1号进程,2号进程

根文件系统rootfs

initramfs

initrd 和 initramfs
制作initramfs
initramfs解压
lsinitramfs

do_initcalls

cpu调频

系统调用

ERESTARTSYS

open openat

uid和euid

其它