我正在研究内核设计,我有一些关于寻呼的问题。
我到目前为止的基本想法是:每个程序都获得自己的(否则它认为)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上,它是通过页面标志或段限制完成的。
程序以多种方式在其余地址空间上分配内存:
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 对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度变为原来的二倍,将原hash表数据全部重新计算hash地址,重新分配位置,达到rehash目的 redis中的hash表采用的是渐进式hash的方式: 1、redis字典(hash表)底层有...
2019独角兽企业重金招聘Python工程师标准>>> 我们平时按下键盘上的‘回车键’,就能实现回车换行【我们在屏幕上所看到的就是光标移到了下一行的开头位置!!ps:不讨论软件实现的特殊功能,如word里的回车智能缩进】。因此对这个按键更准确说应该叫做‘回车换行键’ 就且将这种将光标移到下行开...
首先,在Windows操作系统下安装python,完成python环境的搭建。(我看有的博客需要配置环境变量,其实不必要,因为我们在安装的时候只要勾选如下图所示即可避免不必要的麻烦) 第二步,使用快捷键windows+R或者点击如下图所示,之后点击运行 在其中输入cmd即可进入dos命令。 第三步,输入以下命令 就会自动安装,等待安装完成即可。 第四步,检测django是否安装成功,如果出现如下图...
做过项目的童鞋可能都使用过日志功能,以便有异常错误能够快速跟踪、定位,Qt也提供的类似的机制。之前用Qt4做项目时使用的是Qt::qInstallMsgHandler(),到了Qt5,使用了新的Qt::qInstallMessageHandler()来替代,详情请查看Qt助手(C++ API changes)。 描述 助手中在C++ API ...
版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:[email protected],如有任何学术交流,可随时联系。 1 数据的预处理分析 2 数据标准化处理 3 sklearn多模型封装(已废弃,学思想) 4 阈值概率调整 5 总结 方便复习,整成笔记,内容粗略...
最近在跑公司的项目的过程中我发现,当一个tomcat中运行多个项目的时候,就会报这个错误。我以前由于使用Maven-tomcat插件方式运行项目,所有没有遇到过这种情况。 自己查了一下资料,但是后来我发现有些帖子中描述的解决方法:window–preferences—tomcat—JVM Setting ——append to J...
很多人对于关闭窗口都有不同的需求,以下是关闭窗体的几种方法: 一、关闭窗体 1. this.Close();仅仅是关闭当前窗口,若不是主窗体的话程序无法退出。 2. Application.Exit();强制所有消息终止,退出所有的窗体。 3. Application.ExitThread();强制终止调用线程上的所有消息。 4. System.Environment.Exit(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语法 语法结构与shell类似,支持函数定义,插件DLL调用,功能非常强大。NSIS脚本包括安装属性(Installer Attributes)和段(Sections)/函数(Functions)。 1.1 安装页 安装页显示,可灵活选择其中几...
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...
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...
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...
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...
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...