hypervisor display显卡节点card0生成过程

DRM 从app到libdrm,到/dev/dri/card0 内核 DRM 驱动实现了一系列 IOCTL 接口(如 `DRM_IOCTL_MODE_GETRESOURCES`、`DRM_IOCTL_MODE_SETCRTC`)。用户空间程序通过 `libdrm` 打开 DRM 设备文件(如 `/dev/dri/card0`),获取文件描述符。- `drmOpen` 是 `libdrm` 提供的函数,用于打开 DRM 设备。- `libdrm` 通过 `ioctl` 系统调用与内核 DRM 驱动交互。通过 `libdrm` 设置显示模式(如分辨率、刷新率)。 阅读详情
AI摘要

文章主要探讨了在QNXhypervisor环境下,基于高通基线1.2.1和内核版本5.4的Android系统中,dev/dri/card0和dev/dri/renderD128两个设备节点的生成过程。通过分析/sys/class/drm/card0目录下的信息,确定了驱动的关键字qcom,sde_kms_hyp,并在$KERNEL_ROOT/techpack/display/目录下找到相关源码。进一步,文章指出驱动加载时msm-cfg模块先加载,然后加载msm-hyp-legacy模块,这两个模块一起创建了所需的drm设备。虽然驱动仅实现了有限的文件操作,但上层应用仍会频繁使用相关接口。最后,文章提到了驱动加载顺序、dts配置和节点使用者的情况。

开始

我们知道android显示模块底层是由drm(Direct Rending Manger)提供的,drm驱动加载完成的标志是显卡设备节点生成:

130|msmnile_gvmq:/sys/class/drm/card0/device/driver # ls /dev/dri/
card0  renderD128
msmnile_gvmq:/sys/class/drm/card0/device/driver #

这两个节点是:

/dev/dri/card0

/dev/dri/renderD128

现在我们想探究一下,在QNX hypervisor下(高通基线1.2.1,内核版本5.4),android侧的这两个文件节点是如何生成的.

定位hyp display源码路径

这两个节点是有驱动模块生成的,所以要了解生成的细节,就必须要分析其驱动源码。为了达成我们这篇文章的目的:hypervisor display显卡节点card0生成过程,我们需要下面几个工作:

收集信息-》定位驱动源码模块-》分析代码-》信息汇总总结

但是目前摆在我们眼前的第一个问题就是需要搞清楚这两个节点是由哪些驱动源码生成的。.

从/dev/和/sys开始

一般/dev/下的文件节点的名字都具有特殊性,通常由驱动模块源码或者内核中相应的子系统模块分配指定。这里我们尝试直接搜索card/render相关的字符串,但是搜索结果太多,并不能很快的定位源码位置。

这里我们可以从/sys目录入手,进入/sys/class/drm/card0目录,这里可以获取到部分信息:

msmnile_gvmq:/sys/class/drm/card0/device # ls
driver  driver_override  drm  modalias  of_node  power  subsystem  uevent
msmnile_gvmq:/sys/class/drm/card0/device # ls
driver  driver_override  drm  modalias  of_node  power  subsystem  uevent
msmnile_gvmq:/sys/class/drm/card0/device # cat of_node/name
qcom,sde_kms_hypmsmnile_gvmq:/sys/class/drm/card0/device # cat dri
driver/           driver_override
msmnile_gvmq:/sys/class/drm/card0/device # cat driver/
bind                                                           soc:qcom,sde-cfg:qcom,sde-sub-cfg@1:qcom,sde_kms_hyp@ae00000/  uevent                                                         unbind
msmnile_gvmq:/sys/class/drm/card0/device # cat driver/

从获取到的信息中,我们知道驱动在适配dts时候的关键字:qcom,sde_kms_hyp,以及部分dts配置信息:soc:qcom,sde-cfg:qcom,sde-sub-cfg@1:qcom,sde_kms_hyp@ae00000

定位驱动源码路径

现在driver目录下搜索:qcom,sde-kms-hyp,但是好像并没有搜索到结果。

紧接着在内核根目录下搜索:qcom,sde-kms-hyp,发现其源码位于:$KERNEL_ROOT/techpack/display/目录下.

