Linux内核编译运行和调试

这一篇是关于linux内核源码下载,编译,运行,调试(搭建Qemu+gdb和Eclipse)的相关学习笔记。
操作系统:ubuntu

1.环境和工具链准备

1.1下载安装常见工具链

sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential gdb-arm-none-eabi gcc-aarch64-linux-gnu eclipse-cdt git

1.2下载定制内核

git clone https://github.com/figozhang/runninglinuxkernel_4.0.git

2.编译前的配置和准备

cd xx/runninglinuxkernel_4.0

2.1配置编译的架构内核

32位

export ARCH=arm

or 64bit

export ARCH=arm64

2.2指定编译交叉工具链

export CROSS_COMPILE=arm-none-eabi-

2.3编译内核时要指定一个开发的板子

(这里指定为arm公司的vexpress的开发板)

make vexpress_defconfig

2.4创建console设备节点

2.4.1如果是第一次运行 Qemu 虚拟机,那需要手工创建一个 console 节点。否则运行会提示错误。

ls命令看到runninglinuxkernel_4.0目录下有以下三个文件夹
_install_arm32
_install_arm64
_install_x86
依次执行以下命令,在_install_arm32目录下创建dev文件夹,并在dev文件夹内创建新的console 节点。

#cd _install_arm32
#ls
# mkdir -p dev
#cd dev
#ls
#sudo mknod console c 5 1

创建成功后,使用ls -l命令查看节点

2.4.2若已存在console可先删除再创建console设备节点
rm console

2.5查看/修改linux内核菜单配置选项

cd..cd..命令回到runninglinuxkernel_4.0所在目录,并通过

make menuconfig

命令调出linux内核菜单配置选项,通过菜单选择System type|ARM Ltd. Versatile Express family 可以看到我们选择的vexpress的板子,它支持Cortex-A5/Cortex-A7/Cortex-A9,然后,可以通过exit菜单选项退出。

3.编译内核

3.1编译内核

runninglinuxkernel_4.0所在目录执行以下命令编译内核

make bzImage -j1

-j1,表示用1个 CPU编译内核(附:查看当前设备cpu个数的命令cat /proc/cpuinfo |grep 'processor' |wc -l
编译成功后提示Kernel: arch/arm/boot/zImage is ready,生成内核的zImage文件

3.2启动还需要生成dtbs文件

make dtbs

4.Qemu运行内核

4.1运行内核

runninglinuxkernel_4.0所在目录调用以下命令使用qemu运行image

qemu-system-arm -nographic -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb

-nographic无图形界面
-M 配置设备
-m 配置分配内存大小
-kernel 配置内核image文件位置
-append 日志相关配置
-dtb 配置包含编译内核版本等信息的dtb文件

4.2内核运行成功后,查看相关信息

查看cpu

cat /proc/cpuinfo 

查看内存

cat /proc/meminfo

4.3结束qemu运行

杀掉qemu:killall qemu-system-arm

5.调试内核代码(gdb调试)

5.1qemu运行可调试内核

打开一个终端,在runninglinuxkernel_4.0目录,在上面提到qemu运行image命令后加-S -s启动qemu的Debug调试功能。
命令如下:

qemu-system-arm -nographic -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -S -s
qemu_linuxkernel4.0.JPG

5.2使用gdb连接qemu进行打断点和单步调试

5.2.1打开一个新的终端,使用gdb命令,启动gdb
arm-none-eabi-gdb --tui vmlinux

--tui表示gdb的图形界面
vmlinux是编译的带有调试信息的一个文件
启动成功后,会调出gdb的界面,且终端会显示

(gdb)#

等待输入控制命令

5.2.2 使用tcp的控制命令方式, 连接qemu
(gdb)#target remote localhost:1234

//(gdb)#不需要输入,下同.

5.2.3 使用控制命令设置断点
(gdb)#b do_fork
5.2.3 使用控制命令运行
(gdb)#c
5.2.4 使用控制命令单步执行
(gdb)#s

6.调试内核代码(gdb+Eclipse调试)

借助eclipse的图形化界面调试会更加方便,简洁,直观。

6.1 下载Eclipse并配置CDT插件。

  • 如果eclipse不支持C/C++编码,可以安装插件,设置如下:
  1. 打开eclipse,点击help--install new software...|add
  2. 在location 一栏输入http://download.eclipse.org/tools/cdt/releases/kepler
  3. 点击确定,等待,会有插件显示出来,全选上,点击next进行安装。
  • 安装好插件后,重启eclipse。

6.2 导入内核项目源码

  1. 点击File--New--Project--Makefile Project with Exsiting Code
    选择runninglinuxkernel_4.0 文件夹,自定义项目名比如:linuxkernel4.0
    注意:工具链什么的不需要选,导入之后,不需要自动编译,可以叉掉。

6.3 Eclipse调试配置

  • 默认工作空间,右上角debug下拉选择c/c++
  • run--debug configuration--c/c++ attach to application
    • Main:
      --c/c++ application: xx/runninglinuxkernel_4.0 /vmlinux
      --project: 选择刚才导入的工程名
      点击Apply
      debug_config1.JPG

  • Debugger
    --Debugger:--gdbserver
    --Main:
    --GDB-debugger: arm-none-eabi-gdb
    点击Apply
    debug_config2.JPG
  • Debugger
    --Connection:
    --Type: --TCP
    --Host name or IP address: localhost
    --Port number: 1234
    debug_config3.JPG

    点击Apply--Close.

6.4 调试

6.4.1 打开终端,运行qemu( 详见5.1qemu运行可调试内核)
6.4.2 debug调试,运行启动刚才配置的debug

有弹窗则,一直点击确定

6.4.3 debug启动后,在console控制台,依次输入以下命令后就可以开始调试了

file vmlinux 关联vmlinux调试文件
b do_fork 设置内核源码的断点函数
c 开始执行
如下图

关联vmlinux调试文件.JPG

设置断点.JPG
开始断点调试.JPG

你可能感兴趣的:(Linux内核编译运行和调试)