除了 malloc/free 之外,程序还需要操作系统提供其他东西吗?

2024-02-01

我正在为我正在开发的操作系统设计内核(我实际上将其称为“核心”,只是为了有所不同,但它基本上是相同的)。如果我无法启动和运行多任务处理、内存管理和其他基本功能,那么操作系统本身的细节就无关紧要了,所以我需要首先解决这个问题。我有一些关于设计 malloc 例程的问题。

我认为 malloc() 要么成为内核本身的一部分(我倾向于这一点),要么成为程序的一部分,但我必须编写自己的 C 标准库实现方式,所以我开始写一个malloc。我的问题实际上在这方面相当简单,C(或C++)如何管理它的堆?

我在理论课上一直被教导的是,堆是一块不断扩展的内存,从指定的地址开始,并且在很多意义上表现得像堆栈。通过这种方式,我知道在全局作用域中声明的变量位于开头,更多的变量在各自的作用域中声明时被“推”到堆上,而超出作用域的变量则简单地留在内存空间中,但该空间被标记为空闲,因此堆可以在需要时扩展更多。

我需要知道的是,C 实际上是如何以这种方式处理动态扩展的堆的?编译后的 C 程序是否会自己调用 malloc 例程并处理自己的堆,或者我是否需要为其提供自动扩展的空间?另外,C 程序如何知道堆从哪里开始?

哦,我知道相同的概念也适用于其他语言,但我希望所有示例都采用 C/C++ 语言,因为我对这种语言最熟悉。我也不想担心其他事情,例如堆栈,因为我认为我能够自己处理这样的事情。

所以我想我真正的问题是,除了 malloc/free (它处理自身的获取和释放页面等)之外,程序还需要操作系统提供其他东西吗?

Thanks!

EDIT我对 C 如何使用与堆相关的 malloc 更感兴趣,而不是 malloc 例程本身的实际工作原理。如果有帮助的话,我在 x86 上执行此操作,但 C 是交叉编译器,所以这应该不重要。 ^_^

进一步编辑:我知道我可能会混淆术语。我被告知“堆”是程序存储全局/局部变量等内容的地方。我习惯于在汇编编程中处理“堆栈”,并且我刚刚意识到我的意思可能是这个。我的一些研究表明,“堆”更常用来指代程序为其自身分配的总内存,或者操作系统提供的内存页面总数(和顺序)。

因此,考虑到这一点,我该如何应对不断扩大的stack? (看来我的 C 理论课确实有轻微的……缺陷。)


malloc通常在用户空间的 C 运行时中实现,依靠特定的操作系统系统调用来映射虚拟内存页面。的工作malloc and free是管理那些大小固定(通常为 4 KB,但有时更大)的内存页面,并将它们切成应用程序可以使用的片段。

例如,参见GNU libc http://www.gnu.org/software/libc/执行。

对于更简单的实现,请查看麻省理工学院操作系统 http://pdos.csail.mit.edu/6.828/2007/去年的课。具体请参见最终实验室讲义 http://pdos.lcs.mit.edu/6.828/2007/labs/lab6/lab6-handout.tar.gz,然后看一下lib/malloc.c。这段代码使用了JOS类中开发的操作系统。它的工作方式是读取页表(由操作系统提供只读),寻找未映射的虚拟地址范围。然后它使用sys_page_alloc and sys_page_unmap用于将页面映射和取消映射到当前进程的系统调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