需要注意的是,techpack/display目录下的编译配置并不由kernel config文件控制(arch/arm64/config目录下的板级配置文件),而是自己有单独的配置文件,打开文件:techpack/display/Makefile 我们可以看到:

 techpack/display目录的源码其实是包含了LA/LV基线以及hypervisor display基线的源码的,这里我们的基线是HYP display基线,所以具体的内核配置记录在文件techpack/display/config/gvmgen3disp.conf 中。

 这些配置在编译完成之后不会体现在.config中,也不会体现在/proc/config.gz中.

所以我们需要分析的代码大致有几个目录:

小结

1,我们从/sys目录下的node信息得到在dts中与display相关的关键字

2,通过搜索这些关键字定位驱动目录位于$KERNEL_ROOT/techpack/display/下

3,分析代码发现,display目录下代码包含了单LA/LV基线及Q+A基线的显示驱动代码

4,确认需要我们分析的目录为:

msm-cfg  msm-hyp  msm-hyp-legacy  msm-lease

代码分析

忽略代码分析的过程,这里直接上结论:

1,前面提到的需要分析的代码中,其实只有红框部分代码有用(msm-cfg&msm-hyp-legacy),绿框中的代码在内核驱动加载的时候只会运行register,而根本不会执行probe函数。

2,绿框中的代码完全不编译也不影响系统运行,这些代码感觉像是历史遗留代码

3,驱动加载时,msm-cfg模块会先加载,然后带起msm-hyp-legacy模块,本质上他们是一个模块,目的是创建android系统需要的drm设备card0 和renderD128,驱动实现中,这两个节点只提供非常有限的文件操作功能,比如open/close,ioctl则几乎不实现。这点在目录下NOTES也说的很明白:

NOTES about msm drm/kms hyp driver:

This driver registers with drm framework for the purpose of creating the 
/dev/dri/card0 path, which User Space DRM masters rely on. 
Furthermore, per-CRTC VBLANK and PAGE_FLIP events are queued to the device
path to notify User Space components listeners.

No other IOCTL or HW support is provided through this driver.

但是,不代表上层不会使用这些接口,相反上层依旧会频繁的使用这些接口

