经常有人问一台机器如何将hello经网络发送给另一台机器,我确实是不知道,只能看代码了。

说明:本人对内核的研究学习也是刚刚起步,有很多不了解的,所以文中可能会有一些“一本正经的胡扯”。请大家辩证的阅读。注意这种方式不能调试 start_kernel等过程,我主要用来调试tcp/ip协议栈代码。如果想调试start_kernel,后面会介绍用qemu的方式。

S1. 开发机:我是将一个老的索尼的笔记本装了Ubuntu桌面版本作为开发环境,版本号是Ubuntu 16.04.4 LTS,后面在某些步骤中也会称之为host。

S2. JDK使用的是java version "1.7.0_80"。 官网也有下载。后面CDT开发工具要用。

S3. Eclipse版本 Mars.2 Release (4.5.2),CDT(8.8.1)使用的插件的方式安装的。 相关软件在eclipse官网均可以获得。至于怎么装插件,请网上搜索。

S4. Virtualbox,版本 5.2.18 r124319 (Qt5.6.1)。 官网下载的linux版本。

S5. 开发机安装socat,模拟串口通信用。sudo apt-get install socat

S6. 开发机安装build工具链。

sudo apt-get install gcc
sudo apt-get install build-essential

S7. Virtualbox新建ubuntu虚拟机作为调试目标机,安装的虚拟机的系统用的镜像是:ubuntu-16.04-server-amd64.iso。至于怎么用virtualbox装虚拟机,请网上搜索。

虚拟机的CPU请根据你实际机器CPU的数量选择,我选择的是2,后面会对编译速度的提升有帮助。

虚拟机的网卡设置: 选中你的virtualbox虚拟机-->设置-->网络-->网卡1-->勾上 启用网络连接/连接方式 选择 桥接网卡/界面名称 选择 你能联网的网卡。



虚拟机串口设置: 选中你的virtualbox虚拟机-->设置-->串口-->端口1-->勾上 启用串口/端口模式 选择 主机管道/路径地址填写 /tmp/s

安装时,有个注意事项,语言选择English,否则可能会出现安装出错。另,安装server工具步骤时建议选择上openssh server。选择需要安装grub作为磁盘引导器。后面我么会称这台装好的虚拟机为guest机器,或者调试目标机,或者调试机,或者target等等。

S8. 登录到调试目标机,准备内核代码。

内核官网下载你要用的内核,我的用的是[4.4.19]版本(https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.19.tar.gz)。可以用wget xxx内核链接地址的办法下载,我的是:

cd ~
mkdir 004.code
cd 004.code
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.19.tar.gz
tar -xzvf linux-4.4.19.tar.gz
cd linux-4.4.19

S9. 在调试目标机准备编译安装内核。

修改Makefile文件(linux-4.4.19目录下),将其中的O2字样修改成O1,目前不支持O0编译。但是有个文章说可以通过修改内核代码达到使用O0编译的目的。我试了试,没成功。如果谁成功了,可以告诉我,谢谢。

安装必要的依赖:

sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install bc

调试目标机安装build工具链。

sudo apt-get install gcc
sudo apt-get install build-essential

配置内核选项,其实只需要执行这步生成config文件,配置项不用修改,我们要的都有。

make menuconfig

然后选择 exit 然后选择yes 生成config文件。

make CONFIG_DEBUG_SECTION_MISMATCH=y -j2

此步骤需要很长时间,2-5小时不等,正常可以在睡觉前执行,第二天早上起来看结果。

S10. 在调试目标机安装新编译的内核。

工作目录在linux-4.4.19

sudo make modules_install
sudo make install

S11. 在调试目标机修改启动引导选项。

在第10步完成后重启机器时,在启动菜单中选择Advance...菜单中,可以看到新安装的4.4.19内核的引导项。

进入系统(用4.4.19 或者之前的默认内核都可以),修改启动引导配置文件。

