操作系统通常如何进行管理内核内存和页面处理?

技术标签: 内存管理  操作系统  核心  分页  osdev.

我正在研究内核设计,我有一些关于寻呼的问题。

我到目前为止的基本想法是:每个程序都获得自己的(否则它认为)4G内存,减去一个在某处的部分,即我为程序可以调用的内核函数保留。因此,操作系统需要弄清楚某种方式来加载程序中的页面,程序需要在其操作期间使用。

现在,假设我们有无限量的内存和处理器时间,我可以加载/分配程序的任何页面,程序写入或读取,因为它使用页面故障的页面遇到的页面不存在(或被交换出)所以操作系统可以快速分配它们或交换它们。但是在现实世界中,我需要优化这个过程,以便我们没有不断消耗它触摸的所有内存的程序。

所以我想我的问题是,操作系统通常如何达到这一点?我的初步思想是创建一个程序调用设置/免费页面的函数,然后它可以自己的内存来管理,但程序通常会这样做,或者编译器假设它有免费统治吗?此外,编译器如何处理需要分配相当大段的内存的情况?我需要提供一个尝试按顺序提供X页面的功能吗?

这显然不是一种语言特定的问题,但我偏向标准C并善于C ++,因此我希望任何代码示例都在那个或装配中。 (不得不必须必要,我完全打算尽可能多地处理它的C代码,并作为最后一步优化。)

还应该更容易回答的另一件事:如何通常如何处理程序需要呼叫的内核功能?是否可以让集合的内存区域(我正在思考虚拟空间的末尾),其中包含程序可以拨打电话的大多数基本功能/进程特定的内存?我的思想是有核心函数做一些非常喜欢的东西并交换页面(使程序在自己的空间中看不到敏感的内核函数)当需要做任何重大的程序时,但我不是真的在这一点上专注于安全性。

所以我想我更担心一般的设计思想而不是细节。我想让内核与GCC(以某种方式)完全兼容,我需要确保它提供了正常程序所需的一切。

谢谢你的任何建议。

看答案

所有这些问题的一个很好的起点是看看Unix如何做到。作为一个着名的报价说:“那些不理解unix的人注定要重新发明它。”

首先,关于调用内核函数。只需在程序可以呼叫某个位置时才具有足够的功能,因为该程序最可能在“用户模式”(IA-32上的环3)中运行,并且内核必须在“内核模式”中运行(通常是环0在IA-32))执行其特权运营。您必须以某种方式进行两种模式之间的过渡,这是特定于架构的。

在IA-32上,传统的方式是使用IDT中的大门以及软件中断(Linux使用Int 0x80)。较新的处理器具有其他(更快)的方式来执行它,并且可以使用哪些方法取决于CPU是否来自AMD或Intel,以及特定的CPU模型。要满足此变体,最近的Linux内核使用内核映射的代码页面在地址空间顶部的每个进程。因此,在最近的Linux上,要做一个系统调用您在此页面上调用函数,这反过来又可以执行切换到内核模式所需的内容(内核具有该页面的多个副本,并编写要使用的复制副本根据您的处理器的功能,在启动时)。

现在,内存管理。这是一个 巨大的 主题;你可以写一本关于它的大书,而不是爆炸。

一定要记住至少有 内存的视图:物理视图(页面的实际顺序,硬件存储器子系统可见,经常到外部外围设备)和逻辑视图(由CPU上运行的程序所示的页面的顺序)。这两个都很容易混淆。你将分配 身体的 页面并将其分配给 逻辑 在程序或内核地址空间上的地址。单个物理页面可以具有若干逻辑地址,并且可以映射到不同进程中的不同逻辑地址。

