爆款云主机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云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      linux源码解析13- 反向映射RAMP详解

      首页 知识中心 软件开发 文章详情页

      linux源码解析13- 反向映射RAMP详解

      2023-03-13 09:43:22 阅读次数:180

      linux

      1.什么是反向映射

      是一种物理地址反向映射虚拟地址的方法;

      正向映射:用户访问的虚拟地址,经过多级页表转化,最终映射到物理页面;

      反向映射:根据物理页面,找到所有映射到这个页面的虚拟地址的过程; linux源码解析13- 反向映射RAMP详解

      2.ramp出现的背景

      当物理内存短缺时: 虚拟内存常大于物理内存; 把暂时不用的物理内存swap到交换分区;

      3. 反向映射的应用场景

      3.1页面回收 同步内存回收:分配内存时,触发低水位; 异步内存回收:kswaped线程

      3.2 页面迁移 3.3 KSM

      4.RMAP相关的几个数据结构

      4.1 mm_struct

      mm_struct是进程task_struct中的一个成员,指向该进程的地址空间

      struct mm_struct {
      	struct {
      		///进程里所有vma形成的一个单链表,mmap是表头
      		struct vm_area_struct *mmap;		/* list of VMAs */ 
      		
      		///vma红黑树的根节点
      		struct rb_root mm_rb;                                  
      		
      #ifdef CONFIG_MMU
      		///判断虚拟内存空间是否有足够空间,返回一段没有映射过的虚拟空间起始地址
      		unsigned long (*get_unmapped_area) (struct file *filp,
      				unsigned long addr, unsigned long len,
      				unsigned long pgoff, unsigned long flags);  
      #endif
      		
      		pgd_t * pgd;  ///指向进程一级页表
      		atomic_t mm_count; ///mm_struct结构体的主引用计数
      		struct rw_semaphore mmap_lock; ///保护vma的读写信号量
      
      ///所有的mm_struct结构都连接到一个双向链表中,链表头是init_mm内存描述符
      		struct list_head mmlist; /* List of maybe swapped mm's.	These
      					  * are globally strung together off
      					  * init_mm.mmlist, and are protected
      					  * by mmlist_lock
      					  */
      
      		unsigned long start_code, end_code, start_data, end_data;   ///代码段,数据段的起始地址和结束地址
      		unsigned long start_brk, brk, start_stack;                  ///start_brk:堆空间的起始地址,brk:当前堆中vma的结束地址
      
      		...
      };
      

      4.2 vm_area_struct

      vm_area_struct是对一个内存段的抽象,简称vma,比如malloc分配一段内存,就会对应一个vma,一个代码段,数据段,都会对应一个vma;

      VMA是linux管理内存的重要抽象,基本上所有的内存段都是通过VMA来描述的;

      跟RMAP相关的,vma包含两个成员,anon_vma_chain, anon_vma;

      struct vm_area_struct {
      	/* The first cache line has the info for VMA tree walking. */
      	///VMA在进程地址空间内的起始地址,结束地址
      	unsigned long vm_start;		/* Our start address within vm_mm. */  
      	unsigned long vm_end;		/* The first byte after our end address within vm_mm. */
      
      	/* linked list of VM areas per task, sorted by address */
      	///进程的所有vma连接成一个链表
      	struct vm_area_struct *vm_next, *vm_prev;   
      
      	///每个进程的mm_struct都有一个红黑树,VMA作为一个节点,加入该红黑树
      	struct rb_node vm_rb; /// 
      
      	///指向vma所属进程的mm_struct
      	struct mm_struct *vm_mm;	/* The address space we belong to. */ 
      	
      	 ///vma的访问权限
      	pgprot_t vm_page_prot;  
      	
      	///描述该vma的一组标志位
      	unsigned long vm_flags;		/* Flags, see mm.h. */  
      
      	 ///指向avc
      	struct list_head anon_vma_chain; /* Serialized by mmap_lock &      * page_table_lock */
      
      	///指向anon_vma
      	struct anon_vma *anon_vma;	/* Serialized by page_table_lock */   
      
      	/* Function pointers to deal with this struct. */
      	///指向操作方法集合,常用在文件映射
      	const struct vm_operations_struct *vm_ops;   
      
      	/* Information about our backing store: */
      	///指定文件映射的偏移量,单位页
      	unsigned long vm_pgoff;		/* Offset (within vm_file) in PAGE_SIZE  
      					   units */
      	 ///指向映射的文件
      	struct file * vm_file;		/* File we map to (can be NULL). */ 
      
      	...
      
      } __randomize_layout;
      

      task_struct, mm_struct, vma的关系图: linux源码解析13- 反向映射RAMP详解

      4.3 anon_vma

      anon_vma,简单说,链接page和vma的桥梁,简称av;

      其关系图:

      linux源码解析13- 反向映射RAMP详解

       /**************************************************
       * func:链接物理页面的page结构和vma的vm_area_struct
       *************************************************/
      struct anon_vma {
      	///指向anon_vma结构的根节点
      	struct anon_vma *root;		/* Root of this anon_vma tree */   
      	
      	///保护anon_vma数据结构的读写信号量
      	struct rw_semaphore rwsem;	/* W: modification, R: walking the list */  
      
      	 ///引用计数
      	atomic_t refcount;   
      
      	///指向父anon_vma数据结构
      	struct anon_vma *parent;	/* Parent of this anon_vma */  
      
      	/* Interval tree of private "related" vmas */
      	///红黑树根节点,anon_vma内部有一颗红黑树
      	struct rb_root_cached rb_root;   
      
      	...
      };
      
      

      4.4 anon_vma_chain

      anon_vma_chain,链接vma和av的枢纽,简称avc;

      avc作用有两个: (1)链接本进程的vma和av的枢纽; (2)链接本进程的vma和父系进程的av的枢纽;

       /**************************************************
       * func:链接枢纽
       *************************************************/
      struct anon_vma_chain {
      	///指向vma,可以指向父进程,也可以指向子进程
      	struct vm_area_struct *vma;  
      
      	///指向anon_vma,可以指向父/子进程
      	struct anon_vma *anon_vma;    
      
      	///把avc添加到vma的avc链表中
      	struct list_head same_vma;   /* locked by mmap_lock & page_table_lock */  
      
      	 ///把anon_vma添加到anon_vma的红黑树中
      	struct rb_node rb;			/* locked by anon_vma->rwsem */              
      ...
      };
      

      5. rmap历史

      5.1 历史版本

      a.原始内核版本Linux2.4

      2.4版本,还没有RMAP机制,是如何解除映射关系呢? (1)从init_mm开始,遍历每一个进程; (2)遍历每一个进程所有的vma;

      就这样简单粗暴,其性能明显是无法满足现代机器性能需求的,不深入研究;

      b. Linux2.5版本引入rmap第一版:

      在page数据结构中,增加一个链表指针,保存所有映射的pte; linux源码解析13- 反向映射RAMP详解

      这个方法,简单,但是会浪费大量内存;

      c. Linux 2.6.11改进版的rmap

      增加一个av数据结构,将page的mapping成员指向av; av的红黑树保存所有vma;

      子进程的vma都添加到父进程的av链表中;

      文件映射rmap:非常高效

      linux源码解析13- 反向映射RAMP详解

      匿名映射rmap:不高效,锁竞争激烈

      linux源码解析13- 反向映射RAMP详解

      该方法简单,高效;但面临的挑战和缺陷:

      举个典型案例, 一个父进程fork了1000个子进程,每个子进程有1个vma,每个VMA里面有1000个匿名页面,当所有的子进程的VMA同时发生写时复制会是什么情况?

      RMAP释放page核心函数:

      try_to_unmap()
      	->rmap_walk()
      	->rmap_walk_anon()
      

      rmap_walk_anon函数里需要获取avp->lock锁,由于有100w个页面共享了这个avp,锁竞争会非常激烈;

      (1)很明显,锁的粒度太大了; (2)当子进程做rmap时,需要扫描所有vma,而链表上大部分vma并没有映射到这个页面上;且扫描过程是全程持有锁的,更加低效;

      5.2 Linux2.6.32 成熟的ramp方案

      增加一个avc,作为vma和av的枢纽;avc作用: (1)作为子进程vma和av的链接枢纽; (2)作为父系进程av和子进程vma链接枢纽; 按流程解析: (1)当一个进程建立好映射后, linux源码解析13- 反向映射RAMP详解

      (2)fork一个进程 linux源码解析13- 反向映射RAMP详解

      (3)子进程在fork孙进程 linux源码解析13- 反向映射RAMP详解

      源码解读:

      fork()--->dup_mmap()->anon_vma_fork()

      /***********************************************************************
       * func:为子进程创建av数据结构,并构建av链接关系
       * vma: 子进程vma
       * pvma: 父进程的vma
       ***********************************************************************/
      int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
      {
      	struct anon_vma_chain *avc;
      	struct anon_vma *anon_vma;
      	int error;
      
      	/* Don't bother if the parent process has no anon_vma here. */
      	if (!pvma->anon_vma)  ///若父进程没有av,就不需要绑定了
      		return 0;
      
      	/* Drop inherited anon_vma, we'll reuse existing or allocate new. */
      	vma->anon_vma = NULL;
      
      	/*
      	 * First, attach the new VMA to the parent VMA's anon_vmas,
      	 * so rmap can find non-COWed pages in child processes.
      	 */
      	error = anon_vma_clone(vma, pvma);  ///把子进程的vma(通过avc)绑定到父进程vma的av链表中
      	if (error)
      		return error;
      
      	/* An existing anon_vma has been reused, all done then. */
      	if (vma->anon_vma)  ///若子进程已经创建有anon_vma,说明绑定已完成
      		return 0;
      
      	/* Then add our own anon_vma. */ 
      	anon_vma = anon_vma_alloc();              ///分配子进程的av
      	if (!anon_vma)
      		goto out_error;
      	avc = anon_vma_chain_alloc(GFP_KERNEL);  ///分配子进程的avc
      	if (!avc)
      		goto out_error_free_anon_vma;
      
      	/*
      	 * The root anon_vma's rwsem is the lock actually used when we
      	 * lock any of the anon_vmas in this anon_vma tree.
      	 */
      	anon_vma->root = pvma->anon_vma->root;   ///子进程av的root,指向父进程av的root
      	anon_vma->parent = pvma->anon_vma;       ///子进程av的parent,指向父进程的av
      	/*
      	 * With refcounts, an anon_vma can stay around longer than the
      	 * process it belongs to. The root anon_vma needs to be pinned until
      	 * this anon_vma is freed, because the lock lives in the root.
      	 */
      	get_anon_vma(anon_vma->root);  ///增加父进程的anon_vma的_refcount
      	/* Mark this anon_vma as the one where our new (COWed) pages go. */
      	vma->anon_vma = anon_vma;
      	anon_vma_lock_write(anon_vma);
      	anon_vma_chain_link(vma, avc, anon_vma);    ///将子进程的avc分别添加到自己的av的rb, 和vma的avc链表中
      	anon_vma->parent->degree++;
      	anon_vma_unlock_write(anon_vma);
      
      	return 0;
      
       out_error_free_anon_vma:
      	put_anon_vma(anon_vma);
       out_error:
      	unlink_anon_vmas(vma);
      	return -ENOMEM;
      }
      
      int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src)
      {
      	struct anon_vma_chain *avc, *pavc;
      	struct anon_vma *root = NULL;
      
      ///遍历父进程vma中的avc链表,寻找avc实例
      	list_for_each_entry_reverse(pavc, &src->anon_vma_chain, same_vma) {
      		struct anon_vma *anon_vma;
      
      		avc = anon_vma_chain_alloc(GFP_NOWAIT | __GFP_NOWARN);     ///分配一个新的avc,作为链接父子进程的枢纽
      		if (unlikely(!avc)) {
      			unlock_anon_vma_root(root);
      			root = NULL;
      			avc = anon_vma_chain_alloc(GFP_KERNEL);
      			if (!avc)
      				goto enomem_failure;
      		}
      		anon_vma = pavc->anon_vma;
      		root = lock_anon_vma_root(root, anon_vma);
      		anon_vma_chain_link(dst, avc, anon_vma);      ///枢纽avc添加到父进程的rb,子进程的vma中avc链表中
      
      		/*
      		 * Reuse existing anon_vma if its degree lower than two,
      		 * that means it has no vma and only one anon_vma child.
      		 *
      		 * Do not chose parent anon_vma, otherwise first child
      		 * will always reuse it. Root anon_vma is never reused:
      		 * it has self-parent reference and at least one child.
      		 */
      		if (!dst->anon_vma && src->anon_vma &&
      		    anon_vma != src->anon_vma && anon_vma->degree < 2)
      			dst->anon_vma = anon_vma;
      	}
      	if (dst->anon_vma)
      		dst->anon_vma->degree++;
      	unlock_anon_vma_root(root);
      	return 0;
      
       enomem_failure:
      	/*
      	 * dst->anon_vma is dropped here otherwise its degree can be incorrectly
      	 * decremented in unlink_anon_vmas().
      	 * We can safely do this because callers of anon_vma_clone() don't care
      	 * about dst->anon_vma if anon_vma_clone() failed.
      	 */
      	dst->anon_vma = NULL;
      	unlink_anon_vmas(dst);
      	return -ENOMEM;
      }
      

      总结: (1)每个进程的vma中的av链表都保存所有子孙进程的avc;

      (2)每个新建进程,(除创建正常的vma,av,avc外)要针对每一个父进程(包括祖父进程,...),创建一个avc_x保存在上一级进程的av红黑树中;

      该avc_x也保存在本进程vma的avc链表中(供自己的子孙进程枚举,查找所有父系进程avc).

      将兄弟进程分开了管理;这样,就将锁的竞争粒度减小了,只有同一个父进程的子孙才会竞争,兄弟进程隔离开了;

      Linux 2.6.11版本的问题都得到解决: (1)只需要在子系进程中竞争锁,兄弟进程隔离开,锁粒度大大降低; (2)当发生写时复制时,新分配匿名页面cow_page->mapping指向子进程的AV结构,遍历时,不需要扫描所有子进程;

      有两个问题: 1.当某个子进程触发缺页中断时,发生了什么? 2.当需要回收某个page时,做了哪些如何处理?

      try_to_unmap()
      	->rmap_walk()
      	->rmap_walk_file
      	->vma_interval_tree_foreach()
      	rwc->rmap_one
      
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_7784550/6065491,作者:luteresa,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:前端工作总结268-根据时间戳处理接口

      下一篇:VB编程:统计字符个数-52

      相关文章

      2025-05-19 09:04:53

      查看RISC-V版本的gcc中默认定义的宏

      查看RISC-V版本的gcc中默认定义的宏

      2025-05-19 09:04:53
      c++ , linux
      2025-04-01 10:28:37

      小课2:筛选信息命令

      小课2:筛选信息命令

      2025-04-01 10:28:37
      bash , linux , 升序 , 服务器 , 运维
      2025-03-26 09:31:12

      shell脚本实现查询代码中定义了多少宏的方法

      shell脚本实现查询代码中定义了多少宏的方法

      2025-03-26 09:31:12
      bash , linux , 运维
      2025-03-06 09:15:26

      spring cloud系统安装涉及的技术说明

      spring cloud系统安装涉及的技术说明

      2025-03-06 09:15:26
      docker , linux , 安装 , 技术
      2025-03-05 09:24:43

      【Python】使用numpy库实现Tic-Tac-Toe井字棋

      【Python】使用numpy库实现Tic-Tac-Toe井字棋

      2025-03-05 09:24:43
      linux , 右键 , 安装 , 打开 , 输入
      2025-02-10 08:53:59

      【linux】linux C 程序 注册信号处理函数

      【linux】linux C 程序 注册信号处理函数  

      2025-02-10 08:53:59
      linux , 函数 , 注册 , 程序
      2025-01-17 09:07:21

      课时3:处理信息命令

      课时3:处理信息命令

      2025-01-17 09:07:21
      linux , shell , 数据库 , 服务器 , 运维
      2024-12-06 06:39:06

      SpringBoot项目在linux下部署脚本实例

      SpringBoot项目在linux下部署脚本实例

      2024-12-06 06:39:06
      linux , 示例 , 脚本
      2024-11-20 09:46:57

      Linux 系统日常巡检脚本

      Linux 系统日常巡检脚本,巡检内容包含了,磁盘,内存 cpu 进程 文件更改 用户登录等一系列的操作 直接用就行了

      2024-11-20 09:46:57
      java , linux
      2024-11-20 09:46:57

      提权工具推荐(PEASS-ng、linpeas_linux_amd64、winPEASany_ofs)

      提权工具推荐(PEASS-ng、linpeas_linux_amd64、winPEASany_ofs)

      2024-11-20 09:46:57
      linux , 服务器 , 运维
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5232244

      查看更多

      最新文章

      shell脚本实现查询代码中定义了多少宏的方法

      2025-03-26 09:31:12

      【Python】使用numpy库实现Tic-Tac-Toe井字棋

      2025-03-05 09:24:43

      【linux】linux C 程序 注册信号处理函数

      2025-02-10 08:53:59

      [接口测试 - http.client篇] 16 基于http.client之POM实战一下

      2024-09-25 10:15:32

      创建你的第一个webdriver python代码

      2024-09-25 10:15:15

      [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析

      2024-09-25 10:14:09

      查看更多

      热门文章

      程序员之路:Linux压缩命令

      2023-03-21 02:52:11

      Linux下查看进程线程数的方法

      2023-05-15 10:04:01

      Python编程:paramiko模块远程登录

      2023-02-21 08:02:44

      基于jenkins和jmeter实现接口自动化过程

      2023-06-08 06:18:44

      简单的内核编译安装图解

      2023-03-16 07:49:58

      linux网络编程初步

      2023-05-10 06:17:58

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

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

      天翼云电脑(公众版)

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

      对象存储

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

      云硬盘

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

      查看更多

      随机文章

      性能测试必备监控技能MySQL篇15

      linux实用技巧:在虚拟机vmware16软件上安装CentOs8.2虚拟机,重置可用源和安装输入法

      Linux 下查看某一个程序所使用的内存方法介绍

      WSL ERROR: CreateProcessEntryCommon:505: execvpe /bin/bash failed 2 问题解决办法(学习后总结)

      Linux脚本练习之script011-当执行程序时,让使用者选择 `boy` 或者 `girl`,如果使用者输入 `B` 或者 `b`,则显示 `He is a boy`。

      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号