玲泷沙.spark
deepin
2026-08-09 23:52 本机器 我们单位有好几台 不过都是麒麟系统 ,然后默认虚拟机启动arm11
Reply Like 0 View the author
本机器 我们单位有好几台 不过都是麒麟系统 ,然后默认虚拟机启动arm11
好深的坑,看麻了...
牛了,deepin都没有勇气适配华为的CPU
牛了,deepin都没有勇气适配华为的CPU
这东西很费劲是一方面,另一方面是人家要卖UOS的,确实不太方便,不能叫没勇气
牛了,deepin都没有勇气适配华为的CPU
毕竟商业化要吃饭的。
这东西很费劲是一方面,另一方面是人家要卖UOS的,确实不太方便,不能叫没勇气
也是,自断财路不妥呀
目前还有问题:比如使用自带的截图录屏会直接把wlcom炸了:后面再修
终于可以日用了
需要配合 GXDE Display Manager 和 GXDE 9000C Compat 使用
具体怎么做的看这里 https://gitee.com/GXDE-OS/gxde-hisi-9000c-gpu-compat/
以下让AI 写一下
gxde-hisi-9000c-gpu-compat
麒麟 9000c(HiSilicon Maleoon 910)GPU 在 GXDE 下的硬件加速兼容层。
配合
gxde-wlcom (>= 2.1.6-gxde5)使用:由gxde-wlcom的启动脚本/usr/bin/startgxde_wlcom检测到 9000c 内核且存在/usr/bin/startgxde_wlcom_9000c时跳转到本包提供的硬件加速会话启动器,未安装本包则回退到默认软件渲染流程。
背景:为什么需要这个包
麒麟 9000c 的 GPU(Maleoon 910)只有闭源驱动,且同时存在两套:
libGFX_hisi.so.0.8.0/usr/lib/aarch64-linux-gnu/(由hw-maleoon-910提供)libhvgr.so/etc/vulkan/icd.d/maleoon_vulkan.json指向问题在于这两套驱动都不是为 Debian/GXDE 生态写的:
eglGetPlatformDisplay,eglGetDisplay(gbm_device)直接EGL_BAD_DISPLAY。wlroots/KWin 这类组合器全走标准 API,因此服务端根本无法用 hisi EGL —— 组合器只能退回 Mesa 软渲染,
不通告
wl_drm/zwp_linux_dmabuf_v1,客户端的 hisi EGL 也跟着废。egl_winsys_get_implementation_gbm,只有 UOS 打过补丁的 kwin_wayland 会调用它(这也是当初 UOS chroot 里能跑通、GXDE 上跑不通
的根本原因)。
libhvgr在旧内核上 4G 显存预留 ioctl(0xc010530e)永远返回EPERM,与内核 hvgr UAPI 不匹配,Mesa→ZINK→libhvgr 的硬件路径也走不通。结论:必须是麒麟 9000c 内核(
5.10.97-38-9000c),此时 hvgr UAPI 匹配、驱动原生可用;用户态这边再补齐 libwayland / EGL / gbm 的兼容缺口,就是本包。
一路的艰辛(历史踩坑记录)
libwayland 符号缺口:hisi 驱动是按 UOS 的 libwayland 1.21 编译的,调用了
Debian 1.23 没有的
wl_proxy_ref/wl_proxy_unref/wl_proxy_get_refcount。最初做了符号补丁
libhisi_wl_shim.so(LD_PRELOAD拦截这三个符号)——驱动能加载了,但假 refcount 外部表导致客户端段错误,方案废弃。正确做法就是本包
直接把 UOS 1.21 的
libwayland-client/cursor库带进来,让 hisi 环境用真库。服务端 EGL 平台不兼容:见上文背景。这解释了"为什么 wlcom 换任何环境变量
都无法用 hisi 服务端渲染"——不是缺符号,是 hisi 根本不实现标准 EGL 平台 API。
hvgr 4G 预留 EPERM 之谜:
libhvgr与libGFX_hisi都会对/dev/hvgr0发 rsv-add ioctl,旧内核一律
EPERM(root、持有 DRM master 都不行)。通过反汇编内核(kallsyms 全量可读 +
vmlinux-to-elf恢复符号)定位到:hvgr_ioctl有ctx->flags bit2门控,只有hvgr_ioctl_cfg_driver(
0x40305101)能置位,而旧内核的 hvgr mem ioctl 表根本不实现0xc010530e(rsv-add),是纯 UAPI 版本错配。曾写hvgr_shim.so伪造cfg_driver + rsv-add 成功用于突破调试,但那是旧内核的临时手段,9000c 内核
上不再需要任何 hvgr 补丁。
换 9000c 内核后:
vulkaninfo/ GLES / wlcom 全部免 shim 通过,GL_RENDERER = Maleoon 910,硬件桌面成立。客户端兼容补丁(本包的核心内容):即便服务端跑通,桌面上还有两类客户端
问题需要
libhisi_gbm_shim.so处理:wl_compositorv6,而 UOS 1.21 的wl_surface_interface是 v5表,合成器下发 v6 事件时 libwayland 报
interface 'wl_surface' has no event 2。通过 数据符号拦截重新导出wl_surface_interface(version=6、补上preferred_buffer_scale/preferred_buffer_transform两个事件)。eglGetPlatformDisplay,hisi 只有eglGetPlatformDisplayEXT(需eglGetProcAddress),shim 负责转发。gbm_bo_create_with_modifiers2/gbm_bo_get_fd_for_plane由 shim 转发到旧版接口。命名约定:会话启动器最初叫
startgxde_wlcom_hisi9000c,后按统一命名改为startgxde_wlcom_9000c。gxde-wlcom 侧对应版本为2.1.6-gxde5(commit
b02d7707/5e1379b6,tag2.1.6-gxde5)。⚠️ GitHub 镜像仓库
gxde-wlcom-src上还留有旧名方案的 commit(281d0b6b),与本包命名不一致,后续维护需同步。
包内容与工作原理
安装后提供:
调用链:
构建与安装
CI(
.github/workflows/building.yml)在推送 tag 时自动构建。安装依赖:
gxde-wlcom (>= 2.1.6-gxde5)、hw-maleoon-910(提供 hisi 驱动)、libwayland-client0、libwayland-cursor0。维护注意事项(务必逐条看)
server-egl/已随包提供(src/usr/lib/gxde-hisi-9000c-gpu-compat/server-egl/),符号链接全部指向
/usr/lib下的系统路径:libEGL.so[.1]/libgbm.so[.1]/libGLESv2.so[.2]/libwayland-egl.so[.1]→
/usr/lib/aarch64-linux-gnu/libGFX_hisi.so.0.8.0libwayland-client.so[.0]/libwayland-cursor.so[.0]→
/usr/lib/gxde-hisi-9000c-gpu-compat/libwayland-client.so.0.21.0等⚠ 保持绝对路径指向
/usr/lib:不要改成相对路径,也不要指向开发机的~/hisi-override(那是本机调试残留,打包会带坏)。libwayland-egl.so.1直接指 libGFX_hisi(UOS 的 libwayland-egl 就是 libGFX_hisi 的副本,md5 一致),
不要额外打一个 3.9MB 的重复文件。
绝对不要把
libgbm.so.1重定向给 hisi 用在 Xwayland 上。hisi libgbm 缺gbm_bo_create_with_modifiers2/gbm_bo_get_fd_for_plane,Xwayland 会因undefined symbol 崩溃。
xwayland-mesawrapper(unset LD_PRELOAD / LD_LIBRARY_PATH后再 exec Xwayland)是这个坑的官方解法,不要去掉
WLR_XWAYLAND。WLR_EGL_NO_MODIFIERS=1/KYWC_EGL_NO_MODIFIERS=1不能省,否则 hisi 拒绝仅含
{INVALID}的 modifier 列表,初始化失败。WLR_BACKENDS=drm,libinput要显式设置。若环境里残留WAYLAND_DISPLAY/DISPLAY,wlroots 会误选嵌套后端而不是 DRM,桌面起不来。这也是 gxde-wlcom 检测块里带这个变量的原因。
启动前清理
/tmp/.X*-lock//tmp/.X11-unix/X*,否则 Xwayland 会挑:1,DISPLAY 对不上。
内核版本是硬前提:必须是
5.10.97-38-9000c系列。旧内核下 hvgr rsv-add永远 EPERM/EINVAL,用户态再怎么改都无解。不要在非 9000c 内核上折腾本包。
命名必须同步:gxde-wlcom 检测的路径
/usr/bin/startgxde_wlcom_9000c与本包安装路径必须一字不差。改名时两处(gxde-wlcom 的
data/startgxde_wlcom检测块 + 本包
src/usr/bin/)一起改,并同步debian/control的版本依赖描述。libhisi_wl_shim.so(旧符号 shim)已废弃,不要再回退到它:假 refcount 会让客户端段错误。libwayland 1.23 缺符号的问题今后一直靠 UOS 1.21 库解决。
shim 是构建时编译的:
libhisi_gbm_shim.so由debian/rules从hisi_gbm_shim.c编译生成。改动 shim 源码后必须重新./build.sh,不要手工拷贝旧的
.so进src/。调试残留:
~/hisi-override下的hisi_rsv_probe、master_holder、hvgr_shim.so、libhisi_wl_shim.so等是历史调试工具,9000c 内核上都不需要,不要把它们带进生产包。
这套设备的 DRM UAPI 非 mainline(例如
SET_MASTER=DRM_IO(0x1e),mainline是
DRM_IO(0x41);MODE 相关 ioctl 整体偏移到 0xA0+)。写内核/驱动相关测试时不要照搬 mainline 的 ioctl 号。
本机手工验证流程(真实设备):
IDE 编辑陷阱:如果
.c源文件在 IDE 里处于打开状态,通过其他方式编辑磁盘文件可能被编辑器缓冲覆盖。改 shim 源码后务必确认磁盘上的内容(
objdump -s/cat)与预期一致,再构建。