基于Openwrt + Qemu进行内核源码级调试

2.使用qemu模拟OpenWrt(无需开发板) QEMU(Quick EMUlator)是一个开源的虚拟化软件,它可以模拟多个硬件平台,并在其上运行各种操作系统。类似常用的虚拟机模拟器Vmware,不过qemu更倾向于一些嵌入式系统架构的系统模拟,像mips/arm m系列等。本文主要介绍在linux(ubuntu系统)的环境下,运行qemu模拟开发板,运行openwrt。 阅读详情

基于Openwrt + Qemu进行内核源码级调试

上篇文章—利用Qemu + Buildroot 进行内核源码级调试中介绍了通过Qemu + Buildroot 搭建Linux内核源码级调试,但是后面在使用,学习过程中感觉有点不方便的一点就是在Buildroot中添加自己的应用或者内核模块的时候,添加应用相对来说算比较简单方便的,但是添加内核模块的时候,由于Buildroot的根目录下面的make menuconfig选项中没有针对Kernel modules的选项, 相对来说Openwrt中增加自己的应用和内核模块相对比较方便,所以这里首先针对Openwrt + Qemu 搭建内核源码级调试环境,然后通过对Linux内核中Netlink通信机制的简单学习,实现一个简单应用程序和一个简单的内核模块,最后简单介绍往Openwrt中添加自己的应用程序和内核模块的方法。

一、Openwrt编译

1. 下载Openwrt源码

git clone https://github.com/openwrt/openwrt.git

2. 下载安装拓展包

$ ./scripts/feeds update -a
$ ./scripts/feeds install -a

3. 配置环境

我PC系统是Centos7,下面是预装的可能缺少的工具和库
sudo yum -y install gcc binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils libncurses5-dev ncurses-term zlib1g-dev wget perl-Thread-Queue openssl-devel zlib-static ncurses-devel gcc-c++
可能所列出的不全,可以在后面根据运行make menuconfig的时候出现的报错所显示的内容对应的再去一一的安装。

4. 编译

运行如下命令:

$ make menuconfig

图1
将会出现如上图所示的对话框,进行编译选项配置,我直接选择的x86平台,其他先默认配置,后续根据自己的需求可以增加删除软件包,修改配置选项。然后保存配置直接编译。

$ make V=s

二、通过Qemu仿真Openwt

现在qemu对Openwrt的支持很好,通过如下命令既可以直接运行Openwrt生成的固件。

qemu-system-x86_64 -m 5120 -smp 4 -M pc -drive file=openwrt-x86-64-combined-ext4.img,if=none,id=openwrtdisk –device ich9-ahci,id=ahci -device ide-drive,drive=openwrtdisk,bus=ahci.0 -net nic,vlan=0,macaddr=52:54:00:AF:53:81,model=virtio -net user,vlan=0 -redir tcp:10023::23 -redir tcp:10080::80 –localtime

可能默认编译出来是没有这个文件openwrt-x86-64-combined-ext4.img,要修改编译选项,取消“GZip images”选项,即不通过gzip打包,如下图所示。
图2
图3
上图串口打印还是一样熟悉的配方。为方便调试,可修改网络配置为自动分配。可直接修改Openwrt根目录下target/linux/x86/base-files/etc/config/network文件按照如下方式修改即可。
图4
可以通过在主机上Telnet到虚拟机进行操作,这样比较方便,当然也可以通过ssh,自己调试学习用,没考虑安全所以直接选择Telnet,因为在启动qemu-system-x86_64的时候已经把虚拟机的23端口直接映射到主机10023端口,所以可以通过如下方式来访问:
图5
同样通过访问主机的10080端口,可以访问虚拟机的80端口,如下图所示:
图6
为方便调试,可以在主机上配置httpd服务,然后在虚拟机就可以通过wget来进行操作,如下图所示:
图7
这样就不用每次编译都重启虚拟机。

三、Netlink通信机制

Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式,一般不用Netlink。除非需要用到Netlink的广播特性时。
一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,但是Netlink可以实现双工通信。
Netlink协议基于BSD socket和AF_NETLINK地址簇(address family),使用32位的端口号寻址(以前称作PID),每个Netlink协议(或称作总线,man手册中则称之为netlink family),通常与一个或一组内核服务/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等。netlink具有以下特点:
① 支持全双工、异步通信(当然同步也支持)
② 用户空间可使用标准的BSD socket接口(但netlink并没有屏蔽掉协议包的构造与解析过程,推荐使用libnl等第三方库)
③ 在内核空间使用专用的内核API接口
④ 支持多播(因此支持“总线”式通信,可实现消息订阅)
⑤ 在内核端可用于进程上下文与中断上下文

下面是一个简单的例子(例子摘自网上,自己修改了一点错误,主要在于理解Netlink通讯的机制)
客户端代码:

#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/socket.h>
#include <errno.h>


#define MAX_PAYLOAD  1024 // maximum payload size
#define NETLINK_TEST 25    //自定义的协议