除了 malloc/free 之外,程序还需要操作系统提供其他东西吗? 的相关文章

  • 我应该使用堆栈进行长期变量存储吗?

    根据 汇编语言循序渐进 第3版 中的 Storage for Short Term 第8章 堆栈应该被视为短期存放东西的地方 存储在堆栈中的项目没有名称 通常必须按照放入的相反顺序从堆栈中取出 后进先出 记住 后进先出 然而 据我所知 C
  • 最小化 malloc() 调用量可以提高性能吗?

    考虑两个应用程序 一个 num 1 调用 malloc 多次 另一个 num 2 调用 malloc 几次 两个应用程序都分配same内存量 假设 100MB 对于哪个应用程序 下一个 malloc 调用会更快 1 还是 2 换句话说 ma
  • 由于 system.currentTimeMillis() 导致系统 CPU 使用率较高

    我正在我们的 Storm Supervisor Wheezy 机器 上调试高系统 CPU 使用率 不是用户 CPU 使用率 以下是观察结果 相关进程的 perf 输出 Events 10K cpu clock 16 40 java kern
  • 定义新的套接字选项以在 TCP 内核代码中使用

    我正在尝试向 TCP 内核代码添加一些功能 在tcp input c 我希望我实现的代码仅在某些情况下运行 我想添加一个控制标志 可以从用户空间应用程序设置它 我 认为我 需要添加一个新的套接字选项 以便我可以完成以下操作setsockop
  • x86汇编代码的语法

    我试图了解操作系统的基础知识 并在 OCW 中找到了相关课程 名为 6 828 我在课程的实验室中找到了引导加载程序的代码 我尝试了但不明白以下部分代码 Enable A20 For backwards compatibility with
  • Linux中分配特定地址

    我想在Linux进程中的特定地址分配一块内存 实际上我想做一些类似的事情 我会有进程号 每个进程都会调用库 由我编写 中的初始化函数 该函数将在进程的地址空间中分配一些内存 它将存储进程相关信息 这将由每个进程完成 一旦分配了该内存 程序就
  • free() 是否跟随指针?

    我确信不是 但也许其中有黑魔法 所以这是我的问题 如果我有这样的结构 struct mystr char strp unsigned int foo 我为它分配了内存并想稍后释放它 我必须做吗 free mystr var gt strp
  • 如何让用户轻松选择在 Java Swing 应用程序中分配多少内存?

    我们有一个处理相对大量数据的 Swing 应用程序 例如 我们目前处理包含数百万行数据的 CSV 文件 出于性能和简单性的原因 我们将所有数据保留在内存中 然而 不同的用户需要处理的数据量以及 RAM 量也不同 创建安装程序时 我们当然需要
  • 我真的需要 malloc 吗?

    据我了解 malloc是用来动态分配内存的 在我的代码中 我有时会调用以下函数 int memory get log unsigned char day unsigned char date unsigned char month char
  • 函数插入仅适用于 malloc 而不是 free

    我在通过使用函数插入来监视 malloc 和 free 时遇到了一个小问题 当仅对 malloc 执行函数插入时 它按预期工作 然而 当尝试插入 free 时 它 最终会陷入循环 我似乎 free 被递归调用 但我只是不知道为什么 这是 m
  • 在结构体中动态分配结构体

    我正在动态分配一个具有不同结构作为成员的结构 struct a other members struct b struct b基本上持有一个指向另一个的指针struct b 所以想到struct b作为链接列表 如果我动态分配struct
  • 设置了 LARGEADDRESSAWARE 标志的应用程序获得的虚拟内存较少

    我有一个 32 位应用程序 由一个 EXE 和多个 DLL 组成 EXE 是用 LARGEADDRESSAWARE标志设置 所以我预计在 64 位操作系统上我应该获得 4 GB 的用户地址空间 但在某些 64 位 Win 7 系统上 我只能
  • 如何以编程方式获取 vmmap 中显示的信息?

    任何看过 Mark Russovich 演讲 揭示内存管理之谜 的人都知道 vmmap 工具可以向您显示与进程限制 普通 32 位 Windows 上为 2GB 相关的内容 而其他工具似乎很少了解这些内容 我希望能够以编程方式监控我的rea
  • Minix 与 Linux 相比如何学习操作系统设计?

    我想学习操作系统设计 我想知道在此过程中我是否应该解决 Minix 或 GNU Linux 问题 我喜欢书籍 所以我主要关注一本书 尽管视频资源 大概是录像讲座 也很受欢迎 我已经正式学习了 C 和 C 可以用它们编写中小型程序 我对数据结
  • 我如何解释 meminfo 中的所有内存?

    我试图理解如何meminfo跟踪记忆 这是我正在看的内容 MemTotal 341596 kB MemFree 147288 kB Buffers 56 kB Cached 46752 kB SwapCached 0 kB Active 8
  • 如何从 .t​​xt 文件中读取已知数量的未知大小的字符串并将每一行存储在矩阵的一行中(在 C 中)?

    标题是不言自明的 我几乎可以肯定 最终结果不会是一个矩阵 因为每行都有不同数量的列 所以它更像是可变大小的数组的数组 按大小对片段进行排序 最大的在前 也很有趣 这是我到目前为止所尝试过的 int main char str MAXLEN
  • 自旋锁在单处理器单核架构中有用吗?

    我对自旋锁的功能感到困惑 自旋锁用于阻止进程重新调度 然而 在只有一个核心的机器上 使用自旋锁有用吗 防止上下文切换 您的观察结果很好 在单处理器系统上 旋转等待资源是没有意义的 因为您最好尽早切换线程 互斥体和信号量正是这样做的 在多处理
  • Erlang:如何限制分配给进程的内存

    我要问的是是否可以限制分配给特定进程的内存 堆或堆栈 以便该进程不能超过它 也许类似于 process flag min heap size MinHeapSize 但针对最大堆 您可以将某种进程跟踪 gen server 放在一起 定期检
  • 在 Mac OS X 中创建虚拟 USB 设备

    我尝试以编程方式在 Mac OS 中添加带有驱动程序的虚拟 USB 设备 IOKit 文档说 传统上 虚拟设备的驱动程序在 IOResources 上匹配 因为虚拟设备不发布自己的 nub 此类驱动程序的另一个示例是 HelloIOKit
  • 谷歌模拟全局模拟对象内存泄漏

    我正在使用 VS2005 和 C 使用 google mock 进行单元测试 我在单元测试中有一个全局自由函数 我使用以下代码来模拟自由函数 NiceMock

