前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >双机调试Linux内核

双机调试Linux内核

作者头像
yifei_
发布2022-11-14 14:53:34
4.5K0
发布2022-11-14 14:53:34
举报
文章被收录于专栏:yifei的专栏yifei的专栏

文章目录

  1. 1. 利用KGDB双机调试内核
    1. 1.1. 环境
    2. 1.2. 配置内核编译环境
  2. 2. 参考

双机调试Linux内核环境配置。

利用KGDB双机调试内核

环境
  • centos 7
  • VMware
  • 全程使用root用户
配置内核编译环境

这种方式调试内核需要两台机器,一台用来运行Linux内核,另一台对内核进行调试。一般有以下三种常用的方案,可以根据电脑的性能或资金状况来选择。可以开两个Linux系统的虚拟机;也可以在物理机系统是linux上面装虚拟机,然后虚拟机运行一个linux;再就是买开发板来调试内核。以下是在windows上开两个虚拟机的流程描述。

vmware先开启一个虚拟机,命名为client(cpu核数可以设置跟物理机相同,可以提高后续编译速度)。

注:在之后的make操作时,如果缺失哪个组件,就安装完成后再执行命令。

https://www.kernel.org/ 下载想调试版本的内核代码(可以下载tarball格式)。

代码语言:javascript
复制
cd /usr/src/
wget https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-xxx.tar.xz
tar -xvf linux-xxx.tar

进入目录,设置编译选项(选择将哪些功能编译进内核)。

代码语言:javascript
复制
cd linux-xxx
make menuconfig
等待一下会出现设置页面,寻找以下几项然后确认是选中的。
	Kernel hacking --->
		[*]Compile the kernel with frame pointers
		[*]Compile the kernel with debug info
		[*]KGDB: kernel debugging with remote gdb		
		[*] KGDB: kernel debugger  --->
			KGDB: use kgdb over the serial console
确认以下一项没有选中。
	Kernel hacking --->
		Write protect kernel read-only data structures

编译内核

代码语言:javascript
复制
make -j8 bzImage #-j8设置8个线程来编译,bzImage会降低编译后内核的大小。
  ... ...
  LD      arch/x86/boot/setup.elf
  OBJCOPY arch/x86/boot/setup.bin
  BUILD   arch/x86/boot/bzImage
Setup is 16704 bytes (padded to 16896 bytes).
System is 4642 kB
CRC 4c29589a
Kernel: arch/x86/boot/bzImage is ready  (#1)

make -j8 modules #编译内核模块
# 这两步比较费时,我打开笔记本的高性能&虚拟机设置多核&多线程编译,将编译时间从一个小时降低到十几分钟了。

用vmware克隆出server机(如果早已经克隆,只需拷贝linux-xxx文件夹到server即可。其实也可以在server编译内核,然后再把该目录拷贝到client)

代码语言:javascript
复制
scp -r linux-xxx root@172.21.66.111:/usr/src/

在server安装内核模块&内核

代码语言:javascript
复制
make -j8 modules_install
make -j8 install

在server的/usr/src/linux-xxx生成initrd.img文件(将下面的版本号都换成自己的)

代码语言:javascript
复制
mkinitramfs -o initrd.img-xxx xxx
# 以上命令一般在Ubuntu/Debian用,在fedroa或centos一般是mkinitrd,如下
mkinitrd initrd.img-xxx xxx
# xxx为版本号

在server,拷贝几个文件到/boot下

代码语言:javascript
复制
cd /usr/src/linux-xxx
cp arch/x86_64/boot/bzImage  /boot/vmlinuz-xxx-kgdb
cp System.map /boot/System.map-xxx-kgdb
cp initrd.img /boot/initrd.img-xxx-kgdb

客户机修改设置开机启动项的grub配置文件,添加串口的设置

黄框中的内容表示要串口连接,当然加在下面一项的”GRUB_COMLINE_LINUX”中也可以。 配置完后需要更新一下grub,让配置生效:

代码语言:javascript
复制
在ubuntu是用该命令更新: update-grub 
centos使用: grub2-mkconfig -o /boot/grub2/grub.cfg

Grub更新配置后,会自动修改/boot/grub/grub.cfg文件,直接修改grub.cfg不是不行,而是如果/etc/default/grub更新后,如果运行update-grub就又会更新一下grub.cfg,导致直接在grub.cfg中的配置失效.

server机修改grub配置文件

这里与客户机配置比多加了一个参数text,这个参数的意思是系统启动后以text界面而不是图形界面显示(当然这个不是必须的,但是作为目标机我们进入系统直接用text界面界面就可以了)。 配置完后需要更新一下grub,让配置生效。 再看看/boot/grub2/grub.cfg,应该是下图这样,kgdbwait参数就为了在系统刚启动时就可以进入调试模式,如果没有,自己再手动加上吧。

给client机添加串行端口

代码语言:javascript
复制
vmware关闭client,进入虚拟机设置,添加串行端口
选中启动时连接
选中使用命名的管道,并填入:
\\.\pipe\com_1
该端是客户端
另一端是虚拟机

给server添加串行端口

代码语言:javascript
复制
vmware关闭client,进入虚拟机设置,添加串行端口
选中启动时连接
选中使用命名的管道,并填入:
\\.\pipe\com_1
该端是服务器
另一端是虚拟机

client和server添加串行端口后,测试一下:

代码语言:javascript
复制
在一端输入:cat /dev/ttyS1
在另一端输入: echo helloworld > /dev/ttyS1
观察前者是否能接收到数据。
(我测试ttyS0不行,改成ttyS1可以了)

参考

欢迎与我分享你的看法。 转载请注明出处:http://taowusheng.cn/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用KGDB双机调试内核
    • 环境
      • 配置内核编译环境
      • 参考
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档