openbmc dbus架构简析

openbmc dbus架构简析(二) openbmc dbus简析 阅读详情

1.说明

openbmc是基于systemd的,dbus的库实现是在systemd。对于用户(app)使用来说,用的是sd-bus相关接口,即lib库,它在systemd中已有提供。系统提供一个总线(dbus daemon),实际是一个进程程序,这个进程程序(dbus的实现dbus-daemon或者dbus-borker的dbus-broker-launcher)会用到systemd实现的库接口,client和server的通信经过这个进程来转发数据,当然,client和server代码的编写也会依赖systemd的库接口。

总体而言,openbmc做了一个sdbusplus的c++ binding,然后该binding使用的是systemd提供的函数接口等。systemd的源码可以参考https://github.com/systemd/systemd. binding简单理解就是c++调用c,其他c++应用程序直接调用binding函数,即是c++层的库。

可以在https://en.wikipedia.org/wiki/D-Bus中找到相关描述:
在这里插入图片描述

备注:openbmc 有关dbus的资料:

总体而言,对于开发openbmc,可以先看d-bus的基本概念,然后基于此,知道openbmc用到systemd和c++ binding就差不多了。

另外,补充systemd的中文参考手册:

2.openbmc使用的systemd与d-bus说明

参考文章: https://opensource.com/article/20/4/systemd可以看到systemd的架构图:

在这里插入图片描述

2.1 openbmc使用的dbus

先使用ast2500平台为例,平台信息如下:
在这里插入图片描述
查看dbus使用的daemon服务:
在这里插入图片描述
同样,可以使用如下命令查看服务:

# cat /etc/systemd/system/dbus.service

在这里插入图片描述
使用命令,均可查看信息:

# cat /lib/systemd/system/dbus-broker.service

在这里插入图片描述
另外,也可以观察到系统也包含dbus的实现。
在这里插入图片描述
对应,可以查看目录:
在这里插入图片描述
谈到这里,可以列出来目前BMC的dbus的实现包含2个:

目前BMC使用的是dbus-borker.

2.2 简单分析一下dbus-broker流程

分析dbu-broker流程前,首先需要阅读2篇文章:

