assembly - x86 或类似程序集中的内存分配
问题描述
背景:我正在设计自己的处理器和指令集作为学习练习。
我试图了解低级汇编程序如何知道它可以访问哪些内存地址。即使我们假设我们在没有虚拟内存或操作系统保护的情况下运行并且所有 RAM 都是可自由写入的,我们必须确保我们不会意外覆盖我们自己的指令,因为它操作的程序数据存储在相同的地址空间。
正如我所看到的,我们在这个级别上有三种类型的内存。
- 静态内存:这将在汇编程序的 DATA 部分中以符号方式声明。不知何故,这被神奇地转化为可用的地址。
- 堆栈内存:一旦设置了堆栈寄存器,我们就可以愉快地 push 和 pop。但是我们怎么知道最初把栈底放在哪里呢?
- 堆内存:用户模式程序将通过系统调用请求这个,操作系统将处理所有困难的事情。我们只是在返回值中得到一个地址并使用它。但是,如果我们正在编写内核而不是用户模式程序,则不存在这样的概念。
我的问题归结为以下几点:
- 静态数据声明如何以及何时转换为实际地址?
- 对于将由操作系统加载的用户模式程序,它如何知道将堆栈放在哪里?
- 对于作为操作系统的内核模式程序,它如何知道可以将哪些内存用于内核数据结构、分配给进程等?所有东西都必须预先声明为静态的吗?
随意给出任何架构/操作系统实现的例子,我只是想弄清楚这到底是怎么可能的。
解决方案
推荐阅读
- machine-learning - 为什么正则化不能接受 Φ 作为惩罚参数?
- c - 如何在 pthread_create() C 编程语言中传递多个参数
- assembly - 如何通过将密码更改为 * 来隐藏/保护密码
- css - 打印时,break-inside 在随机位置创建一个空间并仍然破坏元素
- c++ - 第一行主要功能的术语是什么?
- python - Scrapy shell 打不开
- javascript - Vue.js 在 v-for cicle 中添加多个活动类
- python - 在训练对象检测模型(如 Faster R CNN、YOLO 和 SSD)期间,锚框大小是否会得到细化?
- java - Java中的对象到日期格式
- python - 是否可以在运行时获取被调用函数的值?