Aprender el kernel de Linux es el sueño de muchos programadores. Los errores del kernel a menudo causan tiempo de inactividad del sistema. Es difícil mantener la escena en el momento del error. Para el desarrollo del kernel de Linux y la depuración de controladores, es necesario un entorno de depuración de dos computadoras KGDB se encuentra en la versión 2.6.26 del kernel y está formalmente soportado, lo que puede facilitar la depuración del kernel y del controlador.
Preparación preliminar
1. máquina virtual vmware, instale el sistema operativo centos6 (kernel versión 2.6.32), que es más adecuado para aprender kernel de versión baja
2. Instale la cadena de herramientas de desarrollo sudo yum groupinstall "Herramientas de desarrollo"
3. Instale ncurses: sudo yum install ncurses- devel porque make menuconfig depende de ncurses
Compila el kernel
Descomprima el código del kernel de Linux, ingrese al directorio fuente, ejecute: make menuconfig
Kernel Hacking -->
(1)选中Compile the kernel with frame pointers
(2)去掉Write protect kernel read-only data structures(否则不能用软件断点)
清理以前的编译痕迹(如果需要)
make mrproper
make clean
编译内核:
make -j4 bzImage
La compilación generará un archivo bzImage, que corresponde al archivo vmlinuz en el directorio / boot, que es un archivo de kernel comprimido. El sistema operativo se puede ejecutar solo después de que el archivo se descomprima en la memoria durante la carga de inicio.
编译内核模块:
make -j4 modules
Cuando el kernel se está ejecutando, además del archivo del kernel, también necesita cargar algunos módulos periféricos (como controladores) para ejecutarse.
Instalar kernel y módulos
Instale el módulo del kernel: make modules_install
instala el módulo del kernel compilado en el paso anterior, que generalmente se instala en el directorio / lib / modules.
Instalar el kernel: make install
[root@localhost linux-2.6.32.27]# make install
sh /root/build/linux-2.6.32.27/arch/x86/boot/install.sh 2.6.32.27 arch/x86/boot/bzImage \
System.map "/boot"
ERROR: modinfo: could not find module xt_CHECKSUM
ERROR: modinfo: could not find module nf_defrag_ipv6
ERROR: modinfo: could not find module vmware_balloon
ERROR: modinfo: could not find module vmwgfx
Estos errores pueden ignorarse.
生成initrd.img
mkinitrd /boot/initrd-2.6.32.27.img 2.6.32.27
Arrancar nuevo kernel
Reinicie el sistema y seleccione el elemento de inicio del kernel que acabamos de compilar. Después de reiniciar, encontramos:
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32.27 #1 SMP Fri Mar 12 17:47:47 CST 2021 i686 i686 i386 GNU/Linux
El kernel se ha actualizado
Configurar la depuración de máquina dual
Tome una instantánea de la máquina virtual, cree una nueva máquina basada en la instantánea y utilícela para la máquina de destino.
Agregue un puerto serie al destino (primero retire el dispositivo de la impresora)
y agregue un puerto serie a la máquina de desarrollo (primero retire el dispositivo de la impresora)
Modificar el archivo grub
Inicie la máquina de destino, modifique el archivo grub
[root@localhost ~]# cat /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32.27)
root (hd0,0)
kernel /vmlinuz-2.6.32.27 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=128M rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet kgdboc=ttyS0,115200 kgdbwait
initrd /initramfs-2.6.32.27.img
title CentOS 6 (2.6.32-754.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=128M rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-754.el6.i686.img
kgdboc = ttyS0,115200: use ttyS0, velocidad en baudios 115200
kgdbwait: haga que el kernel espere la conexión gdb durante el proceso de inicio. Luego reinicie el destino, el sistema se detendrá en kgdbwait, esperando la conexión gdb en el lado del host.
Después de modificar el archivo grub, reinicie el sistema, el sistema permanecerá en:
Inicie la máquina de desarrollo para la depuración, ingrese al directorio de compilación del kernel y ejecute gdb ./vmlinux
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
kgdb_breakpoint (new_kgdb_io_ops=0xc0a0b7d8) at kernel/kgdb.c:1721
1721 wmb(); /* Sync point after breakpoint */
(gdb) c (继续运行)
Si la máquina de destino ingresa al sistema y luego quiere volver al modo de depuración: ejecute en la máquina de destino: echo g> / proc / sysrq-trigger