src\launch\main.c
int main(int argc, char **argv) 
---> r = parse_argv(argc, argv);
---> r = inherit_fds();
	---> n = sd_listen_fds(true);
	---> s = SD_LISTEN_FDS_START;
	---> r = sd_is_socket(s, PF_UNIX, SOCK_STREAM, 1);
	---> r = fcntl(s, F_GETFL);
	---> r = fcntl(s, F_SETFL, r | O_NONBLOCK);
	---> main_fd_listen = s;
	---> r = run();
		---> r = launcher_new(&launcher, main_fd_listen, main_arg_audit, main_arg_configfile, main_arg_user_scope);
			---> r = launcher_open_log(launcher);
				---> .sun_path = "/run/systemd/journal/socket",
				---> fd = socket(PF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
				---> connect(fd,(struct sockaddr *)&address,offsetof(struct sockaddr_un, sun_path) + strlen(address.sun_path));
				---> log_init_journal_consume(&launcher->log, fd);
			---> r = sd_event_default(&launcher->event);
			---> r = sd_event_add_signal(launcher->event, NULL, SIGTERM, NULL, NULL);
			---> r = sd_event_add_signal(launcher->event, NULL, SIGINT, NULL, NULL);
			---> r = sd_event_add_signal(launcher->event, NULL, SIGHUP, launcher_on_sighup, launcher);
			---> r = sd_bus_new(&launcher->bus_controller);
		---> r = launcher_run(launcher);
			---> r = launcher_parse_config(launcher, &root, &nss_cache);
				---> configfile = "/usr/share/dbus-1/system.conf"; 
				---> config_parser_init(&parser); //XML parser
				---> config_parser_read(&parser, rootp, configfile, nss_cache, dirwatch); //解析/usr/share/dbus-1/system.conf
				---> r = sd_event_add_io(..., launcher_on_dirwatch,...) //重新加载文件
			---> r = launcher_load_services(launcher, root, &nss_cache);
			---> r = sd_notify(false, "READY=1");
			---> r = launcher_load_policy(launcher, root, &policy);
			---> r = socketpair(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, controller); //创建一对双向通信的client/server. 注意是双向通信
			---> r = sd_bus_set_fd(launcher->bus_controller, controller[0], controller[0]);
				---> bus->input_fd = input_fd; //systemd的代码,输入设置为controller[0]
				---> bus->output_fd = output_fd;//systemd的代码,输出均设置为controller[0]
			---> r = launcher_fork(launcher, controller[1]); //
				---> launcher_run_child(launcher, log_get_fd(&launcher->log), fd_controller);
					---> const char * const argv[] = {
   
   "dbus-broker", ...}
					---> r = sd_id128_get_machine(&machine_id);
					---> sd_id128_to_string(machine_id, str_machine_id);
					---> r = execve(main_arg_broker, (char * const *)argv, environ);
				---> r = sd_event_add_child(launcher->event, NULL, pid, WEXITED, launcher_on_child_exit, launcher); //建立子进程,在子进程中创建dbus-broker 进程。
			---> r = sd_bus_add_object_vtable(launcher->bus_controller, NULL, "/org/bus1/DBus/Controller", "org.bus1.DBus.Controller", launcher_vtable, launcher);
			---> r = sd_bus_add_filter(launcher->bus_controller, NULL, launcher_on_message, launcher);  //launcher_on_message 是一个很重要的函数
			---> r = sd_bus_start(launcher->bus_controller);
			---> r = launcher_add_services(launcher);
			---> r = launcher_add_listener(launcher, &policy, system_console_users, n_system_console_users);
			---> r = launcher_connect(launcher);
			---> r = sd_bus_attach_event(launcher->bus_controller, launcher->event, SD_EVENT_PRIORITY_NORMAL);
			---> r = sd_bus_attach_event(launcher->bus_regular, launcher->event, SD_EVENT_PRIORITY_NORMAL);
			---> r = launcher_subscribe(launcher);
			---> r = sd_event_loop(launcher->event);

所以回顾一下之前看到的控制台有2个进程,分别为:/usr/bin/dbus-broker-launch和dbus-broker。其中dbus-broker-launch是由systemd以服务启动的。而dbus-broker则是由如下代码启动起来的。

const char * const argv[] = {
   
   "dbus-broker", ...}
execve(main_arg_broker, (char * const *)argv, environ);

查看文件/usr/lib/systemd/user/dbus.socket的内容:

# cat /usr/lib/systemd/user/dbus.socket
[Unit]
Description=D-Bus User Message Bus Socket

[Socket]
ListenStream=%t/bus
ExecStartPost=-/bin/systemctl --user set-environment DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus

与文件/lib/systemd/system/dbus-broker.service的内容:

root@ast2500-default:/# cat /lib/systemd/system/dbus-broker
【OpenBMC 系列】2.OpenBMC镜像编译流程以及如何加速编译 1.依赖安装 Yocto Build Host Packages You must install essential host packages on your build host. The following command installs the host packages based on an Ubuntu distribution: sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpat 阅读详情

相关推荐

OpenBmc开发10:hwmon简介

hwmon(hardware monitoring framework)硬件监视框架,是linux的子系统之一,包括了温度传感器、风扇、电源等设备的驱动框架。通过该框架,让这类硬件传感器管理更加方便。在linux3.10及之前的版本中,hwmon子系统实现的内容不是太多,只实现了一个hwmon class,只提供了一个hwmon的注册接口hwmondeviceregister,而硬件驱动在调用hwmondeviceregister注册之前需要调用sysfscreate。

master 1万+

[OpenBMC] 快速上手OpenBMC的Redfish

最近好像很多公司都在开始做OpenBMC,真的好夯,所以今天来聊聊OpenBMC的Redfish怎么快速上手, 如果对redfish没有很熟的话,可以先看"认识Redfish"里面讲解的概念 10分钟认识下一代数据中心基础设施管理标准 - 红鱼(Redfish)_yeiris的博客-CSDN博客这几年BMC领域中最受瞩目的两件事情就是Redfish的出现和OpenBMC的崛起,所以今天我想用10分钟来聊聊下一代数据中心基础设施管理标准 - 红鱼(Redfish)红鱼的诞生Redfish 是在2015年由D

yeiris的博客 1万+

OpenBmc:dbus-interface 和 dbusplus 的工作原理

dbus interface与dbusplus协同工作,前者定义服务规范(如yaml文件描述接口),后者提供开发工具实现规范。在yoctor工程中,dbusplus可将yaml转换为代码框架,简化开发。例如,Chassis.interface.yaml定义了电源管理接口,包含属性(如CurrentPowerState)、枚举值(如On/Off状态)和路径信息。该文件对应D-Bus服务的具体路径、接口和属性,为系统电源管理提供标准化规范。这种分工模式(规范+工具)有效提升了开发效率,确保服务实现的一致性。

大脸嫩柴的博客 954

openbmc 之 entity-manager 是如何工作的(1)

先来概况一下这个可执行文件的工作内容:它需要在没有设备驱动的情况下扫描所有 i2c 总线下的每一个地址(实际上是指定范围的地址),如果发现地址上存在 FRU ,则解析 FRU 的内容并将其推到 dbus 上。什么是 FRU?说白了,它就是一种电子标签,用以存储部件信息。在物理上,它一般存储在板卡上的特有 EEPROM 里,与 BMC 通过 i2c 的方式取得连接。fru-device 在根本上所做的事,便是通过 i2c 来寻找 FRU ,从而发现各种各样的板卡。

windy的博客 4002

OpenBMC开发日记:我是如何给dbus-sensors添加国产传感器驱动的

本文详细记录了为OpenBMC的dbus-sensors组件添加国产传感器驱动的完整应用实践。从解读硬件数据手册、剖析dbus-sensors模块化架构,到编写驱动代码、集成构建系统,再到与Entity Manager联动实现动态配置,提供了从零开始扩展OpenBMC硬件支持的实战指南。

ol789012345的博客 868

OpenBMC中dbus-sensors模块化架构揭秘:从硬件接口到D-Bus数据流

本文深入解析了OpenBMC中dbus-sensors模块化架构的原理与应用实践。该架构作为系统的“感官神经”,通过清晰的数据采集、处理与暴露三层设计,将硬件传感器数据高效、可靠地转换为标准D-Bus接口,实现了故障隔离与灵活扩展。文章结合Entity Manager的硬件自动发现机制,详细阐述了从硬件接口到上层应用的数据流转奥秘,并提供了配置、调试与深度优化的实战指南。

wood5的博客 494

OpenBMC开发之虚拟媒体virtual-media服务

OpenBMC开发中,KVM和虚拟媒体vMedia是技术难度比较大的功能模块,这里摘录开源项目内容做个简单介绍。

柠檬恋上雨 3843

OpenBMC中dbus-sensors的模块化设计与实战:从架构解析到性能优化

本文深入解析了OpenBMC中dbus-sensors的模块化架构设计,包括其数据采集、处理与发布三层核心结构。通过实战案例,详细探讨了从基础部署到高级性能优化的策略,如轮询调优、异步I/O与D-Bus通信优化,旨在帮助开发者构建稳定高效的服务器传感器管理系统。

weixin_29223603的博客 327

OpenBMC:简介

OpenBMC是Linux Foundation的开源BMC项目,创始组织是Microsoft、Intel、IBM、Google和Facebook。通常在服务器主板上,有一个独立的微处理器,叫作BMC(Baseboard Manager Controller),用于与主机(host)进行通信,提供带外的方式查询服务器的状态和信息,并进行管理服务器。

风静如云的博客 850

Red Hat Enterprise Linux 9.2

安装Red Hat Enterprise Linux 9.2

zhurobert的博客 933

手把手教你用NE555+LM324搭建红外倒车雷达(附Multisim仿真文件)

本文详细介绍了如何使用NE555定时器和LM324运算放大器搭建一个红外倒车雷达系统。内容涵盖从核心原理拆解、模块电路设计(包括红外发射、接收放大、检波与电压比较)到实战焊接调试的全过程,并提供了Multisim仿真验证思路,帮助电子爱好者与初学者将模拟电路理论转化为可工作的实用项目。

echo99的专栏 672

天龙八部源码深度解析:从宠物系统到副本机制(C++游戏开发实战)

本文深度解析《天龙八部》源码架构,重点剖析宠物系统状态机实现与副本动态加载机制等核心模块。通过C++代码示例展示宠物AI状态迁移逻辑和副本场景管理技术,为现代游戏开发提供兼容性改造方案与设计启示。适合游戏开发者学习经典MMORPG的工程化实现路径。

weixin_29011239的博客 377

C#实战:如何用winmm.dll打造毫秒级高精度定时器(附完整代码)

本文详细介绍了在C#中利用winmm.dll实现毫秒级高精度定时器的完整方案。针对.NET内置定时器精度不足的问题,通过调用timeSetEvent等原生API,提供了超越系统时钟中断周期的精准定时能力。文章包含核心原理剖析、完整的封装类代码以及音视频处理、游戏开发等场景下的实战应用与性能调优指南。

ujm5678901的博客 688

Syzkaller实战教程2:运行环境配置+实例运行

本文详细介绍了在linux系统上搭建Syzkaller内核模糊测试环境的完整流程。 1.环境配置:通过VMware创建Ubuntu20.04虚拟机A,配置QEMU/KVM虚拟化环境,安装Go语言工具链和Syzkaller; 2.内核编译:下载Linux内核源码并配置KCOV等调试选项,编译生成带覆盖率支持的bzImage内核镜像; 3.测试环境构建:使用debootstrap创建Debian虚拟机镜像,通过QEMU启动嵌套虚拟机B; 实例测试: 4.演示两种测试场景 - 提供完整上手教程

cuguanren的博客 1370

第10章 shellcode实战:18 神级开源shellcode工具:donut

Donut是一款shellcode生成器,可将C/C++、C#生成的PE文件转换为shellcode文件,同时支持JS、XSL、VBS脚本转换为shellcode。以下“原生”EXE/DLL指非托管PE文件(包括并不限于C/C++、delphie等编写生成的可执行文件),可以直接由系统加载运行,区别于.Net生成的托管文件。被处理exe/dll为32位程序,则需要用32为的shellcode加载器启用,exe/dll为64位的就用64位shellcode加载器启用。

李小咖·网安技术库 2788

小论文/大论文必备 | RT-DETR目标检测、数据集增强 | 引入多种数据集增强方法,支持图像和标签同步扩充增强,助力小论文和大论文实验涨点策略,平均提升模型mAP约1-2个百分点

RT-DETR目标检测数据增强策略研究 ,本文针对RT-DETR目标检测模型提出9种数据增强方法,包括几何变换(水平/垂直翻转、中心裁剪)、光照调整(亮度、对比度)和噪声添加(高斯/椒盐噪声)等。所有增强操作均保持图像与标签同步变换,确保训练数据的准确性。实验表明,该策略可提升模型mAP 1-2个百分点,对小目标检测效果尤为显著。文中提供了完整的Python实现代码,支持批量处理图像和标签文件,并详细说明了各增强方法的功能特点。该方法通过提升数据多样性,有效增强了模型在复杂场景下的鲁棒性和泛化能力。

Ai缝合怪、助力小伙伴高效发论文 458

ubuntu20 安装px4、mavros、QGroundControl

首先安装一下ant,否则没法运行,同时因20.04的缺少动态库libawt_xawt.so无法被Java8给调用,我的解决办法是去18.04把18.04的相同路径下的动态库libawt_xawt.so移动到20.04的/usr/lib/jvm/java-11-openjdk-amd64/lib/路径中。用rosdepc的时候,你得确保你用的是鱼香ROS的提供的ROS安装方法,否则是没有rosdepc的。make px4_sitl gazebo之前,可以安装一下gazebo的 模型。二、安装MAVROS。

qq_58060770的博客 3338

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: aspeed2600 GPIO分析与适配ipmitool power status, ipmitool power on/off
下一篇: aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie)
wit_yuan
博客等级 码龄14年 375粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wit_yuan

专注模块功能分析与架构

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值