Depuración de equipo dual de desarrollo de kernel de Linux (KGDB)

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)
Depuración de equipo dual de desarrollo de kernel de Linux (KGDB)
y agregue un puerto serie a la máquina de desarrollo (primero retire el dispositivo de la impresora)
Depuración de equipo dual de desarrollo de kernel de Linux (KGDB)

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:
Depuración de equipo dual de desarrollo de kernel de Linux (KGDB)

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

Supongo que te gusta

Origin blog.51cto.com/14207158/2657966
Recomendado
Clasificación