内核内存(为内核保留)通常在每个过程的地址空间的顶部映射。但是,它被设置为,因此它只能在内核模式下进行播放。不需要花哨的技巧隐藏内存的部分;硬件堵塞访问的所有工作(在IA-32上,它是通过页面标志或段限制完成的。

程序以多种方式在其余地址空间上分配内存:

  • 内存的一部分由内核程序加载器分配。这包括程序代码(或“文本”),程序初始化数据(“数据”),程序未初始化的数据(“BSS”,ZES填充),堆栈和几个赔率和结束。分配多少,在哪里,应该是初始内容,使用的保护标志和其他几件事将从要加载的可执行文件上的标头中读取。
  • 传统上,在UNIX上,有一个可以生长和收缩的内存区域(其上限可以通过 brk() 系统调用)。这是传统上由堆(C库上的内存分配器使用,其中 malloc() 是一个接口,负责堆)。
  • 您经常可以要求内核将文件映射到地址空间区域。读取和写入该区域(通过寻呼魔法)被定向到备份文件。这通常被称为 mmap()。匿名 mmap,您可以分配任何文件不支持的地址空间的新区域,但其他方式相同。内核的程序加载器通常会使用 mmap 要分配程序代码的部分(例如,程序代码可以由可执行文件本身备份)。

不以任何方式分配的地址空间的播出区域(或为内核保留)被认为是错误,并且在UNIX上会导致要发送到程序的信号。

编译器要么静态地分配内存(通过在可执行文件标题上指定它;内核的程序加载器将在加载程序时分配内存)或动态地分配内存(通过在语言的标准库上调用函数,通常然后调用函数C语言标准库,然后调用内核分配内存并在必要时将其分组)。

学习所有这些的基础的最佳方法是阅读操作系统上几本书之一,特别是作为示例的使用UNIX变体的书籍之一。它将更详细地比我在StackOverflow上的答案更详细。


智能推荐

操作系统——内存管理

操作系统——内存管理 Basic memory management Base and Limit register 将上图这块称为MMU Swapping 操作系统中的内存是动态分配的,如图所示: A进程启动,占用一部分内存 B进程启动,占用一部分内存 C进程启动,占用一部分内存 A进程结束,又会将之前A占用的内存释放 随后又启动D进程,占用掉一部分内存 B进程结束,释放...

redis中的hash扩容渐进式rehash过程

背景: redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash 对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度变为原来的二倍,将原hash表数据全部重新计算hash地址,重新分配位置,达到rehash目的 redis中的hash表采用的是渐进式hash的方式: 1、redis字典(hash表)底层有...

不同系统下的回车\r和换行\n,及其历史

2019独角兽企业重金招聘Python工程师标准>>>      我们平时按下键盘上的‘回车键’,就能实现回车换行【我们在屏幕上所看到的就是光标移到了下一行的开头位置!!ps:不讨论软件实现的特殊功能,如word里的回车智能缩进】。因此对这个按键更准确说应该叫做‘回车换行键’ 就且将这种将光标移到下行开...

windows操作系统,python环境下django的自动安装

首先,在Windows操作系统下安装python,完成python环境的搭建。(我看有的博客需要配置环境变量,其实不必要,因为我们在安装的时候只要勾选如下图所示即可避免不必要的麻烦) 第二步,使用快捷键windows+R或者点击如下图所示,之后点击运行 在其中输入cmd即可进入dos命令。 第三步,输入以下命令 就会自动安装,等待安装完成即可。 第四步,检测django是否安装成功,如果出现如下图...

Qt之日志输出文件

    做过项目的童鞋可能都使用过日志功能,以便有异常错误能够快速跟踪、定位,Qt也提供的类似的机制。之前用Qt4做项目时使用的是Qt::qInstallMsgHandler(),到了Qt5,使用了新的Qt::qInstallMessageHandler()来替代,详情请查看Qt助手(C++ API changes)。 描述     助手中在C++ API ...

猜你喜欢

基于雇员流失率数据进行多分类模型训练及阈值调整实践-大数据ML样本集案例实战

版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:[email protected],如有任何学术交流,可随时联系。 1 数据的预处理分析 2 数据标准化处理 3 sklearn多模型封装(已废弃,学思想) 4 阈值概率调整 5 总结 方便复习,整成笔记,内容粗略...

Exception: java.lang.OutOfMemoryError

  最近在跑公司的项目的过程中我发现,当一个tomcat中运行多个项目的时候,就会报这个错误。我以前由于使用Maven-tomcat插件方式运行项目,所有没有遇到过这种情况。   自己查了一下资料,但是后来我发现有些帖子中描述的解决方法:window–preferences—tomcat—JVM Setting ——append to J...

【C#】关于WinForm窗体程序的退出方法总结

很多人对于关闭窗口都有不同的需求,以下是关闭窗体的几种方法: 一、关闭窗体 1. this.Close();仅仅是关闭当前窗口,若不是主窗体的话程序无法退出。 2. Application.Exit();强制所有消息终止,退出所有的窗体。 3. Application.ExitThread();强制终止调用线程上的所有消息。 4. System.Environment.Exit(0);最彻底的退出...

采用eclipse+jboss开发ejb3.0学习笔记

<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,2...

NSIS使用

NSIS使用   NSIS是一款很流行的开源安装程序制作工具,可以通过编写脚本生成功能丰富的安装程序。   一. NSIS语法 语法结构与shell类似,支持函数定义,插件DLL调用,功能非常强大。NSIS脚本包括安装属性(Installer Attributes)和段(Sections)/函数(Functions)。   1.1 安装页 安装页显示,可灵活选择其中几...

问答精选

How to get the sum of rows using a vector and the make the result in a column

I have a dataframe and i want to calculate the sum of variables present in a vector in every row and make the sum in other variable after i want the name of new variable created to be from the name of...

Call a custom class in zend framework

I have a very rough project that done partially in zend framework (not ZF2). The 'application', 'library' and 'public' folders are on the same root. Now i need to create a library 'Anil' in the 'libra...

Hide Some Of The Categories In Magento?

I want to hide some of the categories from magento home page. I have created some categories like New Arrivals, Special Offer Which I would like to show in some different way may be in left panel or r...

Reading an internal file in Android Studio

I am writing to an internal file in Android Studio The code lets me write lines of data split with commas. I am able to then go to another activity and read it all out at once. However I want to be ab...

Rails Acts_as_votable Gem Like/Unlike Buttons with Ajax

I'm new to Ruby On Rails, I used the acts_as_votable gem to create Like and Unlike Buttons to make Users like and unlike Posts but I can't make them change from Like to Unlike (and viceversa) and upda...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答