我正在玩模仿一个简单的旧CPU。
到目前为止,我已经设置了结构,如下所示:
设备是主设备,并创建CPU的实例。然后,CPU创建寄存器、时钟和MMU的实例。
我所处的位置是MMU需要访问寄存器的内容,如何做到这一点?我想,当整个寄存器对象被调用时,我可能会将整个注册对象传递给MMU,这样做可能会使事情变得复杂,但这似乎很难做到。
我想要做的另一件事是用构造函数中的寄存器对象初始化MMU。如果我没弄错那还会引用同一个对象吗?意味着我对MMU中的寄存器所做的任何更改都会影响整个系统?
发布于 2016-12-30 19:25:28
但这似乎很难用
不,这正是我们应该做的。你需要一个方法的论据吗?把论点传进去。这是一个核心语言特性!如果MMU从内存加载,指针是寄存器中的值--这可能是任何寄存器。只需将适当的寄存器作为方法参数传递即可。
构造函数参数不应该真正用于随机依赖;它们只应该用于类根本上不存在或没有它们就没有意义的事情。
从根本上说,人们所犯的可怕错误和设计中有很大一部分是因为他们讨厌传递参数。但实际上,其他的选择更糟糕。从长远来看,他们的伤害要大得多,在短期内似乎很容易。到目前为止,传递参数是最好的方法。
发布于 2013-12-15 17:37:18
你问题的第二部分读起来就像经典的引用和对象的复制问题。如果您使用对寄存器的引用来初始化MMU类,那么该引用指向真正的寄存器对象(将引用看作是一个自动取消引用的指针)。如果在构造函数中复制寄存器对象,那么就只有这些--构造时状态的快照副本。
发布于 2016-12-31 08:45:29
通常,CPU有一个具有寄存器、执行指令等的“内部部件”。“内部部件”与外部事物之间的唯一通信是“读请求”和“写入请求”。“内部部件”之外的任何内容都不能访问内部部件的寄存器、执行单元等。
如果没有MMU,则由“内部部分”发出的“读取请求”和“写入请求”引用物理地址(例如,在实际RAM中读取/写入哪个位置)。
如果存在MMU,则位于“内部部分”和“内部部分”( RAM控制器等)之外的其他内容之间,并以某种方式修改“读取请求”和“写入请求”中的地址。在这种情况下,来自“内部部分”的读/写请求是虚拟地址,MMU (在“内部部分”之外)将它们转换为物理地址。
就像“内部部分”之外的所有内容一样,MMU没有访问寄存器的权限,也没有任何理由想要访问寄存器。
注意:对于实际系统,事情变得更加复杂--例如多种不同类型的地址空间(IO端口、PCI配置空间等)、以各种方式映射到地址空间/S的设备(及其寄存器)、各种地方的各种类型的缓存,以及类似于网络/包路由器(PCI桥)等的东西。随着复杂性的增加,更好的做法是将系统看作一种网络,在这种网络中,通过总线和/或链路连接的独立部件,以及每个独立的部件向其他部分发送请求包,响应从其他部分接收到的数据包,并将回复数据包发送回其他部分。出于同样的原因,为了在软件中建立一个更真实的模型,最好使用(例如)一种“每个独立块一个线程”的方法,其中线程向对方发送消息(或字面意义上的"UDP/IP数据包“中的数据包)。本质上,最好是使用演员模型,而不是OOP。
https://softwareengineering.stackexchange.com/questions/220353
复制相似问题