首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 内核 内存管理】内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )

文章目录 一、物理地址空间 二、外围设备寄存器 三、外围设备寄存器物理地址 映射到 虚拟地址空间 一、物理地址空间 ---- " 物理地址空间 “ 是 CPU 处理器 在 ” 总线 " 上 访问内存的地址..., RISC 处理器 只能访问 物理地址空间 , 系统的 外围设备 与 物理内存 都使用 统一的物理地址空间 访问 ; RISC 全称 " Reduced Instruction Set Computer..., 参考 【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init...外围设备寄存器 一般是 连续编址 的 , 三、外围设备寄存器物理地址 映射到 虚拟地址空间 用户空间 的 应用进程 , 访问 " 外围设备寄存器 " 只能通过 " 虚拟地址 " 实现 , Linux...内核 提供了 相关 API 函数 , 将 " 外围设备寄存器 “ 对应的 ” 物理地址映射到了 ” 虚拟地址空间 " 中 ;

3.1K20

Linux下内存空间分配、物理地址与虚拟地址映射

一、Linux内核动态内存分配与释放 1.1 kmalloc函数 Kmalloc分配的是连续的物理地址空间。...返回值:解除成功返回0,否则返回-1 2.2 Linux内核的mmap接口 2.2.1 内核描述虚拟内存的结构体 Linux内核中使用结构体vm_area_struct来描述虚拟内存的区域,其中几个主要成员如下...三、​ IO地址空间映射 3.1 ioremap函数 ioremap将一个IO地址空间映射内核的虚拟地址空间上去,便于访问。...IO地址; size:要映射空间的大小; flags:要映射的IO空间的和权限有关的标志; phys_addr:是要映射的物理地址 size:是要映射的长度,单位是字节 头文件:#include 功能:将一个IO地址空间映射内核的虚拟地址空间上去,便于访问; 实现:对要映射的IO地址空间进行判断,低PCI/ISA地址不需要重新映射,也不允许用户将IO地址空间映射到正在使用的RAM

2.9K31

Linux地址空间&&虚拟地址

此时计算机的体系结构中还存在一个页表,页表它的主要功能是负责将地址空间中的虚拟地址和物理地址之间建立映射关系。...每个进程都要有自己独立的地址空间,那么操作系统就得管理很多个进程的地址空间,而地址空间本质上就是内核中的一个数据结构对象。...然后把修改之前的数据拷贝到新空间中,再把新的物理地址和之前的物理地址相比较,把新的物理地址放在子进程的页表中,重新构建映射,页表的右侧就指向新的物理地址空间,这个工作结束,才会就行让子进程执行写入操作,...地址空间 2.1 理解地址空间 地址空间本质是内核的一个struct结构体,结构体里面有各种各样的区域划分,内部有很多的属性都是表示start,end的范围。...所以虚拟地址相同而物理地址不同。 3. 进程调度 Linux中的nice值并不是能任意调度的,而是从-20到19,这40个数字之间变换。

10410

Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

文章目录 一、虚拟地址空间布局架构 二、用户虚拟地址空间划分 一、虚拟地址空间布局架构 ---- 在 64 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 64 位的虚拟地址..., 最大只支持 48 位的虚拟地址 , 64 位地址太大 , 并不需要那么大的内存空间 ; " ARM64 架构 " 中 , Linux 系统的 " 内核虚拟地址 “ 与 ” 用户虚拟地址 "...是等同的 ; 用户虚拟地址 : 0x 0000 0000 0000 0000 ~ 0x 0000 FFFF FFFF FFFF , 48 位有效地址 ; 内核虚拟地址 : 0x FFFF 0000...0000 0000 ~ 0x FFFF FFFF FFFF FFFF , 48 位有效地址 ; 二、用户虚拟地址空间划分 ---- Linux 操作系统 进程 的 " 用户虚拟空间 " 起始地址...内核源码的 LINUX-4.12\arch\arm64\include\asm\memory.h#86 中 , 定义了 TASK_SIZE 与 TASK_SIZE_64 宏 ; VA_BITS 是编译内核

7K20

Linux】进程地址空间

