爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【DPDK】Linux UIO技术

      首页 知识中心 其他 文章详情页

      【DPDK】Linux UIO技术

      2025-02-21 08:58:00 阅读次数:12

      dev,内核

      简介

      UIO(Userspace I/O)是运行在用户空间的I/O技术,Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题。

      原理图:

      UIO技术下,驱动在用户空间和内核空间的分布(小部分在内核空间、大部分在用户态空间)

      【DPDK】Linux UIO技术

      在UIO中,使用read/mmap在user space存取设备对应的内存区域;但是UIO还是有一小部分中断处理在内核中,这个个中断处理的主要职责是开关中断,并将中断计数值加一。户空间驱动要监测一个设备中断,它只需阻塞在对/dev/uioX的read()操作上, 当设备产生中断时,read()操作立即返回。

      内核态的职责:

      分配和记录设备需要的资源和注册uio设备
      使能设备
      申请资源
      读取并记录配置信息
      注册uio设备
      必须*在内核空间实现的小部分中断应答函数
      用户态职责:

      获取中断事件(read/poll)
      处理中断(读写数据)

      igb_uio

      igb_uio是Intel igb网卡驱动的UIO实现,分成igb_uio内核驱动、内核uio框架、uio用户态三部分。

      【DPDK】Linux UIO技术

       

      UIO驱动注册

      首先来看一个简单的UIO驱动代码,代码来自网上,非原创,旨在学习

      内核部分:

      【DPDK】Linux UIO技术

      /*
      
      * This is simple demon of uio driver.
      
      * Version 1
      
      *Compile:
      *    Save this file name it simple.c
      *    #echo "obj -m := simple.o" > Makefile
      *    #make -Wall -C /lib/modules/'uname -r'/build M='pwd' modules
      *Load the module:
      *    #modprobe uio
      *    #insmod simple.ko
      */
      
      
      
      #include <linux/module.h>
      #include <linux/platform_device.h>
      #include <linux/uio_driver.h>
      #include <linux/slab.h>
      
      
      /*struct uio_info { 
          struct uio_device   *uio_dev; // 在__uio_register_device中初始化
          const char      *name; // 调用__uio_register_device之前必须初始化
          const char      *version; //调用__uio_register_device之前必须初始化
          struct uio_mem      mem[MAX_UIO_MAPS];
          struct uio_port     port[MAX_UIO_PORT_REGIONS];
          long            irq; //分配给uio设备的中断号,调用__uio_register_device之前必须初始化
          unsigned long       irq_flags;// 调用__uio_register_device之前必须初始化
          void            *priv; //
          irqreturn_t (*handler)(int irq, struct uio_info *dev_info); //uio_interrupt中调用,用于中断处理
                                                                      // 调用__uio_register_device之前必须初始化
          int (*mmap)(struct uio_info *info, struct vm_area_struct *vma); //在uio_mmap中被调用,
                                                                      // 执行设备打开特定操作
          int (*open)(struct uio_info *info, struct inode *inode);//在uio_open中被调用,执行设备打开特定操作
          int (*release)(struct uio_info *info, struct inode *inode);//在uio_device中被调用,执行设备打开特定操作
          int (*irqcontrol)(struct uio_info *info, s32 irq_on);//在uio_write方法中被调用,执行用户驱动的
                                                              //特定操作。
      };*/
      
      struct uio_info kpart_info = {  
              .name = "kpart",  
              .version = "0.1",  
              .irq = UIO_IRQ_NONE,  
      }; 
      static int drv_kpart_probe(struct device *dev);
      static int drv_kpart_remove(struct device *dev);
      static struct device_driver uio_dummy_driver = {
          .name = "kpart",
          .bus = &platform_bus_type,
          .probe = drv_kpart_probe,
          .remove = drv_kpart_remove,
      };
      
      static int drv_kpart_probe(struct device *dev)
      {
          printk("drv_kpart_probe(%p)\n",dev);
          kpart_info.mem[0].addr = (unsigned long)kmalloc(1024,GFP_KERNEL);
          
          if(kpart_info.mem[0].addr == 0)
              return -ENOMEM;
          kpart_info.mem[0].memtype = UIO_MEM_LOGICAL;
          kpart_info.mem[0].size = 1024;
      
          if(uio_register_device(dev,&kpart_info))
              return -ENODEV;
          return 0;
      }
      
      static int drv_kpart_remove(struct device *dev)
      {
          uio_unregister_device(&kpart_info);
          return 0;
      }
      
      static struct platform_device * uio_dummy_device;
      
      static int __init uio_kpart_init(void)
      {
          uio_dummy_device = platform_device_register_simple("kpart",-1,NULL,0);
          return driver_register(&uio_dummy_driver);
      }
      
      static void __exit uio_kpart_exit(void)
      {
          platform_device_unregister(uio_dummy_device);
          driver_unregister(&uio_dummy_driver);
      }
      
      module_init(uio_kpart_init);
      module_exit(uio_kpart_exit);
      
      MODULE_LICENSE("GPL");
      MODULE_AUTHOR("IGB_UIO_TEST");
      MODULE_DESCRIPTION("UIO dummy driver");

      【DPDK】Linux UIO技术

      UIO的驱动注册与其他驱动类似,通过调用linux提供的uio API接口进行注册,在注册之前,所做的主要工作是填充uio_info结构体的信息,主要包括内存大小、类型等信息的填充。填充完毕后调用uio_register_device()函数,将uio_info注册到内核中。注册后,在/sys/class/uio/uioX,其中X是我们注册的第几个uio设备,比如uio0,在该文件夹下的map/map0会有我们刚才填充的一些信息,包括addr、name、size、offset,其中addr保存的是设备的物理地址,size保存的是地址的大小,这些在用户态会将其读出,并mmap至用户态进程空间,这样用户态便可直接操作设备的内存空间。

      用户态:

      【DPDK】Linux UIO技术

      #include <stdio.h>
      #include <fcntl.h>
      #include <stdlib.h>
      #include <unistd.h>
      #include <sys/mman.h>
      #include <errno.h>
      
      #define UIO_DEV "/dev/uio0"
      #define UIO_ADDR "/sys/class/uio/uio0/maps/map0/addr"
      #define UIO_SIZE "/sys/class/uio/uio0/maps/map0/size"
      
      static char uio_addr_buf[16]={0};
      static char uio_size_buf[16]={0};
      
      int main(void)
      {
          int uio_fd,addr_fd,size_fd;
          int uio_size;
          void *uio_addr, *access_address;
          int n=0;
          uio_fd = open(UIO_DEV,O_RDWR);
          addr_fd = open(UIO_ADDR,O_RDONLY);
          size_fd = open(UIO_SIZE,O_RDONLY);
          if(addr_fd < 0 || size_fd < 0 || uio_fd < 0){
              fprintf(stderr,"mmap:%s\n",strerror(errno));
              exit(-1);
          }
      
          n=read(addr_fd,uio_addr_buf,sizeof(uio_addr_buf));
          if(n<0){
              fprintf(stderr, "%s\n", strerror(errno));
              exit(-1);
          }
          n=read(size_fd,uio_size_buf,sizeof(uio_size_buf));
          if(n<0){
              fprintf(stderr, "%s\n", strerror(errno));
              exit(-1);
          }
          uio_addr = (void*)strtoul(uio_addr_buf,NULL,0);
          uio_size = (int)strtol(uio_size_buf,NULL,0);
      
          access_address = mmap(NULL,uio_size,PROT_READ | PROT_WRITE,
                                  MAP_SHARED,uio_fd,0);
          if(access_address == (void*)-1){
              fprintf(stderr,"mmap:%s\n",strerror(errno));
              exit(-1);
          }
      
          printf("The device address %p (lenth %d)\n"
              "can be accessed over\n"
              "logical address %p\n",uio_addr,uio_size,access_address);
      /*
          access_address = (void*)(long)mremap(access_address, getpagesize(),uio_size + getpagesize()+ 11111, MAP_SHARED);
      
          if(access_address == (void*)-1){
              fprintf(stderr,"mremap: %s\n",strerror(errno));
              exit(-1);
          }
      
          printf(">>>AFTER REMAP:""logical address %p\n",access_address);
      */
          return 0;
      }

      【DPDK】Linux UIO技术

      代码很简单,就是讲刚才那几个文件读出来,并且重新mmap出来,最后将其打印出来。由此我们可以简单的看到,想要操作uio设备,只需要重新mmap,而后我们便可操作一般的内存一样操作设备内存,那么dpdk的实现也是类似的,只不过更加复杂一点。

      dpdk的uio实现的内核的代码主要在igb_uio.c中,整理一下主要的代码:

      【DPDK】Linux UIO技术

      static struct pci_driver igbuio_pci_driver = {
          .name = "igb_uio",
          .id_table = NULL,
          .probe = igbuio_pci_probe,
          .remove = igbuio_pci_remove,
      };
      
      module_init(igbuio_pci_init_module);
      
      static int __init
      igbuio_pci_init_module(void)
      {
          int ret;
      
          ret = igbuio_config_intr_mode(intr_mode);
          if (ret < 0)
              return ret;
      
          return pci_register_driver(&igbuio_pci_driver);
      }
      
      
      
      #if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
      static int __devinit
      #else
      static int
      #endif
      igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
      {
          struct rte_uio_pci_dev *udev;
      
          udev = kzalloc(sizeof(struct rte_uio_pci_dev), GFP_KERNEL);
          if (!udev)
              return -ENOMEM;
      
          /*
           * enable device: ask low-level code to enable I/O and
           * memory
           */
          if (pci_enable_device(dev)) {
              printk(KERN_ERR "Cannot enable PCI device\n");
              goto fail_free;
          }
      
          /*
           * reserve device's PCI memory regions for use by this
           * module
           */
          if (pci_request_regions(dev, "igb_uio")) {
              printk(KERN_ERR "Cannot request regions\n");
              goto fail_disable;
          }
      
          /* enable bus mastering on the device */
          pci_set_master(dev);
      
          /* remap IO memory */
          if (igbuio_setup_bars(dev, &udev->info))
              goto fail_release_iomem;
      
          /* set 64-bit DMA mask */
          if (pci_set_dma_mask(dev,  DMA_BIT_MASK(64))) {
              printk(KERN_ERR "Cannot set DMA mask\n");
              goto fail_release_iomem;
          } else if (pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(64))) {
              printk(KERN_ERR "Cannot set consistent DMA mask\n");
              goto fail_release_iomem;
          }
      
          /* fill uio infos */
          udev-> = "Intel IGB UIO";
          udev->info.version = "0.1";
          udev->info.handler = igbuio_pci_irqhandler;
          udev->info.irqcontrol = igbuio_pci_irqcontrol;
      #ifdef CONFIG_XEN_DOM0
          /* check if the driver run on Xen Dom0 */
          if (xen_initial_domain())
              udev->info.mmap = igbuio_dom0_pci_mmap;
      #endif
          udev->info.priv = udev;
          udev->pdev = dev;
          udev->mode = RTE_INTR_MODE_LEGACY;
          spin_lock_init(&udev->lock);
      
          /* check if it need to try msix first */
          if (igbuio_intr_mode_preferred == RTE_INTR_MODE_MSIX) {
              int vector;
      
              for (vector = 0; vector < IGBUIO_NUM_MSI_VECTORS; vector ++)
                  udev->msix_entries[vector].entry = vector;
      
              if (pci_enable_msix(udev->pdev, udev->msix_entries, IGBUIO_NUM_MSI_VECTORS) == 0) {
                  udev->mode = RTE_INTR_MODE_MSIX;
              }
              else {
                  pci_disable_msix(udev->pdev);
                  printk(KERN_INFO "fail to enable pci msix, or not enough msix entries\n");
              }
          }
          switch (udev->mode) {
          case RTE_INTR_MODE_MSIX:
              udev->info.irq_flags = 0;
              udev->info.irq = udev->msix_entries[0].vector;
              break;
          case RTE_INTR_MODE_MSI:
              break;
          case RTE_INTR_MODE_LEGACY:
              udev->info.irq_flags = IRQF_SHARED;
              udev->info.irq = dev->irq;
              break;
          default:
              break;
          }
      
          pci_set_drvdata(dev, udev);
          igbuio_pci_irqcontrol(&udev->info, 0);
      
          if (sysfs_create_group(&dev->dev.kobj, &dev_attr_grp))
              goto fail_release_iomem;
      
          /* register uio driver */
          if (uio_register_device(&dev->dev, &udev->info))
              goto fail_release_iomem;
      
          printk(KERN_INFO "uio device registered with irq %lx\n", udev->info.irq);
      
          return 0;
      
      fail_release_iomem:
          sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
          igbuio_pci_release_iomem(&udev->info);
          if (udev->mode == RTE_INTR_MODE_MSIX)
              pci_disable_msix(udev->pdev);
          pci_release_regions(dev);
      fail_disable:
          pci_disable_device(dev);
      fail_free:
          kfree(udev);
      
          return -ENODEV;
      }

      【DPDK】Linux UIO技术

      代码经过整理后,对比上面简单的uio驱动实现,dpdk的uio实现也是首先初始化一个pci_driver结构体,在igbuio_pci_init_module()函数中直接调用linux提供的pci注册API,pci_register_driver(&igbuio_pci_driver),接着便跳到igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)函数中,这个函数的功能就是类似于上面例子中内核态代码,rte_uio_pci_dev结构体是dpdk自己封装的,如下:

      【DPDK】Linux UIO技术

      //在igb_uio自己封装的
      struct rte_uio_pci_dev {
          struct uio_info info;
          struct pci_dev *pdev;
          spinlock_t lock; /* spinlock for accessing PCI config space or msix data in multi tasks/isr */
          enum igbuio_intr_mode mode;
          struct msix_entry \
              msix_entries[IGBUIO_NUM_MSI_VECTORS]; /* pointer to the msix vectors to be allocated later */
      };

      【DPDK】Linux UIO技术

      可以看到,里面有uio_info这个结构体,从igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)函数代码中可以看到,主要是在填充uio_info结构体的信息,并且围绕的也是pci设备的物理地址及大小,最后调用linux提供的uio注册接口uio_register_device(&dev->dev, &udev->info),完成整个uio注册

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/bandaoyu/article/details/118811395,作者:bandaoyu,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【VS】VS工程设置(包含目录、库目录、附加包含目录、附加库目录、附加依赖项)等

      下一篇:【SSH】Server responded “Algorithm“ negotiation failed“ Key exchange with the remote host failed.

      相关文章

      2025-03-31 08:57:38

      webpack 开启热加载

      webpack 开启热加载

      2025-03-31 08:57:38
      bundle , dev , js , webpack , 加载
      2025-03-27 09:41:58

      linux挂载磁盘

      linux挂载磁盘

      2025-03-27 09:41:58
      data , dev , 命令 , 挂载
      2025-03-24 08:46:07

      idea2023的git从dev分支合并到主分支master

      idea2023的git从dev分支合并到主分支master

      2025-03-24 08:46:07
      dev , git , master , 分支 , 远程
      2025-03-04 09:13:56

      C语言:从操作系统到自动驾驶,揭秘其不可替代的技术统治力

      C语言:从操作系统到自动驾驶,揭秘其不可替代的技术统治力

      2025-03-04 09:13:56
      C++ , 内核 , 实现 , 算法 , 语言
      2025-02-26 07:23:02

      【RDMA】2. 比较基于Socket与RDMA的通信

      【RDMA】2. 比较基于Socket与RDMA的通信

      2025-02-26 07:23:02
      CPU , RDMA , Socket , 内存 , 内核
      2025-02-26 07:22:11

      【RDMA】降CPU除RDMA (vbers)还有VMA ?|使用socket进行RDMA编程?

      【RDMA】降CPU除RDMA (vbers)还有VMA ?|使用socket进行RDMA编程?

      2025-02-26 07:22:11
      RDMA , socket , 内核 , 网卡
      2025-02-21 08:58:12

      【Linux】磁盘分区|磁盘管理|/dev/sda|/dev/sdb|UUID

      【Linux】磁盘分区|磁盘管理|/dev/sda|/dev/sdb|UUID

      2025-02-21 08:58:12
      dev , 分区 , 文件系统 , 硬盘 , 磁盘
      2025-02-21 08:56:43

      webpack进阶-环境变量

      想要消除 webpack.config.js 在 开发环境 和 生产环境 之间的差异,你可能需要环境变量(environment variable)。

      2025-02-21 08:56:43
      dev , webpack , 使用 , 安装 , 模块 , 版本
      2025-02-21 08:56:43

      【Linux】Linux内核学习--- 学习中

      【Linux】Linux内核学习--- 学习中

      2025-02-21 08:56:43
      Linux , 内核 , 文件系统 , 模块 , 硬件 , 调度 , 进程
      2025-02-12 09:25:49

      初始操作系统篇(2)—— 操作系统的运行环境与体系结构

      初始操作系统篇(2)—— 操作系统的运行环境与体系结构

      2025-02-12 09:25:49
      CPU , 中断 , 内核 , 指令 , 操作系统
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5264876

      查看更多

      最新文章

      webpack 开启热加载

      2025-03-31 08:57:38

      linux挂载磁盘

      2025-03-27 09:41:58

      idea2023的git从dev分支合并到主分支master

      2025-03-24 08:46:07

      webpack进阶-环境变量

      2025-02-21 08:56:43

      【epoll】形象的解释epoll|一句话讲透epoll

      2025-02-11 09:36:24

      npm 引入vue-resource

      2025-01-17 09:06:18

      查看更多

      热门文章

      深入理解Linux启动过程

      2023-05-12 07:20:42

      &>/dev/null表示的意思

      2023-05-08 10:02:32

      git dev 分支merge到master

      2023-05-05 10:13:08

      indent用法,linux内核编码风格

      2023-06-19 06:58:36

      Linux内核设计与实现(10)---内核同步介绍

      2023-06-16 06:12:13

      Linux内核之IO4:块I/O流程与I/O调度器

      2023-05-30 08:06:30

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Linux内核之进程6: 深度睡眠

      linux挂载磁盘

      磁盘挂载报错/dev/sdb1 is apparently in use by the system

      各浏览器内核JS运行速度比较

      详解:Linux内核在arm上的启动过程

      Linux内核及发行版

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号