2020-12-25

MMU内存管理单元

1简介与相关概念

它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统;

针对各种CPU, MMU是个可选的配件. MMU负责的是虚拟地址 &O1663;&O1664; 物理地址的转换. 提供硬件机制的内存访问授权. 

https://www.cnblogs.com/alantu2018/p/9002309.html 博客园

2.与操作系统的关系

操作系统有两种 用MMU的 和 不用MMU的
用MMU的是Windows MacOS Linux Android
不用MMU的是FreeRTOS VxWorks ucOS...

CPU有两种 带MMU的 和 不带MMU的
带MMU的有 Cortex-A系列 ARM9 ARM11系列
不带MMU的有 Cortex-M系列

3.关于MMU与各种地址的理解

转自 https://blog.csdn.net/u013562393/article/details/51817911

目的(功能):对于程序而言,为了将程序分割成一张张的卡片(页面),然后再运行的时候将需要的部分嵌入到物理内存的卡槽(页框)里面。MMU就是为了完成操作系统的这个功能而设计的。MMU可以在被初始化后,形成的一个个虚拟地址对应到物理地址,将一张张的卡片分别映射到相应的物理内存中。举个例子:在linux中的每个进程都维护着自己的页表,在切换进程上下文的时候须要将页表首地址也记录下来( 即记录页表基地址寄存器的值,再将要被切换到的进程的页表基地址还原到这个寄存器中 )。这个时候不同进程的同一个虚拟地址都会对应着不同的页表项,从而对应着不同的物理地址了。

还有另外的一个功能是MPU的功能Memory Protecting Unit 对内存内容进行保护。这里也是通过寄存器设置可达到。

本身机制可以做的事情以及程序员编程时候需要做的事情:

本身机制 :

    输入:虚拟地址

    输出:物理地址

    原理:虚拟地址根据页表基地址寄存器找到页表,通过虚拟地址对应的部分找到条目。。根据本身的不同设置决定是否需要寻找第二页表或者直接得出物理地址。

程序员编程所需要做的事情:

    初始化MMU,设置MMU参数:比较主要的是要设置好页表基地址。页(段:1M 或16M,页:4K 2K 16K )大小。段通常一级页表即可完成地址转换,页地址的转换则需要二级页表。

    建立页表:将需要映射的内存都在相应的内存位置设置好页表

    开启MMU:此时就可以开启MMU,以后在对CPU发送的地址都会通过MMU转换,得到对应的物理地址。

____________________________________________________________________________________

接下来是各种地址。

虚拟地址:未经过MMU的地址,范围应该跟CPU地址线数目相关。32位CPU应该寻址范围为4G

物理地址:真正对应实际内存的地址,如2440的内存地址从0x30000000开始 若为256M 则0x30800000为范围结束的地址

链接地址:程序链接的地址,即程序运行时候应该存在的位置。除了b bl,等一些进行“相对”处理的操作之外,用到绝对地址操作的时候,如果程序在内存运行的地址不对应于链接地址就会发生不可预知的错误。

装载地址:一直都误解了装载地址,现在的理解,装载地址应该是代码块在二进制程序代码文件中的位置,如链接脚本中AT(4096)就是在文件4K处开始放置这个segment

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
func (c *cAsset) CreatComponent(r *ghttp.Request) { var req *v1.CreateComponentReq if err := r.Parse(&req); err != nil { r.Response.WriteJson(g.Map{ "code": 1, "msg": err.Error(), }) } createRequest := &creativecomponent.CreateRequest{ AdvertiserID: req.AdvertiserID, } res, err := service.Asset().Create(createRequest) if err != nil { r.Response.WriteJson(g.Map{ "code": 2, "msg": err.Error(), }) } r.Response.WriteJson(res) }这段代码中creativecomponent.CreateRequest的过滤条件为type CreateRequest struct { // AdvertiserID 广告主ID AdvertiserID uint64 `json:"advertiser_id,omitempty"` // ComponentInfo 组件信息 ComponentInfo *ComponentInfo `json:"component_info,omitempty"` },其中ComponentInfo为type ComponentInfo struct { // ComponentID 组件ID ComponentID model.Uint64 `json:"component_id,omitempty"` // ComponentType 组件类型 ComponentType enum.ComponentType `json:"component_type,omitempty"` // ComponentName 组件名称。长度小于等于20。一个中文长度为2 ComponentName string `json:"component_name,omitempty"` // ComponentData 组件详细信息。不同的component_type对应的值不同,具体的结构见创建或更新接口定义 ComponentData ComponentData `json:"component_data,omitempty"` // CreateTime 创建时间。格式"2020-12-25 15:12:08" CreateTime string `json:"create_time,omitempty"` // Status 组件审核状态。 Status enum.ComponentStatus `json:"status,omitempty"` }想要把ComponentInfo作为参数放到createRequest中,该怎么做?请详一点
07-20

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值