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

Linux内核管理-那些鲜为人知秘密

,而管理是在虚拟内存管理中尤为重要,本文主要以回答几个管理中关键性问题来解析Linux内核管理,看一看管理中那些鲜为人知秘密。...1)地址转换 将虚拟地址转换为物理地址 2)权限管理 管理cpu对物理访问,如读写执行权限 3)隔离地址空间 隔离各个进程地址空间,使其互不影响,提供系统安全性 打开mmu后,对没有映射虚拟内存访问或者有映射但是没有访问权限都会发生处理器异常...Linux内核为何使用多级?...2.找到L0级转换,然后从虚拟地址中获得L0索引,通过L0索引找到相应表项(arm64中称为L0描述符,内核中叫做PGD表项),从表项中获得L1转换基地址。...5.找到L3级转换,然后从虚拟地址中获得L3索引,通过L3索引找到表项(arm64中称为描述符,内核中叫做表项)。

1.7K21

Linux-3.14.12内存管理笔记【建立内核(3)

前面已经分析了内核准备工作以及内核低端内存建立,接着回到init_mem_mapping()中,低端内存建立后紧随着还有一个函数early_ioremap_page_table_range_init...page_table_kmap_check(),其入参调用one_page_table_init()是用于当入参pmd没有指向时,创建并使其指向被创建。...,如果是,则把其pte内容拷贝到page_table_range_init()申请空间中,并将newpte新页地址设置到pmd中(32bit系统实际上就是全局目录),然后调用__flush_tlb_all...为了避免前期可能对固定映射区已经分配了表项,基于临时内核映射区间要求连续性保证,所以在此重新申请连续空间将原内容拷贝至此。...值得注意是,与低端内存初始化不同是,这里只是被分配,相应PTE项并未初始化,这个工作将会交由以后各个固定映射区部分相关代码调用set_fixmap()来将相关固定映射区与物理内存关联

1.5K11
您找到你想要的搜索结果了吗?
是的
没有找到

Linux-3.14.12内存管理笔记【建立内核(1)】

前面已经分析过了Intel内存映射和linux基本使用情况,已知head_32.S仅是建立临时,内核还是要建立内核,做到全面映射。...建立内核前奏,了解两个很关键变量: max_pfn:最大物理内存页面帧号; max_low_pfn:低端内存区(直接映射空间区内存)最大可用帧号; max_pfn 值来自setup_arch...Linux是一个支持多硬件平台操作系统,各种硬件芯片分页并非固定2级(全局目录和),仅仅Intel处理器而言,就存在3级情况(全局目录、中间目录和),而到了64位系统时候就成了4...所以Linux为了保持良好兼容性和移植性,系统设计成了以下4级分页模型,根据平台环境和配置情况,通过将上级目录和中间目录索引位设置为0,从而隐藏了三级目录和中间目录存在。...此外还有一个准备操作,在setup_arch()函数中调用缓冲区申请操作: early_alloc_pgt_buf(): 【file:/arch/x86/mm/init.c】 void __init

1.8K41

内核知识第八讲,PDE,PTE,目录,内存管理

内核知识第八讲,PDE,PTE,目录,内存管理 一丶查看GDT....详情请看 https://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 转载 三丶分页管理机制 讲解分页管理机制之前,我们要明白以下几个关键词意思...我们说过,操作系统为了隔离内存.采用了分页管理.而我们线性地址转化到物理地址时候. 则需要查表. 那么我们觉着这个应该怎么做?...首先我们CR3寄存器保存了首地址. 这里有一个目录,还有关键词. 目录: 也称为PDE,而称之为PTE....PDE大小:   目录,存储在一个4K字节物理中,其中每一项是4个字节.保存了地址.   而最大是1M个. PTE大小.   PTE大小也和PDE一样.

1.4K10

Linux内存描述之概述--Linux内存管理(一)

而内存管理其他地方则认为他们就是在处理一个(伪)NUMA系统. 2.2 Linux物理内存组织形式 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点...接着各个节点又被划分为内存管理区域, 一个管理区域通过struct zone_struct描述, 其被定义为zone_t, 用以表示内存某个范围, 低端范围16MB被描述为ZONE_DMA, 某些工业标准体系结构中...一个管理区(zone)由struct zone结构体来描述,在linux-2.4.37之前内核中是用typedef struct zone_struct zone_t数据结构来描述) 对于x86_32..., 首先建立管理zone_table....每个物理由一个struct page数据结构对象来描述

6.8K30

Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中内存管理模块 | 分配器 | 不连续分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 缓存 | 高速缓存 )

文章目录 一、Linux 内核中内存管理模块 二、硬件设备内存管理 一、Linux 内核中内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 错误异常处理 ② 管理 ③ 引导内存分配器...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请 " 不连续物理 “ 可以 映射到 ” 连续虚拟 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...: 控制管理 被 进程 占用 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理 , 需要通过 整理内存碎片 并迁移数据 得到 连续 物理 ; 内存回收 : 内存不足时 ,...回收内存 ; ⑦ 回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元..." ( MMU ) 中 , 还有一个 " 缓存 " ; 缓存 中缓存了 最近使用 " 映射 “ , 该映射作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