[     0.968418],4,527,-;for debug: now we are msm_drm_register techpack/display/msm-hyp/msm_drv_hyp.c +2212
[     7.729034],4,808,-;for debug: now we are msm_open techpack/display/msm-hyp-legacy/msm_drv_hyp.c +56, proess is:android.hardwar pid 426
[     7.731890],4,810,-;for debug: now we are msm_drm_ioctl techpack/display/msm-hyp-legacy/msm_drv_hyp.c +347, proess is:android.hardwar pid 426,
[     7.732684],4,811,-;for debug: now we are msm_ioctl_query_client_id techpack/display/msm-hyp-legacy/msm_drv_hyp.c +333 
[     7.733158],4,812,-;for debug: now we are _msm_parse_dt techpack/display/msm-hyp-legacy/msm_drv_hyp.c +304 
[     7.764510],6,823,-;for debug: now we are msm_open techpack/display/msm-hyp-legacy/msm_drv_hyp.c +56, proess is:android.hardwar pid 426
[     7.764528],6,824,-;for debug: now we are msm_open techpack/display/msm-hyp-legacy/msm_drv_hyp.c +56, proess is:android.hardwar pid 426
[     7.764542],6,825,-;for debug: now we are msm_open techpack/display/msm-hyp-legacy/msm_drv_hyp.c +56, proess is:android.hardwar pid 426
[     8.054259],6,888,-;for debug: now we are msm_open techpack/display/msm-hyp-legacy/msm_drv_hyp.c +56, proess is:composer@2.4-se pid 426
[     8.054283],6,889,-;for debug: now we are msm_open techpack/display/msm-hyp-legacy/msm_drv_hyp.c +56, proess is:composer@2.4-se pid 426
[     8.054292],6,890,-;for debug: now we are msm_open techpack/display/msm-hyp-legacy/msm_drv_hyp.c +56, proess is:composer@2.4-se pid 426
[     8.054306],6,891,-;for debug: now we are msm_open techpack/display/msm-hyp-legacy/msm_drv_hyp.c +56, proess is:composer@2.4-se pid 426
[    12.488209],6,1234,-;for debug: now we are msm_drm_ioctl techpack/display/msm-hyp-legacy/msm_drv_hyp.c +347, proess is:composer@2.4-se pid 426
[    12.488214],6,1235,-;for debug: now we are msm_ioctl_gem_get techpack/display/msm-hyp-legacy/msm_drv_hyp.c +205, proess is:composer@2.4-se pid
[    12.525305],6,1248,-;for debug: now we are msm_drm_ioctl techpack/display/msm-hyp-legacy/msm_drv_hyp.c +347, proess is:composer@2.4-se pid 426
[    12.525311],6,1249,-;for debug: now we are msm_ioctl_gem_get techpack/display/msm-hyp-legacy/msm_drv_hyp.c +205, proess is:composer@2.4-se pid
[    12.542423],6,1259,-;for debug: now we are msm_drm_write techpack/display/msm-hyp-legacy/msm_drv_hyp.c +160, proess is:DRMFE_EventList pid 516
[    12.542427],6,1260,-;for debug: now we are create_vblank_event techpack/display/msm-hyp-legacy/msm_drv_hyp.c +99, proess is:DRMFE_EventList pi
[    12.775925],6,1268,-;for debug: now we are msm_drm_write techpack/display/msm-hyp-legacy/msm_drv_hyp.c +160, proess is:DRMFE_EventList pid 516
[    12.775929],6,1269,-;for debug: now we are create_vblank_event techpack/display/msm-hyp-legacy/msm_drv_hyp.c +99, proess is:DRMFE_EventList pi
[    12.792664],6,1270,-;for debug: now we are msm_drm_write techpack/display/msm-hyp-legacy/msm_drv_hyp.c +160, proess is:DRMFE_EventList pid 516
[    12.792668],6,1271,-;for debug: now we are create_vblank_event techpack/display/msm-hyp-legacy/msm_drv_hyp.c +99, proess is:DRMFE_EventList pi
[    12.809313],6,1272,-;for debug: now we are msm_drm_write techpack/display/msm-hyp-legacy/msm_drv_hyp.c +160, proess is:DRMFE_EventList pid 516
[    12.809316],6,1273,-;for debug: now we are create_vblank_event techpack/display/msm-hyp-legacy/msm_drv_hyp.c +99, proess is:DRMFE_EventList pi
[    12.825947],6,1274,-;for debug: now we are msm_drm_write techpack/display/msm-hyp-legacy/msm_drv_hyp.c +160, proess is:DRMFE_EventList pid 516
[    12.825951],6,1275,-;for debug: now we are create_vblank_event techpack/display/msm-hyp-legacy/msm_drv_hyp.c +99, proess is:DRMFE_EventList pi
[    12.842704],6,1278,-;for debug: now we are msm_drm_write techpack/display/msm-hyp-legacy/msm_drv_hyp.c +160, proess is:DRMFE_EventList pid 516
[    12.842708],6,1279,-;for debug: now we are create_vblank_event techpack/display/msm-hyp-legacy/msm_drv_hyp.c +99, proess is:DRMFE_EventList pi
[    12.859308],6,1284,-;for debug: now we are msm_drm_write techpack/display/msm-hyp-legacy/msm_drv_hyp.c +160, proess is:DRMFE_EventList pid 516

4, msm-hyp-legacy模块中生成card0和renderD128的过程也很简单,在msm-hyp-legacy模块中的msm_pdev_probe函数中调用drm_dev_alloc来申请drm设备,然后调用drm_dev_register注册drm设备,进而生成card0&render128节点