文章目录 一、前言 二、什么是进程地址空间 三、进程地址空间如何进行管理 四、为什么会存在进程地址空间 五、进程地址空间区域的严格划分 一、前言 学习Linux系统编程一共要翻越三座大山 – 进程地址空间...实际上操作系统会给每一个进程都创建一个独立的虚拟地址空间,然后通过页表将虚拟地址空间与物理内存一一对应 (映射),我们用户只能得到虚拟地址空间中的虚拟地址,当我们修改虚拟地址中的数据时,操作系统会先通过页表找到对应的物理内存...再修改子进程的页表映射关系,最后再修改新空间中 g_val 的值,上述过程叫做 写时拷贝。...所以和管理进程一样,操作系统会使用一种内核数据结构来对地址空间进行管理,Linux中用于 管理地址空间内核数据结构叫做 mm_struct,操作系统会为每个进程创建一个 mm_struct 对象,然后通过管理结构体对象来间接管理进程地址空间...,在32位操作系统下,这部分空间占总空间的3/4,即3G;剩下的1G属于内核空间

3.8K00

内核地址空间大冒险:系统调用

2 神秘的长者 “欢迎来到内核地址空间!”,一位白胡子老头向我走了过来。 “敢问长者是谁”,我有点紧张。 ? “年轻人别怕,你是第一次来这里吧,难怪看着眼生。...“到后来,一些新出现的帝国文明,像咱们的Linux帝国,还有Windows帝国等等,为了安全考虑,一方面把普通应用程序和帝国自身程序分开,普通应用程序执行的地方叫用户态地址空间,而帝国核心程序运行的地方叫内核地址空间...还设立一个特殊通道,类似于虫洞,连接用户空间内核空间。...“这个叫线程的内核堆栈,每个应用程序的线程都有两个堆栈,一个在用户空间,一个在内核空间。...这个呢就是你在内核空间的堆栈啦,专门供你在内核空间来办事的时候使用的,因为用得少,加上内核空间的资源宝贵,所以比你之前那个小了很多”,大叔解答了我的疑惑。 ? “哦,原来如此啊,多谢大叔。

57410

Linux】进程地址空间

显示相同地址,却是不同的值 下面在Linux上验证 创建test.c文件 st.c  ⮀...,CPU会自动根据页表将虚拟地址转化为物理地址 创建子进程,就要创建子进程的PCB,及地址空间和页表结构 子进程的相关内核数据结构的属性字段会继承父进程 大富翁 A有个儿子是E,A跟E说,我们家有10...个亿是你爷爷的,所以E要继承给他10亿的大饼 所以子进程在虚拟地址处也有对应的地址 正常来说,子进程要对value对修改,把value变成200,父进程通过映射关系找到value,读到200 但因为进程具有独立性...,子进程对数据的修改,不影响父进程 子进程要对value修改时,在内存中重新申请一块空间,拷贝value值给新空间,重新映射指向新开辟的空间,导致不影响父进程的value值 ,最终将新开辟的空间value...,在地址空间中申请空间,在页表处只填写虚拟地址,物理地址处不填写,就不需要在物理地址处申请空间,过一会,进程尝试对空间写入,在重新申请空间映射关系创建好,整体机制被叫做 缺页中断 8.

2.9K10

内核地址空间大冒险:系统调用

2 神秘的长者 “欢迎来到内核地址空间!”,一位白胡子老头向我走了过来。 “敢问长者是谁”,我有点紧张。 ? “年轻人别怕,你是第一次来这里吧,难怪看着眼生。...“到后来,一些新出现的帝国文明,像咱们的Linux帝国,还有Windows帝国等等,为了安全考虑,一方面把普通应用程序和帝国自身程序分开,普通应用程序执行的地方叫用户态地址空间,而帝国核心程序运行的地方叫内核地址空间...还设立一个特殊通道,类似于虫洞,连接用户空间内核空间。...“这个叫线程的内核堆栈,每个应用程序的线程都有两个堆栈,一个在用户空间,一个在内核空间。...这个呢就是你在内核空间的堆栈啦,专门供你在内核空间来办事的时候使用的,因为用得少,加上内核空间的资源宝贵,所以比你之前那个小了很多”,大叔解答了我的疑惑。 ? “哦,原来如此啊,多谢大叔。