随机推荐

  • Azure Devops 发布管道 XML 变量替换不起作用

    我的发布管道中有一个非常简单的变量替换 但它不起作用 我有变量connectionStrings config文件如下
  • 是什么导致 sprof 抱怨“ld.so 检测到的不一致”?

    我正在尝试使用 sprof 来分析一些软件 ossim 其中几乎所有代码都在共享库中 我已经生成了一个分析文件 但是当我运行 sprof 时 出现以下错误 gt sprof home eca7215 usr lib libossim so
  • 在 Query 上使用 keepSynced() 而不是在 DatabaseRef 上使用有什么区别吗?

    我目前正在从 Firebase 获取单个 dataSnapshot 如下所示 public Task
  • 将 netcat 与 bash 上的聊天结合起来以实现自动 udp 响应

    我想在 Linux 上结合 chat 和 nc 所以我将创建一个小型 udp 服务器 它响应特定请求并发回答案 事实上 我想将 nc 的标准输出重定向到 聊天 的标准输入 反之亦然 我的第一次尝试是 nc w 3000 u n l p 30
  • 禁用访问日志中的查询字符串

    长话短说 用户密码通过 url 传递纯文本 可怕 是的 但不是我的想法 并且此查询字符串存储在访问日志中 我们显然不希望如此明显 有没有办法在不禁用 CustomLog 的情况下防止查询字符串存储在访问日志中 Your common日志格式
  • 多线程Windows服务的线程库[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 UITextField 增加到一定长度

    我有一个 UITextField 我想 自动 调整其边界大小 以便为字段中添加的字符串腾出空间 但是 我希望它的宽度达到一定程度的最大值 我可以采取的最佳方法是什么 谢谢你的帮助 EDIT 测试视图 h import
  • Haskell —— 是否有元组的 monad 序列函数?

    假设我有一个类型的值Monad m gt m a m a 我想对这对进行 排序 以创建类型的值Monad m gt m a a 它以与 序列 函数相同的方式组合两个值的单子上下文 是否有一些标准功能或标准方法可以做到这一点 这个操作还有意义
  • 每个页面加载的计时器减量都会有所不同

    我的项目有一个计时器 每次减少 1 秒 但是 如果计数器第二次开始工作 它会减少 2 秒 第三次则减少 3 秒 依此类推 我应该怎么做才能始终减少 1 秒 void viewDidAppear BOOL animated count 15
  • 计算大于另一个整数 x 的 k 位集合的最小整数?

    我想精确地计算最小整数k位设置 大于另一个整数x 例如如果x 1001010然后 为了k 2 答案应该是1010000 for k 4 答案应该是1001011并为k 5答案是1001111 我认为需要设置至少与整数中最左边设置的位一样多的
  • JSHint 奇怪的行为

    我认为我应该问关于 jSHint 的新问题 讨论开始了here https stackoverflow com questions 35987052 js strange behavior 我现在可以看到来自 JSHint 的奇怪警告 我只
  • 从 KMS CipherTextBlob 获取 KMS 密钥

    如何从密文 blob 中获取 KMS 密钥信息 以aws网站为例 AWS KMS 文档 http docs aws amazon com cli latest reference kms encrypt html aws kms encry
  • Matlab 和 XTickLabel

    我已经尝试让 Matlab 更改轮廓图上的标签大约一个小时了 当我去更改 XTickLabel 或 XTick 时 它只是完全删除我的 x 轴 令人沮丧和愤怒的是我正在做的事情exactly什么所有的帮助页面 http www mathwo
  • 使用 Git 版本控制查看文件的更改历史记录

    如何查看单个文件的历史记录以及更改内容的完整详细信息 git log filename 显示文件的提交历史记录 但如何查看已更改的文件内容 这让 Git 为每个日志条目生成补丁 git log p filename See git help
  • 如何使css/images/js文件等所有静态文件不被asp.net mvc处理?

    静态文件有可能不被asp net mvc引擎处理吗 我可以在 IIS 级别或其他级别执行此操作吗 当然无需为静态文件创建单独的 IIS 网站 您需要为不希望通过 ASP NET MVC 提供服务的特定类型的文件创建忽略路由 针对您要忽略的文
  • 切换 kivy 小部件

    我正在使用 Kivy python 库 我定义了两个小部件 当程序运行时 我运行第一个小部件 当按下该小部件按钮时 我希望它消失并被第二个小部件替换 这是两个小部件的 kv uitest kv
  • 确定 MouseListener 中单击的 JPanel 组件。事件处理

    我有一个扩展 JPanel 的类 public class ButtonPanel extends JPanel private label public ButtonPanel label new JLabel waiting for c
  • Cypress 组件测试拦截 getServerSideProps 请求

    使用 cypress 组件测试时无法弄清楚如何拦截 getServerSideProps 做了很多研究和最好的线索链接 https github com cypress io cypress discussions 9328 https g
  • 注册表模式 vs 服务定位器模式 vs 依赖注入容器

    它们之间有什么区别而不是通过键设置和获取数组中的对象吗 class Registry private container array public static function Set name object self container
  • 除了 malloc/free 之外,程序还需要操作系统提供其他东西吗?

    我正在为我正在开发的操作系统设计内核 我实际上将其称为 核心 只是为了有所不同 但它基本上是相同的 如果我无法启动和运行多任务处理 内存管理和其他基本功能 那么操作系统本身的细节就无关紧要了 所以我需要首先解决这个问题 我有一些关于设计 m