问题: /etc/sysconfig/network-scripts / ifcfg-ens33文件只读 在修改ifcfg-ens33文件后进行保存时提示为只读型不能保存 cat /etc/sysconfig
写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW缺页异常。...(src_mm, addr, src_pte)将父进程的页表项修改为只读, pte = pte_wrprotect(pte)将子进程的即将写入的页表项值修改为只读(注意:修改之前pte为父进程原来的pte...entry = pte_mkdirty(entry); 3804 } 程序走到上面的判断说明:页表项存在,物理页存在内存,但是vma是可写,pte页表项是只读属性(这就是fork的时候所作的准备...2291 cache中刷新页 2292行 由vma的访问权限和新页的页描述符来构建页表项的值 2293行 设置页表项值属性为脏和可写(如果vma有可写属性,这个时候将页表项修改为了可写,fork的时候修改为只读这个地方修改了回来...,并将父子进程对应的页表项修改为只读,当有一方试图写共享的物理页,由于页表项属性是只读的会发生COW缺页异常,缺页异常处理程序会为写操作的一方分配新的物理页,并将原来共享的物理页内容拷贝到新页,然后建立新页的页表映射关系
在Linux内核中,因为跟踪脏页会涉及到文件回写、缺页异常、反向映射等技术,所以本文也重点讲解在Linux内核中如何跟踪脏页。...3)脏页回写时,会通过反向映射机制,查找映射这个页的每一个vma, 设置相应进程的页表项为只读,清脏标记。...因为页表项为只读,所以写访问会发生写时复制缺页异常,异常处理中将处理共享文件页映射,重新将相应进程的页表项为设置为脏、可写。...这时可以直接写访问文件页,不会发生缺页。 2)脏页已经回写时(确切的说是调用clear_page_dirty_for_io之后),页描述符已经清除了脏标记,页表项已经清除了脏标记,且只读。...,回写之前(clear_page_dirty_for_io完成之前),页表项的脏标志是置位的,回写的时候(clear_page_dirty_for_io的调用)会通过反向映射机制将所有映射这个页的页表项的脏标志位清零并设置只读权限
想删除掉那一行,可是文件保存的时候提示只读属性 Read-only file system 实验过用 (1)chmod +w /etc/fstab (2):w!...文件还是只读,不能够修改 方法 #mount -n -o remount,rw / 然后就可以保存了 重启电脑系统就恢复正常了。上面的问题的出现是因为我自己分区格式设置的问题。
作者:Cheetah老师一直从业于半导体行业,他曾为U-boot社区和Linux内核社区提交过若干补丁。...在迁移页面的时候,如果是映射页,会调用try_to_unmap将映射这个物理页的每个页表项修改为迁移类型表项。...图:反向映射应用之脏页跟踪(1) 图:反向映射应用之脏页跟踪(2) 第三个场景是脏页跟踪,对于共享的文件页,由于文件页被多个进程共享,linux内核通过页表项的“脏”标记跟踪页面为脏。...每一次回写时,都会调用clear_page_dirty_for_io函数,这个函数会通过反向映射将映射这个页面的每个页表项都修改为只读并清脏标记。...再次访问时,发生写实复制缺页异常,异常处理中再次设置页表项为脏、可写,从而跟踪了脏页。 图:反向映射应用场景之访问跟踪 还有个场景是访问跟踪,linux内核通过页表项的“访问”标记跟踪页面被访问。
, 设置为只读 *to_page_table = this_page; //将源页表项存进目的页表项 if (this_page...也就是说,只有对于非内核地址空间的页面,才会将被fork共享的页面所对应的页表项设为只读,从而在最后一次写操作的时候,将源页面释放。...而对于内核地址空间的地址共享,只将进程1的页目录的属性设置为只读,而源目录表项(进程0)依然是可读写的。...//如果是主内存区 *from_page_table = this_page;//源页表项也要设置为只读 this_page -=...,但是对应的页表项是只读的,因此进程产生一次写保护错误,内核将给进程分配一个新的物理页面,将共享页面的内容复制过来,新的页面将设置为可读写,而共享页面仍然是只读的。
Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 ) 在 Linux 中大页分为两种:Huge pages ( 标准大页 ) 和 Transparent...内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为 4096 bytes 即 4K。1MB 内存等于 256 页;1GB 内存等于 256000 页。...Huge Pages Huge pages 是从 Linux Kernel 2.6 后被引入的,目的是通过使用大页内存来取代传统的 4kb 内存页面, 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能...Transparent Huge Pages Transparent Huge Pages 缩写 THP ,这个是 RHEL 6 开始引入的一个功能,在 Linux6 上透明大页是默认启用的。...No Swapping: We must avoidswapping to happen on Linux OS at all Document 1295478.1.
Linux中有后备文件支持的页称为文件页,如属于进程的代码段、数据段的页,内存回收的时候这些页面只需要做脏页的同步即可(干净的页面可以直接丢弃掉)。...2.内核原理 下面我们从Linux内核的层面来解析发生以上神奇现象的原理。...5标签处:通过发生缺页的虚拟地址来计算出页表项的地址保存在 vmf->pte。 最11标签处:将4标签初组合出的页表项的值写入到5标签初计算出的页表项中。...在2标签处判断页表项的属性是否是只读。在3标签处进行实际的写时复制处理。...4)第一次读匿名页后,然后写匿名页,先只读方式映射到0页,然后发生写时复制,分配物理页,虚拟页以可读可写的方式映射到此物理页。
也可以发现编译器将.text和.rodata 放在一个段中,然后用一个程序头表项来描述,段的类型为load(需要加载到进程地址空间), Flags为只读可执行。...这里当我们写只读数据的时候,即是执行buf[0] = 'a'语句的时候,假如buf[0] 地址所在的虚拟页还没有映射物理页(没有填写相关页表), 那么arm64处理器将发生转换表错误的异常(实际上,如果先读只读数据...,就像代码中写那样,那么就首先建立了只读数据的虚拟页和物理页的页表映射,然后再次进程写访问的时候,就会发生访问权限错误的异常),将进入linux内核的异常处理的路径中: el0_sync //arch...合法修改只读数据 上面几节我们详细分析了,修改只读数据为何发生段错误的过程和原因,那么下面我们就想合法修改只读数据怎么办,我们直观上知道需要修改只读数据的页表属性为可写,但是需要在改写页表之前需要保证页表已经存在...那么我们下面的代码通过两种方式来修改只读数据的页表,一种是我们通过访问一个字符设备来修改页表(字符设备驱动程序所作的工作就是遍历各级页表,然后将相关的叶子表项修改为可写),一种是通过mprotect来实现
有没有小伙伴也是跟我一样电脑上同时装有 Windows 和 Linux 双系统的呢?...但是对于还不太熟悉 Linux 的小伙伴来说,起初总是会踩到各种各样的坑。...平时的时候看看剧打打机啥的就进去 Windows,敲代码做项目的时候就进去 Linux。在 Linux 的时候,就直接挂载 NTFS 格式的那个 D 盘,因为我的代码都在那个盘里。...这时候再回到 Linux 中重新挂载这个 D 盘时,就不会出现只读不能写的情况了。 说到这里,我得唠嗑几句。...这次遇到的坑,其实算不上什么坑,并且我们得承认 Linux 的这个数据保护措施做的很到位,如果我在 Windows 中将电脑休眠了而在 Linux 中还能正常读写的话,那个后果是可想而知的。
伙伴系统分配算法 在上一节, 我们介绍了Linux内核怎么管理系统中的物理内存....但有时候内核需要分配一些物理内存地址也连续的内存页, 所以Linux使用了 伙伴系统分配算法 来管理系统中的物理内存页....在Linux内核中, 把两个物理地址相邻的内存页当作成伙伴, 因为Linux是以页面号来管理内存页的, 所以就是说两个相邻页面号的页面是伙伴关系....Linux内核使用 free_area[i] 管理 2i 个内存页面大小的内存块列表....在后面的Linux版本中改进了这个问题.
,而页表管理是在虚拟内存管理中尤为重要,本文主要以回答几个页表管理中关键性问题来解析Linux内核页表管理,看一看页表管理中那些鲜为人知的秘密。...,造成每个进程都认为自己拥有所有虚拟内存的错觉;通过页表给一段内存设置只读属性,那么就不容许修改这段内存内容,从而保护了这段内存不被改写;对应用户进程地址空间映射的物理内存,内核可以很方便的进行页面迁移和页面交换...Linux内核为何使用多级页表?...2)Linux内核 填写页表,将页表基地址告诉mmu 内核初始化建立内核页表,实现缺页异常等机制为用户任务按需分配并映射页表。 当然,内核也可以遍历页表,如缺页异常时遍历进程页表。 10....12.页表遍历过程 下面以arm64处理器架构多级页表遍历作为结束(使用4级页表,页大小为4K): Linux内核中 可以将页表扩展到5级,分别是页全局目录(Page Global Directory,
大页表的好处: 省内存:可以解决分页机制占用内存的问题,取得和多级页表一样节省内存的效果; 对TLB友好:大页表意味着地址转换时需要更少的页表映射表项,页表映射表项少了意味着TLB缓存的表项少,这样就提高了...因此,在这里稍微调整了实现—告诉Linux在第一级有2048个条目,每个都是8字节。二级页表包含两个连续排列的硬件PTE表项,前面的表项是包含Linux需要的状态信息的Linux PTE。...也就是说ARM页表设置时将权限设置为只读,当向页面写入时,会触发缺页异常(Linux PTE页面表项标记了可写权限,但是ARM硬件页面表项是只读权限),在缺页异常处理函数handle_pte_fault...,Linux使用的表项即r0所指内存,ARM硬件使用的表项地址是r0+2048。...寄存器r1表示要写入内存的Linux PTE表项的内容,其属性bit位设置均使用L_前缀的宏定义。 第一句语句将Linux PTE设置到r0指向的内存。
作者 | JiekeXu 大家好,我是JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 Linux 透明大页 THP 和标准大页 HP 目 录 标准大页(HugePages) 透明大页(Transparent...在 Linux 中大页分为两种: Huge pages (标准大页) 和 Transparent Huge pages(透明大页)。...标准大页(HugePages) 标准大页(HugePages)是从 Linux Kernel 2.6 后被引入的,Huge Pages 可以称为大内存页或者大页面,有时候也翻译成大页/标准大页/传统大页...透明大页存在的问题: Oracle Linux team 在测试的过程中发现,如果 linux 开启透明大页 THP,则 I/O 读写性能降低 30%;如果关闭透明大页 THP,I/O 读写性能则恢复正常...因此,Oracle 建议在所有 Oracle 数据库服务器上禁用透明大页,以避免性能问题。 Linux7 默认情况下是开启透明大页功能的。检查系统对应版本。
二级页表地址旺射的最小单位有4K、1K,Linux使用4K。 一级页表项里的内容,决定了它是指向一块物理内存,还是指问二级页表,如下图: ?...2.1, 一级页表映射过程 一线页表中每一个表项用来设置1M的空间,对于32位的系统,虚拟地址空间有4G,4G/1M=4096。所以一级页表要映射整个4G空间的话,需要4096个页表项。...个1M,所以找到页表里第0x123项,根据此项内容知道它是一个段页表项。...根据此项内容知道它是一个二级页表项。...③ 从这个表项里取出地址,假设是address,这表示的是二级页表项的物理地址; ④ vaddr[19:12]表示的是二级页表项中的索引index即0x45,在二级页表项中找到第0x45项; ⑤ 二级页表项中含有页基地址
在Linux中,透明巨页(Transparent HugePage)和巨页(HugePage)是两种不同的内存管理技术。 透明巨页是Linux内核中的一项特性,旨在提高内存的利用率和性能。...它通过将内存分配为更大的巨页(通常为2MB或1GB),减少了对内存页表的访问次数,从而提高了内存访问的效率。透明巨页是透明的,应用程序无需进行任何修改即可受益于这种内存管理技术。...而巨页是指一种更大尺寸的内存页,在Linux中可以使用不同的页面大小,常见的巨页大小是2MB或1GB。...巨页可以提供更高的内存访问性能,因为它减少了页表的数量,降低了TLB(Translation Lookaside Buffer)缓存的压力,从而减少了内存访问的开销。...巨页需要应用程序进行适当的修改和配置才能使用。 因此,透明巨页和巨页都是通过增加内存页的尺寸来提高内存访问性能,但透明巨页不需要应用程序的修改,而巨页需要应用程序的支持和配置。
作者简介 韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。...注:本文使用linux-5.0内核源代码。文章分为以下几节内容: 1.匿名映射缺页异常的触发情况 2.0页是什么?为什么使用0页?...那么我们想知道的时候是什么时候0页被设置为了只读属性的(也就是页表项何时被设置为只读)? 我们带着这个问题去在内核代码中寻找答案。...所以就将其页表设置为了只读!!! 2922行 跳转到setpte去将设置好的页表项值填写到页表项中。...2928 行会分配一个高端 可迁移的 被0填充的物理页。2941 设置页中数据有效 2943 使用页帧号和vma的访问权限设置页表项值(注意:这个时候页表项属性依然为只读)。
)通过在用户空间和内核之间共享只读区域中的数据来加速某些系统调用。...创建每个进程时,在 USYSCALL(memlayout.h 中定义的 VA)映射一个只读页面。...page table 0x0000000087f6e000//二级页表 ..0: pte 0x0000000021fda801 pa 0x0000000087f6a000//二级页表的表项,进入一级页表...首先要确定的第一点就是,这个页表其实实际上是一种多级页表的结构,就是二级页表存储的表项(PPN)其实是一级页表的第一个PTE的地址,一级页表的表项才是pa.具体的多级页表的解释可以参考我其他的博客或者翻阅操作系统或者组员书...所以说这个东西就可以转化为基本的递归.对于二级页表,对于每一个表项就进入到一级页表再遍历.所以说本质上这就是一个树,二级页表作为根,有若干个儿子,也就是一级页表,一级页表也有若干个儿子…那遍历树怎么遍历
二级页表地址旺射的最小单位有4K、1K,Linux使用4K。...一级页表项里的内容,决定了它是指向一块物理内存,还是指问二级页表,如下图: 2.1, 一级页表映射过程 一线页表中每一个表项用来设置1M的空间,对于32位的系统,虚拟地址空间有4G,4G/1M=4096...所以一级页表要映射整个4G空间的话,需要4096个页表项。...根据此项内容知道它是一个二级页表项。...③ 从这个表项里取出地址,假设是address,这表示的是二级页表项的物理地址; ④ vaddr[19:12]表示的是二级页表项中的索引index即0x45,在二级页表项中找到第0x45项; ⑤ 二级页表项中含有页基地址
实际上,已经支持了只读的文件映射。 应用程序运行更快的原因有两个的因素。第一个因素几乎完全无关紧要,事实并非如此,这很重要,因为它也有缺点在页错误中需要更大的清除页拷贝有潜在的负面影响。...使用虚拟化和嵌套分页只有KVM和Linux客户端同时支持映射更大的TLB正在使用大页面,但显著的速度已经发生了,如果其中一个使用大页面只是因为TLB miss会跑得更快。...(查询到相应的页表项为空)。...max_ptes_swap指定当将一组页面坍缩(collapse)成一个透明的大页面时,可以从交换区换入多少页面(查询到相应的页表项为换出页标识符)。。...如果您没有遍历页表,但是遇到了一个物理的大页,但是您不能在代码中原生地处理它, 您可以通过调用split_huge_page(page)来分裂它。这就是Linux VM在尝试切换大页面之前所做的。
领取专属 10元无门槛券
手把手带您无忧上云