67010

Linux 内核 内存管理】虚拟地址空间布局架构 ⑤ ( Linux 内核中对 “ 虚拟地址空间 “ 的描述 | task_struct 结构体源码 )

文章目录 一、Linux 内核中对 " 虚拟地址空间 " 的描述 二、task_struct 结构体源码 一、Linux 内核中对 " 虚拟地址空间 " 的描述 ---- 进程 的 " 虚拟地址空间 "...由 mm_struct 和 vm_area_struct 两个数据结构描述 ; mm_struct 是 “最高层次 " 上描述 ” 整个虚拟地址空间 “ 的结构体 ; 该结构是对 ” 整个 “ ” 用户空间..." 进行描述 ; vm_area_struct 是 " 较高层次 " 上的描述 " 虚拟地址空间 " 的区间 的 ; 每个进程只有 1 个 mm_struct 结构体数据 , 用于描述 整个 "...虚拟地址空间 " ; 则 对应的 " 进程描述符 task_struct " 中 , 有 1 个指针指向 mm_struct 结构体 ; task_struct -> mm_struct -> vm_area_struct...内核源码的 linux-4.12\include\linux\sched.h#483 位置 ; task_struct 中的 mm active_mm 是 描述 " 整个虚拟空间 " mm_struct

3.6K20

linux之用户空间内核空间

linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。...Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。...而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。...虽然内核空间占据了每个虚拟空间中的最高1GB字节,但映射到物理内存却总是从最低地址(0x00000000)开始。...对内核空间来说,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫做PAGE_OFFSET。 内核空间和用户空间之间如何进行通讯?

3.8K20

Linux内核笔记之中断映射

硬中断和虚拟中断号 在Linux 内核笔记之高层中断处理一文中,介绍了ARM gic中断控制器对于硬中断的处理过程。...对于软件工程师而言,我们不需要care是中断哪个中断控制器的第几个中断号, 因此linux kernel提供了一个虚拟中断号的概念。...irq_domain 接下来讨论硬件中断号是如何映射到虚拟中断号的linux kernel提供irq_domain的管理框架, 将hwirq映射到虚拟中断号上。...irq_domain映射类型 线性映射 线性映射保留一张固定的表,通过hwirq number来索引.当hwirq被映射后, 会相应地分配 一个irq_desc, IRQ number就被存在表中。...irq_domain分配的内存大小为sizeof(*domain) + (sizeof(unsigned int) * size), (sizeof(unsigned int) * size)大小的空间是用于

5K30

内核地址空间大冒险4:线程切换

sleep系统调用 我是一个线程,生活在Linux帝国。一直以来辛勤工作,日子过得平平淡淡,可今天早上发生了一件事让我回想起来都后怕。...进入sleep()函数后,又来到了nano_sleep()函数,接着看到了一个syscall系统调用指令,我继续执行,来到了内核空间。...context_switch 看到我回来,长者起身言道:“小伙子,回来啦,走,带你们去context_switch()” 进入这个context_switch()之后,长者又带着我又做了一些准备工作,比如把当前的进程地址空间换成了小...告别了长者,我和小T踏上了这神秘的switch_to,跟随着一步一步的指令,我把自己线程上下文的寄存器都保存到了我的内核栈上面,然后将栈指针指向了小T的内核栈,最后把小T保存在他内核栈的指令地址加载进指令寄存器...我小心翼翼的执行了这里的代码,只是简单输出了一行日志,然后来到了一个叫__restore_rt()的函数,又一条syscall指令摆在了我的面前,我没有犹豫再一次一头扎进了内核空间

80220

内核地址空间大冒险3:权限管理

