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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容