1.4K40

Linux内存描述之高端内存--Linux内存管理(五)

4 管理 4.1 管理 Linux采用4KB框大小作为标准内存分配单元。...内核必须记录每个状态,这种状态信息保存在一个类型为page描述符中,所有的描述存放在mem_map中 virt_to_page(addr)产生线性地址对应描述符地址。...由于CPU对内存非一致性访问,系统物理内存被划分为几个节点(每个节点描述符为pg_data_t),每个节点物理内存又可以分为3个管理区:ZONE_DMA(低于16M框地址),ZONE_NORMAL...每个管理区又有自己描述符,描述了该管理区空闲框,保留页数目等。每个描述符都有到内存节点和到节点管理连接(被放在flag高位字段)。...通常情况下,这个空间是 4M 大小,因此仅仅需要一个即可,内核通过来 pkmap_page_table 寻找这个

12.2K22

系统内存管理:虚拟内存、内存分段与分页、缓存TLB以及Linux内存管理

当程序访问一个虚拟地址时,操作系统会通过段选择子从段中找到对应描述符,然后根据段描述符中信息计算出物理地址。具体映射过程如下:程序访问虚拟地址,通过段选择子找到对应描述符。...虚拟地址与物理地址之间通过进行映射,存储在CPU内存管理单元(MMU)中,从而CPU可以直接通过MMU找到实际访问物理内存地址。...这是因为程序执行过程中,访问表项相对固定。通过利用TLB,可以大大提高地址转换速度,加快程序执行效率。Linux内存管理Linux内存管理涉及逻辑地址和线性地址转换。...逻辑地址是程序使用地址,而线性地址是通过段式内存管理映射地址,也称为虚拟地址。Linux虚拟地址空间分为内核空间和用户空间两部分。...Linux内存管理涉及逻辑地址和线性地址转换,将虚拟地址空间分为内核空间和用户空间,方便进程访问内核空间内存。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

47280

Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、

引出) 1.虚拟存储技术是操作系统管理进步体现(可怜进程不知道自己已经被画饼了) 虚拟内存是计算机系统内存管理一种技术。...2.进程访问物理空间方式更为安全(拦截非法请求) 1....进程无法直接接触物理内存,只能通过虚拟地址依靠映射物理地址方式,来间接访问物理内存。...因为虚拟地址是包含所有的地址,也就是4GB空间,虽然是虚拟,但是进程可以使用呀,所以如果进程在虚拟地址中访问了某个本不该属于当前进程地址,接下来在通过映射到物理地址这个阶段中,就会拦截进程非法访问地址请求...,所以这时候虚拟地址空间和也就随之而生了。

1.4K20

Linux电源管理(11)_Runtime PM之功能描述

因为从个人角度讲,我很推崇使用RPM进行日常动态电源管理,而不是suspend机制。 软件工程基本思想就是模块化:高内聚和低耦合。...很不幸,到目前为止,linux kernelruntime PM还是很复杂。这里复杂,不是从实现角度,而是从对外角度。...这就是当前Linux kernel电源管理中“Opportunistic suspend”和RPM两种机制并存原因。...4. runtime PMAPI汇整 RPM提供API位于“include/linux/pm_runtime.h”中,在这里先浏览一下,目的有二:一是对前面描述RPM运行机制有一个感性认识;二是为后面分析...由3.3描述可知,很多RPM请求都是异步,这些请求会挂到一个名称为“pm_wq”工作队列上,这个函数目的,就是清空这个队列,另外如果有resume请求,同步等待resume完成。

2.3K20

多级好处

,如果只使用了一个,一个表项大小为4byte,32位系统有4GB物理空间(一个进程看到是4GB大小虚拟空间),每一个表项对应着物理空间第xxx(4KB大小),那么应该有4GB/4KB=...如果是二级,规则就会改变,让二级对应到物理内存上4KB大小,一级此时变成映射为物理地址4MB(这样子是无法定位到具体(4KB),所以二级再去找),这样先找到一级,一级再和二级进行结合...,二级表相当于一级4MB分成了1024个(1KB个)4KB,找完后二级充当了offset角色,此时定位到具体4KB页面,再用一级offset一结合定位到具体物理地址。...这样一个进程浪费掉空间是一级占用:(4GB/4MB)*4byte=4KB,二级浪费掉是1kb(1个一级占用这么多)*1kb(此时有1kb(4GB/4MB)个一级)=4MB,加起来是...4MB+4KB,比光用一级要多4KB,但是2级是可以不存在,比如此时程序只用了%20,那么4MB就需要乘以%20,这样一下子就比只有一级时少了。

1.6K30

Linux内存描述之内存区域zone--Linux内存管理(三)