static int msm_pdev_probe(struct platform_device *pdev)
{
    struct device *dev = &pdev->dev;
    struct drm_device *ddev;
    struct msm_drm_private *priv;
    int ret;

    ddev = drm_dev_alloc(&msm_driver, dev);
    if (!ddev) {
        dev_err(dev, "failed to allocate drm_device\n");
        return -ENOMEM;
    }   

    platform_set_drvdata(pdev, ddev);

    priv = kzalloc(sizeof(*priv), GFP_KERNEL);
    if (!priv) {
        ret = -ENOMEM;
        goto priv_alloc_fail;
    }   

    ddev->dev_private = priv;
    priv->dev = ddev;

    ret = drm_dev_register(ddev, 0); 
    if (ret) {
        dev_err(dev, "failed to register drm device\n");
        goto fail;
    }   

    return 0;

fail:

priv_alloc_fail:
    drm_dev_put(ddev);
    return ret;
}

5,在drm_dev_register函数中会生成2个节点,即render128和card0,通过调用drm_minor_register时传递DRM_MINOR_RENDER和DRM_MINOR_PRIMARY两种参数来生成不同的节点.其中DRM_MINOR_RENDER负责生成render128,而DRM_MINOR_PRIMARY则是生成card0节点.

int drm_dev_register(struct drm_device *dev, unsigned long flags)
{
    struct drm_driver *driver = dev->driver;
    int ret;

    mutex_lock(&drm_global_mutex);

    ret = drm_minor_register(dev, DRM_MINOR_RENDER);
    if (ret)
        goto err_minors;

    ret = drm_minor_register(dev, DRM_MINOR_PRIMARY);
    if (ret)
        goto err_minors;

    ret = create_compat_control_link(dev);
    if (ret)
        goto err_minors;

    dev->registered = true;

    if (dev->driver->load) {
        ret = dev->driver->load(dev, flags);
        if (ret)
            goto err_minors;
    }

    if (drm_core_check_feature(dev, DRIVER_MODESET))
        drm_modeset_register_all(dev);

    ret = 0;

    DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
         driver->name, driver->major, driver->minor,
         driver->patchlevel, driver->date,
         dev->dev ? dev_name(dev->dev) : "virtual device",
         dev->primary->index);

    goto out_unlock;

err_minors:
    remove_compat_control_link(dev);
    drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
    drm_minor_unregister(dev, DRM_MINOR_RENDER);
out_unlock:
    mutex_unlock(&drm_global_mutex);
    return ret;
}

6,如果我们对LA的drm驱动做完整的drm测试,他能通过吗?

从分析来看,Q+A的drm驱动只是一个空的架子,没有实质的内容,所以无法进行测试.

7,对于同一个level的驱动,内核如何保证其加载顺序?比如现在我们有两个同是__initcall level的驱动msm_drm_register

内核控制驱动加载顺序的方法有很多种,其中一种就是通过Makefile中的先后顺序进行控制,比如当前我们分析的这个模块:

 msm-cfg的位置要先于msm-hyp,从system.map看msm-cfg模块会优先于msm-hyp模块加载.

8,DTS如何与驱动产生联动的?

display相关的dts配置在文件:arch/arm64/boot/dts/vendor/qcom/display/quin-vm-display.dtsi, 内容也不多:

&soc {
    sde_cfg: qcom,sde-cfg {
        compatible = "qcom,sde-cfg";

        qcom,sde-sub-cfg@0 {
            reg = <0>;
            wfd_kms: qcom,wfd_kms@0 {
                compatible = "qcom,wfd-kms";
                qcom,client-id = "7815";
            };

            qcom,sde_kms_hyp@ae00000 {
                compatible = "qcom,sde-kms-hyp";
                qcom,kms = <&wfd_kms>;
            };
        };

        qcom,sde-sub-cfg@1 {
            reg = <1>;
            qcom,sde_kms_hyp@ae00000 {
                compatible = "qcom,sde-kms-hyp-legacy";
                qcom,client-id = "7815";
            };
        };
    };  
};

这个文件会被include到文件arch/arm64/boot/dts/vendor/qcom/sa8155-vm-la.dtsi 中。驱动加载的时候,会先通过qcom,sde-cfg匹配到msm-cfg驱动模块,在由这个模块带起剩下的legacy和lease模块.

9,都有谁会使用这个节点:

