首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核 MMU的工作原理

在没有使用虚拟地址的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储被读写。而使用了虚拟存储的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到内存管理单元— MMU。...16位的CPU总共能产生的地址范围是0~64K,按每页4K的大小计算,该空间必须被分成16个页。...如果处理器启用了MMU,CPU执行单元发出的内存地址将被 MMU 截获,从CPU到MMU 的地址称为虚拟地址,而MMU 将这个地址翻译成另一个地址,发到CPU芯片的外部地址引脚上,也就是将VA映射成了PA...操作系统和 MMU 是这样配合的:操作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写页表,然后用指令设置MMU,告诉MMU 页表在物理内存中的什么位置。...用户空间和内核空间 通常操作系统把虚拟地址划分为用户空间和内核空间,例如 X86平台的Linux 系统虚拟地址空间是0x00000000 - 0xFFFFFFFF,前3GB(0x00000000 - 0xBFFFFFFF

2.1K20

Linux内存管理之MMU的过程

在解释地址转换的本质前我们先理解下几个概念: TLB:MMU工作的过程就是查询页表的过程。如果把页表放在内存中查询的时候开销太大,因此为了提高查找效率,专门用一小片访问更快的区域存放地址转换条目。...「那么CPU是如何通过MMU和Cache来访问内存的呢?」 ? 可以看出虚拟地址和物理地址的转换关键是过程Table Walk Unit。...#include linux/module.h> #include linux/kernel.h> #include linux/init.h> #include linux/sched.h>...这个过程也是mmu的过程。 小结 我相信你已经对cpu通过MMU访问内存的本质有所掌握(还是不理解的话不要说认识我),而且通过linux的一个实验,对其软件模拟流程也有所感性的认识。...下一篇我们正式进入内存管理的大门——linux内存管理。

2.3K42
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux的异步通知接收中要注意使能顺序

    F_SETOWN,getpid()); 这句是设置异步通知要通知给谁 oflags = fcntl(fd,F_GETFL); fcntl(fd,F_SETFL,oflags|FASYNC); 这两句是使能异步通知...重点就是使能这部要放在最后。原因如下:如果使能放在前面,异步通知发生在使能之后,注册信号函数之前的话。由于找不到注册函数,系统会执行默认处理函数。就是会将进程终止。这样就发生故障,与预期不符。...SIGRTMIN); 是设置异步通知使用的信号是什么 oflags = fcntl(fd,F_GETFL); fcntl(fd,F_SETFL,oflags|FASYNC); 这两句是使能异步通知...重点如上,使能放在最后。 异步通知发送 异步通知发送分为两种,进程向进程发送和驱动向进程发送。 进程向进程发送 这个比较简单,使用kill函数就可以。

    1.1K20

    开放网络设备关键使能技术

    使用网络设备能像使用PC或服务器一样,选择A厂基于Intel处理器的硬件还是B厂基于AMD处理器的硬件,安装Windows或者Linux操作系统,决定权完全回归最终用户这一诉求从未变过,且随着网络设备白盒化理念的普及变得空前强烈...三、Switchdev 上文介绍的SAI框架属于linux用户态实现方案,Linux 内核4.0以前,内核态并没有对硬件交换芯片的支持。...Linux 4.0 引入了 switchdev 框架,全称是 Ethernet switch device driver model,它代表一类具有交换能力芯片的多网口设备的抽象,使内核将交换功能 offload...传统linux工具(命令)是否可用 这里传统linux工具(命令)更多是指网络设备相关的命令,比如ip、ethtool、brctl等。...挂靠的组织 SAI项目归属于OCP,关于OCP的介绍前文有述;switchdev项目归属于linux内核社区,更准确一些应该是linux基金会。 8.

    1.1K20

    深入理解Linux内核之mmu-gather操作

    1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 本文讲解Linux内核虚拟内存管理中的mmu_gather...相关的主要数据结构有三个: struct mmu_gather struct mmu_table_batch struct mmu_gather_batch 1)mmu_gather 来表示一次mmu...8,也就是local批次最大积聚8 * 4k = 32k的内存大小,这因为mmu_gather结构通常在内核栈中分配,不能占用太多的内核栈空间,而多批次由于动态分配批次积聚结构所以每个批次能积聚更多的页面...2.2 总体调用 通常mmu-gather操作由一下几部分函数组成: tlb_gather_mmu unmap_vmas free_pgtables tlb_finish_mmu 其中tlb_gather_mmu..., end); //刷mm的tlb,释放所有积聚物理页,释放所有积聚结构相关物理页 4.总结 Linux内核mmu-gather用于积聚解除映射的相关物理页面,并保证了刷tlb和释放物理页面的顺序。

    2.3K63

    第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)

    做准备      (3.5) 使能MMU并跳到__switch_data处,复制数据段,清除bss段,设置栈,调用start_kernel第一个C函数 1 创建内核source sight 工程 1.1...: (1) 关闭irq和fiq,设置svc管理模式 (2)判断是或支持这个CPU (3)判断是否支持这个单板(通过uboot传入的机器ID判断) (4)创建页表,为后面的MMU做准备 (5) 使能MMU...使能之后会跳转(jump)到__switch_data@ mmu has been enabled adr lr, __enable_mmu @ return (PIC)...address//使能MMU add pc, r10, #PROCINFO_INITFUNC 为什么使能MMU后会跳转到__switch_data?...在__enable_mmu函数中最后面可以看到使能MMU后,会将r13赋给PC,跳转到了__switch_data,代码如下: __enable_mmu: ... ....

    99170

    第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)

    做准备      (3.5) 使能MMU并跳到__switch_data处,复制数据段,清除bss段,设置栈,调用start_kernel第一个C函数 1 创建内核source sight 工程 1.1...: (1) 关闭irq和fiq,设置svc管理模式 (2)判断是或支持这个CPU (3)判断是否支持这个单板(通过uboot传入的机器ID判断) (4)创建页表,为后面的MMU做准备 (5) 使能MMU...使能之后会跳转(jump)到__switch_data@ mmu has been enabled adr lr, __enable_mmu @ return (PIC)...address//使能MMU add pc, r10, #PROCINFO_INITFUNC 为什么使能MMU后会跳转到__switch_data?...在__enable_mmu函数中最后面可以看到使能MMU后,会将r13赋给PC,跳转到了__switch_data,代码如下: __enable_mmu: ... ....

    1K60

    使程序在Linux下后台运行

    我们用的环境是用putty远程连接到日本Linux服务器。所以使程序在后台跑有以下三个好处: 1:我们这边是否关机不影响日本那边的程序运行。...二、怎么样使程序在后台执行 方法有很多,这里主要列举两种。假如我们有程序pso.cpp,通过编译后产生可执行文件pso,我们要使pso在linux服务器后台执行。...fg %n //将编号为n的任务转前台运行 # ctrl+z //挂起当前任务 # ctrl+c //结束当前任务 注:如果要使在前天执行任务放到后台运行,则先要用ctrl+z挂起该任务,然后用bg使之后台执行...附: 在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了: $ ..../test.sh 515 413 21734 0 11:49 pts/12 00:00:00 grep test 上面的试验演示了使用nohup/setsid加上&使进程在后台运行,

    4.3K31
    领券