任何种类数据都可以存放在任框中, 没有任何限制. 但是Linux内核又把各个物理内存节点分成个不同管理区域zone, 这是为什么呢?...一个管理区(zone)由struct zone结构体来描述,在linux-2.4.37之前内核中是用typedef struct zone_struct zone_t数据结构来描述管理类型用zone_type...一个管理区(zone)由struct zone结构体来描述(linux-3.8~目前linux4.5),而在linux-2.4.37之前内核中是用struct zone_struct数据结构来描述...如果空闲数目低于pages_min = watermark[WMARK_MIN], 则内存页面非常紧张, 回收工作压力就比较大 4.3 内存域标志 内存管理域zone_t结构中flags字段描述了内存域的当前状态...后面将描述。 5 管理zone_table与管理区节点映射 内核在初始化内存管理区时, 首先建立管理zone_table. 参见mm/page_alloc.c?

9K31

Linux内存描述之内存节点node--Linux内存管理(二)

CPU访问本地内存速度比访问远程内存速度要快 Linux适用于各种不同体系结构, 而不同体系结构在内存管理方面的差别很大....SPARSEMEM */ struct page *node_mem_map; /* 指向page实例数组指针,用于描述结点所有物理内存,它包含了结点中所有内存域。..., 内核需要使用内存(另外,还需要保留部分内存用于初始化内存管理子系统) 为解决这个问题,内核使用了自举内存分配器 此结构用于这个阶段内存管理 */...; /* 指向page实例数组指针,用于描述结点所有物理内存,它包含了结点中所有内存域。...实例数组指针, 用于描述结点所有物理内存.

7.6K20

Linux内存描述之内存页面page--Linux内存管理(四)

1 Linux如何描述物理内存 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点(node), 内存则被分簇, 每个CPU对应一个本地物理内存, 即一个...接着各个节点又被划分为内存管理区域, 一个管理区域通过struct zone_struct描述, 其被定义为zone_t, 用以表示内存某个范围, 低端范围16MB被描述为ZONE_DMA, 某些工业标准体系结构中...简单来说, 是一个数据块, 可以存放在任何框(内存中)或者磁盘(被交换至交换分区)中 我们今天就来详细讲解一下linux下物理描述 2 帧 内核把物理作为内存管理基本单位....flag 用来存放状态,每一位代一种状态,所以至少可以同时表示出32中不同状态,这些状态定义在linux/page-flags.h中 virtual 对于如果物理内存可以直接映射内核系统,...page状态和其他信息 */ 这些标识是独立于体系结构, 因而无法通过特定于CPU或计算机信息(该信息保存在中) 3.1 页面到管理区和节点映射 在早期linux-2.4.18内核中,

8K11

Linux从头学16:操作系统-如何把【目录和】当做普通物理进行操作

目录 问题描述 CPU接收是线性地址,不是物理地址 对目录进行"自操作" 一级查表:构造线性地址前十位 二级查表:构造线性地址中间十位 三级查表:构造线性地址最后十二位 三个地址段合体...对进行"自操作" 在 x86 系统中,内存管理分页机制是非常重要,在Linux操作系统相关各种书籍中,这部分内容也是重笔浓彩。...如果你看过 Linux 内核相关书籍,一定对下面这张图又熟悉、又恐惧: 这是 Linux 系统中,处理单元多级查询方式。...那就是:在操作系统构造目录和时候,如何对它们自身进行寻址和操作? 这部分内容,也是内存管理中比较复杂地方,就好比一名医生给病人做手术,但是病人却是“医生自己”。...详细讨论过程,请参考上一篇文章:Linux从头学15:【目录和】-理论 + 实例 + 图文最完全、最接地气详解!。

1.5K20

在文章中显示摘要方法 可用做文章描述

刚刚在论坛里有人“问怎么样把添加文章时所填“文章摘要”内容变为该文章描述(即description) ”,以下是解决方法: 1、在根目录include/model/log_model.php(大概在...124行)找到 'template' => $row['template'], 在后面加入 'excerpt' => $row['excerpt'], 2、然后在echo_log.php中你需要调用地方加入...> 另一种方法实现文章描述调用摘要方法:1不变,找到根目录include/controller中(大概86行) $site_description = extractHtmlData($log_content..., 90); 把其中log_content改为excerpt即可,其中90为字符数,如果不需要截取和清除格式,请直接把上代码改为 $site_description = $excerpt;

82510

Linux内核19-中断描述IDT初始化

至此,我们已经理解了X86架构如何在硬件层面如何处理中断和异常,那么接下来,我们看看Linux内核管理这些中断和异常。 同所有的设备一样,我们在使能硬件之前,必须先初始化其相关数据结构。...而Linux使用中断描述IDT记录管理所有的中断和异常。那么,首先,Linux内核应该把IDT起始地址写入idtr寄存器,然后初始化所有的表项。这一步在初始化系统时完成。...因为汇编指令int允许用户进程发送任意编号中断(0-255)。为此,IDT初始化必须考虑阻止由用户进程int指令引发非法中断和异常。可以通过将中断描述DPL域设为0来实现。...让我们看看Linux如何实现这种策略。 中断、陷阱和系统门 在之前文章中,我们已经介绍过,Intel提供了三种类型中断描述符:任务,中断和陷阱门描述符。...一旦Linux启动,IDT会被搬运到RAM受保护区域并被第二次初始化,因为Linux不会使用任何BIOS程序。 IDT结构被存储在idt_table中,包含256项。

85910
领券