msmnile_gvmq:/ # lsof | grep renderD128
1|msmnile_gvmq:/ #
1|msmnile_gvmq:/ #
1|msmnile_gvmq:/ #
1|msmnile_gvmq:/ # lsof | grep card0
composer@2.4-se   406     system    7u      CHR              226,0       0t0      16645 /dev/dri/card0
composer@2.4-se   406     system   15u      CHR              226,0       0t0      16645 /dev/dri/card0
composer@2.4-se   406     system   16u      CHR              226,0       0t0      16645 /dev/dri/card0
composer@2.4-se   406     system   17u      CHR              226,0       0t0      16645 /dev/dri/card0
composer@2.4-se   406     system   19u      CHR              226,0       0t0      16645 /dev/dri/card0
composer@2.4-se   406     system   21u      CHR              226,0       0t0      16645 /dev/dri/card0
composer@2.4-se   406     system   22u      CHR              226,0       0t0      16645 /dev/dri/card0
composer@2.4-se   406     system   23u      CHR              226,0       0t0      16645 /dev/dri/card0
msmnile_gvmq:/ #
msmnile_gvmq:/ #
msmnile_gvmq:/ # lsof | grep hgsl
hgsl-release-wq   169       root  cwd       DIR              252,6      4096          2 /
hgsl-release-wq   169       root  rtd       DIR              252,6      4096          2 /
hgsl-release-wq   169       root  txt   unknown                                         /proc/169/exe (readlink: No such file or directory)
provider@2.4-se   399 cameraserv    7u      CHR              241,0       0t0       4542 /dev/hgsl
provider@2.4-se   399 cameraserv    8u      CHR              241,0       0t0       4542 /dev/hgsl
composer@2.4-se   406     system   10u      CHR              241,0       0t0       4542 /dev/hgsl
composer@2.4-se   406     system   11u      CHR              241,0       0t0       4542 /dev/hgsl
composer@2.4-se   406     system   12u      CHR              241,0       0t0       4542 /dev/hgsl
composer@2.4-se   406     system   13u      CHR              241,0       0t0       4542 /dev/hgsl
cameraprovider@   420       root    4u      CHR              241,0       0t0       4542 /dev/hgsl
cameraprovider@   420       root    7u      CHR              241,0       0t0       4542 /dev/hgsl
surfaceflinger   472     system   14u      CHR              241,0       0t0       4542 /dev/hgsl
surfaceflinger   472     system   15u      CHR              241,0       0t0       4542 /dev/hgsl
surfaceflinger   472     system   16u      CHR              241,0       0t0       4542 /dev/hgsl
surfaceflinger   472     system   17u      CHR              241,0       0t0       4542 /dev/hgsl
Binder:1095_3  1095     system  320u      CHR              241,0       0t0       4542 /dev/hgsl
Binder:1095_3  1095     system  330u      CHR              241,0       0t0       4542 /dev/hgsl
Binder:1095_3  1095     system  334u      CHR              241,0       0t0       4542 /dev/hgsl
ndroid.systemui  2167     system   71u      CHR              241,0       0t0       4542 /dev/hgsl
ndroid.systemui  2167     system   72u      CHR              241,0       0t0       4542 /dev/hgsl
ndroid.systemui  2167     system   74u      CHR              241,0       0t0       4542 /dev/hgsl

10, Display模块中被应用层调用的ioctl操作是如何传递到QNX侧的?

事实上,Display模块中的ioctl最终会以signal的方式通知hgsl模块,由hgsl模块通过hab通知到QNX

Linux 设备文件简介 概述 设备管理是 Linux 中比较基础的知识,与内核的关系也比较密切。随着 Udev 的广泛使用,Linux 发行版的智能程度越来越高,许多 Linux 新用户对 /dev 目录下的东西变得不再熟悉,有时候遇见问题就会抓狂。 Linux 中的设备按照存取方式的不同,可以分为两种: 字符设备无缓冲且只能顺序存取块设备有缓冲且可以随机(乱序)存取 而按照是否对应物理实体,也可以分为两种: ... 阅读详情

相关推荐

DRM中render-node编号的分配

linux中render node的编号是如何分配确定的

大吉 3153

DRM 驱动程序开发(VKMS)

