리눅스 커널을 배우는 것은 많은 프로그래머의 꿈입니다. 커널 오류는 종종 시스템 다운 타임을 유발합니다. 오류 발생 당시의 상황을 유지하기가 어렵습니다. Linux 커널 개발 및 드라이버 디버깅을 위해 듀얼 컴퓨터 디버깅 환경은 다음과 같습니다. 일반적으로 필요합니다. KGDB는 커널 버전 2.6.26에 있으며 공식적으로 지원되어 커널 및 드라이버의 디버깅을 용이하게 할 수 있습니다.
예비 준비
1. vmware 가상 머신, 낮은 버전 커널 학습에 더 적합한 centos6 운영 체제 (커널 버전 2.6.32)
설치 2. 개발 도구 체인 설치 sudo yum groupinstall "개발 도구"
3. ncurses 설치 : sudo yum install ncurses- make menuconfig가 ncurses에 의존하기 때문에 devel
커널 컴파일
리눅스 커널 코드의 압축을 풀고 소스 디렉토리에 들어가서 다음을 실행하십시오 : 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
컴파일은 압축 된 커널 파일 인 / boot 디렉토리의 vmlinuz 파일에 해당하는 bzImage 파일을 생성합니다. 운영 체제는 부팅로드 중에 파일이 메모리로 압축 해제 된 후에 만 실행할 수 있습니다.
编译内核模块:
make -j4 modules
커널이 실행 중일 때 커널 파일 외에도 일부 주변 모듈 (예 : 드라이버)을로드하여 실행해야합니다.
커널 및 모듈 설치
커널 모듈 설치 : make modules_install
은 이전 단계에서 컴파일 된 커널 모듈을 설치하며 일반적으로 / lib / modules 디렉토리에 설치됩니다.
커널 설치 : 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
이러한 오류는 무시할 수 있습니다.
生成initrd.img
mkinitrd /boot/initrd-2.6.32.27.img 2.6.32.27
새 커널 부팅
시스템을 다시 시작하고 방금 컴파일 한 커널 시작 항목을 선택합니다. 다시 시작한 후 다음을 찾습니다.
[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
커널이 업데이트되었습니다.
이중 시스템 디버깅 구성
가상 머신 스냅 샷을 생성하고 스냅 샷을 기반으로 새 머신을 생성 한 후 대상 머신에 사용합니다.
대상에 직렬 포트를 추가하고 (먼저 프린터 장치를 제거)
개발 시스템에 직렬 포트를 추가합니다 (먼저 프린터 장치를 제거).
GRUB 파일 수정
대상 머신을 시작하고 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 : ttyS0 사용, 전송 속도 115200
kgdbwait : 시작 프로세스 동안 커널이 gdb 연결을 기다리도록합니다. 그런 다음 대상을 다시 시작하면 시스템이 kgdbwait에서 일시 중지되어 호스트 측에서 gdb 연결을 기다립니다.
grub 파일을 수정 한 후 시스템을 다시 시작하면 시스템이 다음 상태로 유지됩니다.
디버깅을 위해 개발 머신을 시작하고 커널 컴파일 디렉토리를 입력 한 다음 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 (继续运行)
대상 컴퓨터가 시스템에 들어간 다음 디버그 모드로 돌아 가려는 경우 : 대상 컴퓨터에서 실행 : echo g> / proc / sysrq-trigger