cd /boot/grub
sudo su - root
cp grub.cfg grub.cfg.bk.180917
chmod +w grub.cfg
vi grub.cfg

找到menuentry 'Ubuntu, with Linux 4.4.19......这个地方,为了便于识别,可以讲此处单引号内的4.4.19后面加上-debug-kernel字样(可选)。 从这行开始向下查看,找到最挨着的linux /vmlinuz-4.4.19 root=...ro 这一行,在 这一行后面加上kgdb=ttyS0 kgdboc=ttyS0,115200 kgdbwait

S12. 在调试目标机将代码和编译产物拷贝给开发机。我用的scp,你可以选择ftp等方式。

scp -r linux-4.4.19 simon@192.168.2.7:/home/simon/004.code/linux-4.4.19

用户名 ip 路径 根据你自己实际情况确定。不明白的可以搜搜scp命令怎么用,再不行就用ftp的方式搞。 也有人通过虚拟机共享目录的方式搞,这个不重要,你能拿到开发机上面就行。

S13. 在开发机,配置CDT并准备工程。

打开装了CDT插件的eclipse。

window-->preferences-->General-->Workspace 去掉勾选 Build Automatically。

window-->preferences-->C/C++-->indexer 去掉勾选 Enable indexer。

file-->new-->c project-->project name填写你自己合意的,比如linux-kernel-study / 去掉use default location,location输入框中选择你的linux-4.4.19路径。 / project type 选择 Makefile project-Empty project / Toolschains选择Linux GCC-->next-->Advanced Setting-->C/C++ Build-->去掉勾选use default build command, build command输入框内写上 make CONFIG_DEBUG_SECTION_MISMATCH=y -j2,build directory选择你的linux-4.4.19路径。 / Behavior页签 Build(Increament build) 输入框中输入一个空格即可。然后完成工程创建即可。

点击工具栏中的绿色小虫子右边的箭头,选择Debug Configurations-->C/C++ Remote Application(双击)-->proiect选择你刚创建的project / C/C++ Application选择你的linux-4.4.19路径下的vmlinux。 / 选中 Disable auto build 点击select other换一个启动器 选择 GDB(DSF)Manual Remote Debugging...

点击debugger页签 点击connection子页签,type选择Serial, speed选择115200,dev后面再来填。此处标志为待填13.1。

点击apply close即可。

S14. 启动调试目标机,在启动菜单处,选择 advance.../Ubuntu, with Linux 4.4.19-debuge-kernel这个内核引导项目。

在开发机执行命令:socat -d -d /tmp/s pty

他会有个输出 /dev/pts/.. 把这个路径填到13步待填13.1处。

cd 你的linux-4.4.19路径

gdb vmlinux

target remote /dev/pts/.. (此处对应上面的输出,不是真的写一个..)

此时就应该连接上目标机器了。按gdb的c指令便可以使得调试目标机继续启动下去。

如果需要加设断点等,可以在调试目标机执行

sudo su - root

echo g > /proc/sysrq-trigger

这样目标机就会暂停,可以在开发机中加设断点。

注意这种方式不能调试 start_kernel等过程,我主要用来调试tcp/ip协议栈代码。

S15. 在开发机用CDT调试。

退掉14步的gdb调试。

在调试目标机执行 sudo echo g > /proc/sysrq-trigger

点击CDT工具栏中的绿色小虫子右边的箭头,选择1New_configuration,如果有什么错误提示不用理会,继续proceed。 连接成功后,控制台会有输出,比如我们可以在控制台输入 b af_inet.c:471 然后输入gdb 指令 c

然后 在目标机执行 nc -l 8080

然后你就可以发现断点停在了 snum = ntohs(addr->sin_port);, 这个时候你就可以调试server的bind动作了,其他诸如listen accept connect等类似方式调试。

F5 F6这些快捷键都可以用,只是你每次增减断点,貌似都要现在目标机执行 echo g > /proc/sysrq-trigger,使他先停下来,才好加断点等操作。