前言 距离上一篇《DRM 驱动程序开发(开篇)》已经过去快整整1年了,如果再不更新的话,这个 DRM 系列教程很可能就夭折了。之所以现在才写本文,主要有两个原因:1. 本人工作内容发生变动。2. 始终没找到合适的硬件平台来做示例讲解。其中第2点是我一直拖延的主要原因,因为作为示例教...

u014286440的博客 3546

QNX Hypervisor下Android DRM设备节点card0的驱动加载与DTS联动机制

本文深入解析了在QNX Hypervisor虚拟化环境中,Android虚拟机内DRM显示设备节点card0的生成机制。文章通过分析sysfs、驱动源码与设备树(DTS)配置,揭示了msm-cfg与msm-hyp-legacy驱动模块的联动加载顺序,以及DTS如何触发这一过程,最终由drm_dev_register函数创建设备节点,为上层图形栈提供标准接口。

weixin_29185199的博客 159

drm 学习笔记-2:DRM介绍

linux kernel最早是使用fbdev API来管理图形显示的framebuffer,但是不能满足基于GPU的现代3D硬件加速技术。这些设备通常需要在自己的内存中创建和管理command queue,以便将command分发给GPU进行渲染,并且还需要对内存进行管理如buffer和可用空间。最初,用户程序(如X Server)直接管理这些资源,但通常只有一个程序访问,当2个及以上程序同时访问相同硬件时,并以不同的方式设置每个硬件资源时大多数情况下会发生异常(图1)。图1。...............

一个走路缓慢的人 6741

VMware Workstation Pro虚拟化配置深度指南:Win11 VBS兼容与嵌套虚拟化实战

桌面虚拟化是现代开发、安全研究与系统教学的核心技术基础,其本质是通过CPU硬件虚拟化扩展(如Intel VT-x/AMD-V)与固件层抽象(UEFI/TPM模拟)构建可隔离、可复现的计算环境。关键技术原理涵盖嵌套虚拟化控制、Hypervisor协同机制(WHPX)、以及基于VBS(Virtualization-Based Security)的系统级安全策略冲突与绕过逻辑。这类能力直接决定工具在云原生调试、内核开发、攻防靶场等场景中的不可替代性。当前主流挑战集中于Windows 11 23H2/25H2更新后

weixin_34417183的博客 573

双RTX 4060 Ti 16GB本地大模型部署实战指南

本地大模型推理的核心瓶颈在于显存容量、PCIe带宽与推理框架协同效率。消费级GPU如RTX 4060 Ti 16GB凭借高显存带宽(512 GB/s)和完整Tensor Core支持,成为低成本突破7B–14B模型部署门槛的关键硬件;其技术价值体现在通过vLLM的张量并行、llama.cpp的GPU层卸载及Ollama环境变量调优,实现显存堆叠与计算分片;典型应用场景包括VS Code智能补全、Obsidian AI笔记、WebUI多轮对话调试等轻量生产服务;本文聚焦两卡协同下的真实系统配置、CUDA版本兼

weixin_34331102的博客 809

虚拟化GPU:从VFIO直通到客户机card0节点生成的完整技术解析

在虚拟化与云计算领域,GPU虚拟化是实现高性能图形渲染、AI计算和视频处理的关键技术。其核心原理在于通过IOMMU硬件支持,将物理GPU资源安全、高效地分配给虚拟机使用。从技术价值看,这解决了传统虚拟化中图形性能瓶颈,使得云桌面、云游戏和AI训练等场景能获得接近物理机的体验。具体实现上,VFIO(Virtual Function I/O)框架扮演了核心角色,它作为Linux内核的标准化设备直通方案,能够安全地将PCIe设备(如GPU)从宿主机解绑并传递给虚拟机。在应用场景中,结合KVM/QEMU虚拟化栈,通

weixin_34279579的博客 399

Kali Linux为何必须运行在虚拟机中?硬件兼容性与安全隔离原理

Kali Linux并非通用桌面发行版,而是一款面向渗透测试与安全研究的专用操作系统。其基于Debian Testing分支,采用高版本内核(如6.1.x)、启用实验性驱动、禁用Secure Boot,并预置大量调试符号——这些设计虽强化了工具链能力,却显著牺牲了物理硬件兼容性。在Intel第12/13代CPU、NVIDIA RTX 40系显卡及Windows 11 Hyper-V共存等典型场景下,裸机安装极易触发ACPI竞态、内核panic或VT-x劫持。虚拟机通过标准化vCPU/vNIC抽象层实现环境隔