int main(int argc, char* argv[])
{
    int state;
    struct sockaddr_nl src_addr, dest_addr;
    struct nlmsghdr *nlh = NULL; //Netlink数据包头
    struct iovec iov;
    struct msghdr msg;
    int sock_fd, retval;
    int state_smg = 0;
    // Create a socket
    sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_TEST);
    if(sock_fd == -1){
        printf("error getting socket: %s", strerror(errno));
        return -1;
    }
    // To prepare binding
    memset(&src_addr, 0, sizeof(src_addr));
    src_addr.nl_family = AF_NETLINK;
    src_addr.nl_pid = 100; //A:设置源端端口号
    src_addr.nl_groups = 0;
    //Bind
    retval = bind(sock_fd, (
【安装笔记-20240520-Windows-在 QEMU 中尝试运行 OpenWRT】 本文记录在 Windows 环境下在 QEMU 虚拟机中安装运行 OpenWRT 的步骤。实验使用的电脑如下:OpenWrt项目是一个针对嵌入式设备定制的Linux操作系统。OpenWrt项目不是试图创建一个单一的、静态的固件,而是提供了一个完全可写的文件系统和包管理功能。这使您摆脱了厂商提供的应用选择和配置,允许您通过使用包来定制设备,以适应任何应用程序。对于开发者来说,OpenWrt是一个构建应用程序而无需围绕它构建完整固件的框架; 阅读详情

相关推荐

OpenWrt编译自己的应用程序

编译OpenWrt的应用程序可以参考OpenWrt内部其他应用程序的例程,来编写成自己的应用程序。

123 1万+

FirmAE固件自动化模拟框架:物联网安全研究的利器

固件模拟是物联网安全研究的基础技术,它通过在虚拟环境中运行嵌入式设备固件,使安全研究人员能够深入分析设备内部机制。其核心原理是利用QEMU等模拟器构建与真实硬件兼容的虚拟环境,并加载固件文件系统。这项技术的价值在于为漏洞挖掘、安全评估提供了可重复、隔离的测试平台,避免了物理设备限制。在物联网设备激增的背景下,固件模拟广泛应用于漏洞挖掘、渗透测试和产品安全自检等场景。FirmAE作为基于Firmadyne的自动化框架,通过智能化解包、架构识别、网络配置和服务探活,显著提升了固件模拟的成功率和效率,解决了传统手

weixin_34221773的博客 548

NIDS——suricata(一)

NIDS——suricata环境安装和规则编写

weixin_58666006的博客 1266

机器学习的低代码与无代码平台:便捷入门之路

机器学习领域正涌现出大量低代码和无代码平台,使非技术人员也能轻松应用AI技术。低代码平台(如PyCaret、H2O AutoML)需少量编程但灵活性强,而无代码工具(如Google Cloud AutoML、Teachable Machine)则完全无需编程基础。这些平台覆盖图像识别、文本处理、业务预测等多种场景,适合快速部署简单项目。但专业人士仍需注意,这些工具无法替代复杂场景下的定制化开发。随着技术进步,低门槛AI工具正在改变各行业的创新方式。

2501_90323865的博客 152

npm install failed如何办?

上网搜索,说是网络配置不太对。按照如下几步,保证解决问题。在运行npm install指令时,出现如下错误。

xiezhipu的博客 876

600份国家自然基金申报书--模板

600份国家自然基金申报书--模板

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 4165

2026.2.11:ollama api推理GLM-OCR模型识别图片

本文介绍了使用Ollama API调用GLM-OCR模型进行图片文字识别的过程。首先通过ollama pull glm-ocr:latest命令拉取模型,然后使用Python脚本调用API接口。代码示例展示了如何发送包含图片路径的请求,并处理返回的识别结果,支持文本、公式和表格三种识别模式。运行结果展示了模型对输入图片的识别效果,为开发者提供了便捷的OCR解决方案。

拥抱具身智能,昇腾Ascend C 345

Openclaw错误分析与解决方案之:Agent couldn’t generate a response.

Openclaw错误分析与解决方案之:Agent couldn't generate a response. Note: some tool actions may have already been executed — please verify before retrying.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1302

SAP 与 Palantir 合作全景解析:这不是普通集成,而是把 ERP、数据语义层、云迁移与企业级 AI 串成一条价值链

SAP与Palantir的战略合作聚焦企业数字化转型核心痛点,通过深度技术整合构建"数据-决策-执行"闭环。合作包含四大主线:云迁移连续性保障、SAP业务数据云与Palantir平台对接、联合工程开发、高监管行业优先落地。技术实现上采用SAP认证插件,支持双向数据交互和实时业务动作触发。该合作突破了传统ERP系统局限,将业务语义与AI执行相结合,特别适合制造业供应链优化、财务争议处理等高价值场景,为企业在云迁移过程中实现业务连续性与智能化升级提供新范式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 186

时间序列预测 | 决策树时间序列预测建模,单步、多步(Python)

时间序列预测 | 决策树时间序列预测建模,单步、多步(Python)

天天酷科研的博客 740

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 利用Qemu + Buildroot 进行内核源码级调试
下一篇: 初试Scrapy(一)—Scrapy环境搭建
谢健
博客等级 码龄16年 127粉丝 113原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值