IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Arm64 linux Virtual memory分析 -> 正文阅读

[系统运维]Arm64 linux Virtual memory分析

Memory layout

ARM32 memory layout

?

ARM32 虚拟地址设定:

  1. 用户地址空间: 0~3G
  2. 内核地址空间:3G+16M ~ 4G

内核的虚拟地址只有 1G空间,对于需要访问4G 范围地址是不够的,因此对于内核而言,kmalloc, vmalloc 建立ZONE_DMA, ZONE_NORMAL 的线性映射,而对于剩下的部分,内核需要时 remap 到ZONE_HIGHMEM, 用完释放掉以便其它模块复用,从而利用4G 空间。

用户空间,则实际只访问了3G 空间,它映射到 ZONE_HIGNMEM 物理地址空间。

ARM64 memory layout

?

ARM64 的虚拟地址足够大,通常使用 48bit 来描述地址范围

用户地址:0x0000 0000 0000 0000 0000 0000 0000 0000 ~ 0x0000 7fff ffff ffff ffff ffff ffff ffff

内核地址:0xffff 8000 0000 0000 0000 0000 0000 0000 ~ 0xffff ffff ffff ffff ffff ffff ffff ffff

如果地址落在上面两个范围之外,则说明地址异常。

虚拟地址描述

加载ELF 创建 vm_area_struct

?对于一个进程,其虚拟地址的 vma ,如 stack, heap, data, bin 等都是在 load elf binary 过程中加载实现的,对于 stack, heap, bss 这些是通过 map anonymous memory 建立 vma, 而对于 data,text 则主要是 map file 实现的。

vm_area_struct 在进程中描述

?

Linux 对于每个线程,它用 task_struct 来进行描述,对于除了 Kthread的线程之外,都有一个 mm_struct, 它描述进程的虚拟内存空间,对于虚拟地址中的每个部分,都使用一个结构体 struct vm_area_struct 来描述。

在进程中, vm_area_struct 彼此之间通过双向链表关联起来,同时在 mm_struct 中 mm_rb用来快速查找一个 vma.

  • 遍历 vma 方式
static void dump_task_vma(struct task_struct *tsk)
{
   struct mm_struct *mm = tsk->mm;
   struct vm_area_struct *vma;
   unsigned long flags;
   char perm[BUFLEN] = {0};
   int count;                                                                                                       

   for (vma = mm->mmap; vma; vma = vma->vm_next) {
   
   }

mmap

函数

void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
                  
int munmap(void *addr, size_t length);

建立函数的映射和解除映射。

对于映射,其参数解释:

  1. Addr: 映射地址
  2. Length: 映射内存长度
  3. Prot: 映射内存属性
  4. Flags: 映射的 map shared 还是 map private
  5. Fd: 映射的文件
  6. Offset: 映射的文件的偏移,anonymous 映射时一般为0

映射示意

?

对于文件映射,其基本流程是:

  1. File 读到 dram 作为 page cache
  2. 通过 mmu 建立 physical address 和 virtual address 的映射
  3. 用户通过指针即可对文件进行读写操作

对于mmap 本身而言,read/write 是需要用户自己进行并发控制的。

映射时序

建立映射基本要点:

  1. 通过 mmap 传递的 fd, offset, length, prot, flags 等参数,在 virtual memory area 中找到一个 gap 满足需求的地址范围
  2. 使用 vm_area_alloc 分配一个 vma
  3. 将 vma 添加到 rbtree 中去

Vma 如何分配 page?

Pagefault 映射

这里仅从宏观上分析vma 的page建立方式,?关于pgfault 具体细节分析,我们下次继续。

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:56:34  更:2022-09-13 11:59:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:24:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码