weixin_30363981的博客 313

QEMU PowerPC 系统模拟器全机型实战指南:从 pSeries 到 PowerNV、ppce500 与经典桌面平台

PowerPC 是 QEMU 支持最悠久的架构之一,本文以 QEMU 官方文档的 PowerPC 系统模拟器章节([docs/system/target-ppc.rst](https://link.gitcode.com/i/9d2d50e34cba6999dab0d944eeb0f808))为骨架,系统梳理 QEMU 中全部 PowerPC 机型:半虚拟化服务器 pSeries(sPAPR)、裸

gitblog_00296的博客 334

Linux硬件诊断四层模型:从CPU温度到PCIe链路的精准排查

在Linux系统中,硬件信息获取并非简单执行命令,而是基于内核直报、设备驱动、固件接口和传感器代理四个技术层级的分层诊断过程。理解`lscpu`与`/proc/cpuinfo`在物理核心识别上的本质差异,掌握`sensors`对温度墙触发降频的实时监控能力,是定位性能瓶颈的关键。这类底层硬件可观测性能力,直接支撑服务器验货、NUMA调优、RAID兼容性验证及AI加速卡链路速率诊断等典型工程场景。尤其当出现CPU满载但实际频率偏低、磁盘I/O延迟异常或GPU利用率不足时,必须穿透逻辑视图,回归PCIe拓扑、S

weixin_33853827的博客 543

mtk-drm初始化

mtk-drm初始化走读

zhexingsunba的博客 4933

裸金属芯片适配:从ACPI/DT建模到固件信任链的全栈诊断

裸金属环境下的芯片适配,本质是操作系统与物理硬件建立可验证信任关系的过程。其核心原理涵盖ACPI/Device Tree对硬件拓扑的精准建模、内核启动阶段固件加载与签名校验机制、IOMMU使能与PCIe ACS能力配置等底层环节。技术价值在于规避‘Code 43’、VFIO接管失败、设备节点缺失等高频故障,支撑GPU透传、VPU加速、嵌入式外设驱动等关键场景。本文聚焦龙蜥(Anolis OS)实战经验,深入解析RK3588、NVIDIA A100、w25q32jvssiq等典型芯片在ACPI描述失真、固件信

weixin_33816946的博客 375

【信息科学与工程学】计算机科学与自动化——第一百八十七篇 网络安全中的学科知识03

本体建container_secure = run_as_nonroot ∧ cap_drop_all ∧ read_only_root ∧ seccomp_profile ∧ no_privileged。本体建container_secure = image_scan_pass ∧ distroless_base ∧ run_as_nonroot ∧ seccomp_profile ∧ pod_security_policy。攻击者通过钓鱼邮件、电话诈骗、USB诱饵、假冒身份等手段获取初始访问。

weixin_49199313的博客 242

LINUX DRM 入门一条龙

Linux DRM入门一条龙

weixin_45154862的博客 4068

Claude Code与Codex深度对比:终端AI编程助手选型指南

大语言模型驱动的AI编程助手已成为开发者提效的重要工具,它们基于自然语言交互,自动完成代码生成、重构和调试。这类工具依赖上下文理解与工程实践,不同产品在交互模式、模型接入和任务执行上差异显著。从终端CLI编程场景出发,梳理AI编程助手的设计原理与技术价值,重点对比Anthropic Claude Code与OpenAI Codex在安装配置、上下文管理、第三方模型接入(如DeepSeek)以及高频报错处理上的实际表现。无论你是新手还是资深工程师,理解这些差异有助于根据自身工作流选择合适工具,或在两者间灵活切

weixin_33755649的博客 3245

Linux中Hadoop 集群搭建

零、下载Hadoop: http://archive.cloudera.com/cdh5/cdh/5/?tdsourcetag=s_pctim_aiomsg 一、集群规划: 搭建的 hadoop 集群由 3 台服务器组成,分别叫做 master,salve1 和 slave2。其中 master 作为主节点,slave1 和 slave2 作为从节点。 二、网络配置: 1.查看 3 个节点的主机名...

白墨的小白博客 3992

DRM实例教程

DRM实例教程 DRM是一个显示驱动框架,也就是把功能封装成 open/close/ioctl 等标准接口,应用程序调用这些接口来驱动设备,显示数据。我们这里将从使用的角度来看看,怎么验证和使用DRM驱动。 DRM设备节点 DRM驱动会在/dev/dri下创建3个设备节点: card0 controlD64 renderD128 libdrm库 DRM驱动,对用户空间,提供了专门的的调用库libdrm.so,用户空间通过该库可以间接的调用和使用驱动。 打开设备 in..

浩瀚之水的专栏 4619

Win10+pycharm+conda 配置Siammask 过程记录(新手向)

我们跑动demo 需要配置两个相关的文件这两个文件需要用 git 进行下载,对于不熟悉git的小伙伴 我这里给出连接,大家可以直接下载即可,并将其配置在 experiments文件夹下然后大家再需要在设置参数参数这里给出了。

C1137577723的博客 551

计算机底层是如何访问显卡的?

1. 显卡驱动是怎么控制显卡的, 就是说, 使用那些指令控制显卡, 通过端口么? 2. DirectX 或 OpenGL 或 CUDA 或 OpenCL 怎么找到显卡驱动, 显卡驱动是不是要为他们提供接口的实现, 如果是, 那么DirectX和OpenGL和CUDA和OpenCL需要显卡驱动提供的接口都是什么, 这个文档在哪能下载到? 如果不是, 那么DirectX, OpenGL, CL, C

VMA_LMA的专栏 2774

AD在建PCB封装时如何添加元器件的3D模型

3D模型

k1ang的博客 1万+

【思博伦】史上最详细Spirent TestCenter测试仪2544套件使用图文教程精讲!图解超赞超详细!!!

Avalanche测试仪使用指南 摘要:本文介绍了Avalanche测试仪的基本配置和使用方法。该测试仪采用Linux内核系统,通过端口模拟客户端与服务器端,支持HTTP、DNS、FTP等多种协议。文章详细讲解了管理IP配置、端口占用、项目创建、客户端/服务器端的参数设置(包括负载模拟、行为配置、网段设置等),以及测试执行和结果查看的全流程。特别针对HTTP测试,说明了测试前的组网准备和注意事项,包括IP地址规划、License申请等。同时提供了2544套件的时延和吞吐量测试方法,包括参数配置技巧和结果分析

风云说通信 2280

/dev/dri/card0设备,10分钟讲清楚

是 Linux DRM 框架的核心设备节点,是用户空间控制图形硬件的入口。它承担着:显示输出的底层控制(分辨率、刷新率、页面翻转);Qt GUI 的硬件加速渲染(EGLFS + GBM);流媒体的编解码与显示协同(VCU + DRM 显存共享)。深入理解的 ioctl 操作和 DRM 框架,能帮助你优化流媒体的低延迟播放高画质显示,以及硬件资源的充分利用(如 ZynqMP 的 VCU 与 GPU 协同)。

jongden的专栏 1000

lammps教程:聚合物压缩,避免“bond atoms missing”

如果使用ms建模,聚合物的链会伸出到盒子外面,在导出data文件后,盒子外面的原子被周期性算法折叠进盒子对面,这就造成了边界附近的bond原子可能被分布到了盒子的两侧。并且,这个data文件不能使用npt系综进行压缩,npt系综必须使用周期性边界,在压缩时,bond原子同样会移动到对面的边界。所以,最好的解决办法是使用一个反射墙墙进行压缩,设置一个反射墙墙既可以实现压缩效果,也可以组织原子跨越box边界移动到对面。解决这个问题的原则只有一个:导出data时确保所有的bond原子没有跨越边界。

lammps_jiayou的博客 3819
上一篇: 利用systrace中跟踪binder通信过程
下一篇: 8155/8255/8295参数对比
norlan_jame
博客等级 码龄16年 4568粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值