打印
[嵌入式linux]

操作系统 逻辑地址和物理地址

[复制链接]
2024|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cxsgo|  楼主 | 2013-12-2 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xinzha| | 2013-12-3 11:33 | 只看该作者
操作系统中可能会有很多个进程并行执行,这些进程也许都是单独编译的应用软件,它们在启动时都使用了基本相同的地址空间配置,也就是多个进程使用了重复的地址空间,如果没有虚拟地址模式的话,这种应用模式干脆不能实现。
所以有些聪明人就想到了可以让应用程序运行在相同的虚拟地址上,但是底层的软件将这些虚拟地址分配在不同的物理地址上。
在windows系统中由于分段模式的使用,逻辑地址更加复杂,首先要将逻辑地址翻译成线性地址,再由线性地址翻译成物理地址。
而在linux系统的绝大多数程序中,直接抛弃了分段模式,基本可以认为线性地址等于逻辑地址。

使用特权

评论回复
板凳
飞雪季节| | 2013-12-3 21:18 | 只看该作者
楼主估计也像我这种非计算机科班出生的半路程序员,以前刚接触的单片机是51,其次是ARM7,程序所运行的地址和实际总线上的地址完全一样,都是实地址。第一次接触MMU很晕,这种内存管理对于简单的系统是足够的,因为简单,容易理解,不绕弯。但也带了实际的问题,当一个任务破坏了系统,比如产生了内存越界,必须重启整个系统,才能解决问题。每一个任务都可以威胁内核或者其他任务,系统的安全性也比较差,无法提供更复杂的应用。

所以在高级的处理器上都集成了MMU单元,每个进程都是通过页表来间接访问实际的内存,每个进程都有自己的页表,那么进程间从逻辑上就把内存隔离开了,一个进程访问不了另外一个进程的内存空间,同时在页表中还有内存访问权限的控制,比如访问了空指针,会触发CPU的缺页异常,这个时候只需要杀掉出问题的进程,但整个系统还是正常的。
对于linux虽然用户进程内存空间是分离的,但kernel还是个大的线程池,所有的内核线程都共享一个页表,主要为了处理简单,带了的问题是一个内核驱动出问题,一般的解决方法就是重启系统。

有本书叫 Linux内核情景分析 开始章节介绍了X86处理器段页式的内存映射,可以仔细看看。ARM9/ARM11/CORTEX-A系列有MMU功能,内存映射相对简单一些,因为X86有着段地址的历史包袱,而ARM没有。

使用特权

评论回复
地板
cxsgo|  楼主 | 2013-12-5 21:04 | 只看该作者
飞雪季节 发表于 2013-12-3 21:18
楼主估计也像我这种非计算机科班出生的半路程序员,以前刚接触的单片机是51,其次是ARM7,程序所运行的地址 ...

楼上正解,做本行混不下去了,是否可以这么理解,写程序时的地址和在MCU中的地址是两个不相同的地址?

使用特权

评论回复
5
刘骁奖| | 2013-12-5 21:28 | 只看该作者
软件里操作逻辑地址就可以了!

使用特权

评论回复
6
飞雪季节| | 2013-12-6 20:28 | 只看该作者
cxsgo 发表于 2013-12-5 21:04
楼上正解,做本行混不下去了,是否可以这么理解,写程序时的地址和在MCU中的地址是两个不相同的地址? ...

可以这样理解,在linux系统里,对于用户进程来说逻辑地址和物理地址是完全不相同的,你只能操作逻辑地址。 但如果是开发驱动,在内核空间,内存地址和实际的物理地址只是一个偏移量,可以直接计算出来(但也不全是,要看相关的资料)。

假如不是linux系统,有些OS适配到比如ARM9上时,只是建立一个简单的页表,让物理地址和逻辑地址完全对应,可以认为逻辑地址就是实际地址。

使用特权

评论回复
7
yyql008| | 2013-12-9 09:05 | 只看该作者
物理地址就是物理地址,
逻辑地址是方便软件编程和代码保护之类的.他们没有直接的映射关系.

使用特权

评论回复
8
adef_13| | 2013-12-21 16:49 | 只看该作者
学习了              

使用特权

评论回复
9
cxsgo|  楼主 | 2013-12-26 22:44 | 只看该作者
怎么结贴给分的,分数分配错误是 什么问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

58

帖子

1

粉丝