用virtualbox+模拟串口+CDT调试linux内核 TCP/IP协议栈-起步的更多相关文章

  1. 用qemu+gdb tcp server+CDT调试linux内核启动-起步

    用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...

  2. Linux内核 TCP/IP、Socket参数调优

    Linux内核 TCP/IP.Socket参数调优 2014-06-06  Harrison....   阅 9611  转 165 转藏到我的图书馆   微信分享:   Doc1: /proc/sy ...

  3. (转)Linux内核 TCP/IP、Socket参数调优

    Doc1: /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失) ...

  4. Linux内核TCP/IP参数分析与调优

    转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0225/167.html?1456482565 如下图展示的是TCP的三个阶段.1,TCP三次握手. ...

  5. Linux内核 TCP/IP参数调优

    http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml

  6. Linux 从网卡到TCP IP协议栈数据流跟踪与审计

    前沿 在学代码审计,然后最近做Linux协议栈的审计,发现Linux不愧是一个久经考验的系统,本来以为可以找到个DoS的,结果发现其在TCP/IP协议栈的链路层实现,利用了各种技术,用来提高性能与安全 ...

  7. Gdb远程调试Linux内核遇到的Bug

    知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...

  8. VELT-0.1.5开发:使用kgdb调试Linux内核【转】

    转自:http://demo.netfoucs.com/lights_joy/article/details/44106589 VELT的全称是Visual EmbedLinuxTools,它是一个与 ...

  9. 在qemu环境中用gdb调试Linux内核

    简介 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试.其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qem ...

随机推荐

  1. iOS中转义后的html标签如何还原

    最近用swift做一个公司的小项目,遇到一个问题,就是通过api获取的html文本中的标签都已经被转义了, <p class="MsoNormal" align=" ...

  2. LoadRunner问题解决

    1.问题:复制脚本,修改后并保存,直接在controller中加载脚本,无法创建用户,出现“Loadrunner Controller cannot create Vusers.  Ensure th ...

  3. HDU 4734 F(x) (数位DP,基础)

    题意:  一个非负整数的十进制位是这样的 (AnAn-1An-2 ... A2A1),定义F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. ...

  4. iOS 微信和支付宝关于回调处理

    在支付这一块,发现讲支付集成的比较多,但是关于支付后回调处理的不多见,(当时因为这个问题懵逼了好久)就自己总结一下, 1.支付宝回调 支付宝的回调想对来说比较简单一些,因为支付宝的回调就在调起支付宝的 ...

  5. [神经网络]一步一步使用Mobile-Net完成视觉识别(二)

    1.环境配置 2.数据集获取 3.训练集获取 4.训练 5.调用测试训练结果 6.代码讲解 本文是第二篇,调用官方例子并获取数据集. 上一节里面记得我们需要配置PYTHONPATH,大家应该发现,每次 ...

  6. Array - Remove Element

    /** * 无额外空间.顺序可以被改变.不需要修改后面的数字. * @param nums 数组 * @param val 目标值 * @return nums中移除val后的长度 */ public ...

  7. AMD、CMD规范

    本文原链接:https://cloud.tencent.com/developer/article/1177217 AMD && CMD 前言 一.模块 二.CommonJS 三.AM ...

  8. Kubernetes之pod的属性

    属性名称 取值类型                   是否必选 取值说明 version String Required(必) 版本号,例如v1 kind String Required pod m ...

  9. Python Select模型

    IO多路复用 IO多路复用就是我们经常说的select epoll.select和epoll的好处是单个process就可以同时处理多个网络IO.基本原理是select\epoll会不断的轮询所负责的 ...

  10. MATLAB编程技巧

    [摘要] MATLAB是一种科学计算语言,和C.Fortran等高级语言相类似,能方便的实现程序控制.以下介绍一点matlab编程的技巧. 嵌套计算 程序执行的速度取决于调用的子程序的个数和算法实现. ...