这一篇是关于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++编码,可以安装插件,设置如下:
- 打开eclipse,点击help--install new software...|add
- 在location 一栏输入http://download.eclipse.org/tools/cdt/releases/kepler
- 点击确定,等待,会有插件显示出来,全选上,点击next进行安装。
- 安装好插件后,重启eclipse。
6.2 导入内核项目源码
- 点击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
- Main:
- 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
开始执行
如下图
网友评论