前情回顾: 我通过open这个系统调用虫洞来到了内核空间,又在老爷爷的指点下来到了sys_open的地盘,即将开始打开文件的工作。...详情参见:内核地址空间大冒险:系统调用 1 open系统调用链 我是一个线程,出生在这个Linux帝国。 在老爷爷的指点下,通过系统调用表来到了这个叫sys_open的地方。...也不在那里,是在task_struct->cred里面的,这个cred就是你的凭证,来咱们内核空间办事儿,到处都要检查,你可要收好了,弄丢了就麻烦了” ? “那现在怎么办?...Access Control List),访问控制列表的意思,在UGO的基础上,可以单独记录一些细粒度的权限信息,比如指定组外某一个特殊用户允许对文件的访问,这些信息就构成了一个访问控制列表,把这个表的地址放到了...“我们是Linux帝国进程分组控制管理部下辖的devices部门,在此奉命检查你是否有权限访问对应的设备,请配合我们的工作”,阿虎严肃正经的回答。

41410

Linux系统-进程地址空间

Linux进程地址空间 零、前言 一、程序内存空间 二、进程地址空间 1、引入及概念 2、进程地址空间 3、相关问题 零、前言 本章主要讲解学习进程地址空间的知识 一、程序内存空间 在学习C/C...++中我们知道了程序内存的空间开辟以及内存分区的基本概念 示图: 各分区作用: 内核空间:用户代码无法读写 命令行参数环境变量:储存命令行参数环境变量 栈区:存放运行函数而分配的局部变量...、函数参数、返回数据、 返回地址等,栈区地址向下生长 共享区:储存文件映射,匿名映射,动态库 堆区:存放动态分配的变量,堆区地址向上生长 数据段(初始化数据/未初始化数据区):存放全局变量...,没有发生改变 对于变量内容不一样,但地址值是一样的,说明该地址绝对不是物理地址,因为是物理地址根本不会有这种事发生 2、进程地址空间 概念: 在Linux地址下,这种地址叫做 虚拟地址...,这些虚拟地址通过页表映射与物理内存建立联系 程序执行流程: 程序运行,进程被加载到CPU上,系统在内核为进程创建PCB记录进程属性,分配进程空间地址,由页表构建虚拟地址与物理地址映射关系,程序查找或者修改数据会通过

3.8K30

DPDK巨页地址管理Linux内核内存管理内存映射pagemaprdma内存注册

DPDK巨页地址管理/Linux内核内存管理/内存映射/pagemap/rdma内存/注册术语PFN: 物理地址对应的页帧号:pfn = pte_pfn(*pte)INFINIBAND_USER_MEM...请求特定大小的大页面您可以在调用 mmap() 时通过传递一个标志来手动指定所需的页面大小:mmap内存映射原理mmap内存映射的实现过程,总的来说可以分为三个阶段:(一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域...)插入进程的虚拟地址区域链表或树中(二)调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系5、为映射分配了新的虚拟地址区域后,通过待映射的文件指针,在文件描述符表中找到对应的文件描述符...7、内核mmap函数通过虚拟文件系统inode模块定位到文件磁盘物理地址。8、通过remap_pfn_range函数建立页表,即实现了文件地址和虚拟地址区域的映射关系。...9、进程的读或写操作访问虚拟地址空间这一段映射地址,通过查询页表,发现这一段地址并不在物理页面上。因为目前只建立了地址映射,真正的硬盘数据还没有拷贝到内存中,因此引发缺页异常。

18410

Linux之进程地址空间

因此,这个地址只能是虚拟地址(线性地址)。在Linux中,特殊情况,我们将这种地址也成为逻辑地址。 2.感性的理解虚拟地址空间 从前有一个大富翁,他有10亿美元的资产。...为了给进程画饼(让进程认为自己独占操作系统资源),操作系统为每个进程都创建了独立的地址空间地址空间的内容通过页表映射到物理内存中这样每个进程都能独立的运行。...对于磁盘内编译过的可执行程序中的地址不叫虚拟地址,而是叫做逻辑地址。当然对于Linux而言,虚拟地址、线性地址、逻辑地址都是一样的。...而地址空间也是需要用内核数据结构mm_struct进行管理,OS会为每一个进程创建一个mm_struct(结构体)对象,进行管理。该结构体对象保存在它所对应进程的PCB中。...3-4G是内核空间。 总结 以上就是今天要讲的内容,本文介绍了进程地址空间的相关概念。

16820
领券