linux copy on write源码分析(基于linux0.11)

2024-03-27 21:38

本文主要是介绍linux copy on write源码分析(基于linux0.11),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写时复制是有一块内存,由多个进程共享,属性是只读的,当有一个进程对这块内存进行写的时候,系统会先申请一块新的内存给他写。比如进程fork的时候,父子进程对应的物理地址都一样,这时候会在页表项中记录该物理地址是只读的,有一个进程写的时候,就会触发写保护异常。执行写时复制。

在触发写保护异常的时候,处理器会给系统提供两个信息。一个在系统栈中的错误码,一个在cr2寄存器中保存的引起异常的线性地址。错误码一般会告诉系统这些信息。

——P 标志表明异常是由于一个不存在页(0)还是访问权限违例或是使用了保留位(1)。
——W/R 标志表明引起异常的内存访问是读(0)还是写(1)。
——U/S 标志表明异常发生时处理器是在用户态(1)执行还是在管理态(0)执行。

下面我们分析这个过程,首先,在系统初始化的时候,注册了14号中断异常处理程序为page_fault。

// 缺页和写保护异常处理函数
set_trap_gate(14,&page_fault)

page_fault是汇编实现的

_page_fault:// 交换两个寄存器的值,esp指向的位置保存了错误码xchgl %eax,(%esp)// 压栈寄存器pushl %ecxpushl %edxpush %dspush %espush %fs// 内核数据段描述符movl $0x10,%edxmov %dx,%dsmov %dx,%esmov %dx,%fs// 如果是缺页异常,cr2保存了引起缺页的线性地址movl %cr2,%edx// 线性地址(有的话)和错误码入参pushl %edxpushl %eax// 1和eax与,结果放到ZF中testl $1,%eax// zf=0则跳转,即0是写异常,1是缺页异常jne 1fcall _do_no_page// 跳到标签2jmp 2f
1:	call _do_wp_page
// 出栈,返回中断,会重新执行异常指令
2:	addl $8,%esppop %fspop %espop %dspopl %edxpopl %ecxpopl %eaxire

处理程序是do_wp_page

/** This routine handles present pages, when users try to write* to a shared page. It is done by copying the page to a new address* and decrementing the shared-page counter for the old page.** If it's in code space we exit with a segment error.*/void do_wp_page(unsigned long error_code,unsigned long address)
{
#if 0
/* we cannot do this yet: the estdio library writes to code space */
/* stupid, stupid. I really want the libc.a from GNU */if (CODE_SPACE(address))do_exit(SIGSEGV);
#endif/*address为线性地址,address>>10 = address>>12<<2,得到页表项的地址,address>>20 = address>>22<<2,得到页目录项地址,页目录项里存着页表地址+页表偏移得到页表项地址*/un_wp_page((unsigned long *)(((address>>10) & 0xffc) + (0xfffff000 &*((unsigned long *) ((address>>20) &0xffc)))));}
// 共享的页面被写入的时候会执行该函数。该函数申请新的一页物理地址,解除共享状态
void un_wp_page(unsigned long * table_entry)
{unsigned long old_page,new_page;// table_entry是页表项地址,算出该页的物理首地址old_page = 0xfffff000 & *table_entry;// LOW_MEM以下是内核使用的内存。old_page对应的物理页引用数为1,可以直接修改内容,置可写标记位(第二位)if (old_page >= LOW_MEM && mem_map[MAP_NR(old_page)]==1) {*table_entry |= 2;invalidate();return;}// 分配一个新的物理页if (!(new_page=get_free_page()))oom();// 页的引用数减一,因为有一个进程不使用这块内存了if (old_page >= LOW_MEM)mem_map[MAP_NR(old_page)]--;// 修改页表项的内容,使其指向新分配的内存页,置用户级、有效、可读写、可执行标记位*table_entry = new_page | 7;// 刷新tlbinvalidate();// 把数据赋值到新分配的页上copy_page(old_page,new_page);
}
// 把一页的内容从from复制到to
#define copy_page(from,to) \
__asm__("cld ; rep ; movsl"::"S" (from),"D" (to),"c" (1024):"cx","di","si")

这篇关于linux copy on write源码分析(基于linux0.11)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853467

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者