免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5765 | 回复: 14
打印 上一主题 下一主题

为什么操作系统启动的时候总要把内存移来移去的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-24 13:22 |只看该作者 |倒序浏览
很多操作系统在刚开始加载的时候都要把内核在内存中移动来移动去的,一会加载到一个地址一会又移动到另一个,为什么呢?难道不能一开始就放到一个固定的位置吗?

论坛徽章:
0
2 [报告]
发表于 2007-05-24 19:01 |只看该作者
原帖由 shineyear 于 2007-5-24 13:22 发表于 1楼  
很多操作系统在刚开始加载的时候都要把内核在内存中移动来移动去的,一会加载到一个地址一会又移动到另一个,为什么呢?难道不能一开始就放到一个固定的位置吗?


因为,BIOS 加载 OS loader, loader 再通过加载 OS kernel, kernel 通常是压缩的,还需经过解压.然后再转入kernel

论坛徽章:
0
3 [报告]
发表于 2007-05-24 21:41 |只看该作者
在嵌入式系统里好像没有像pc上那个BIOS吧。其BootLoader好像都包括了硬件检测和初始化。

论坛徽章:
0
4 [报告]
发表于 2007-05-25 08:10 |只看该作者
这是因为引导程序还要通过BIOS调用来获得机器的一些参数,比如硬盘,显卡等。而BIOS初始化时是从内存0开始的,如果直接把kernel移动到内存0处,就会覆盖BIOS代码。

论坛徽章:
0
5 [报告]
发表于 2007-05-25 08:34 |只看该作者
对于pc而言,启动时会将硬盘第一个扇区的512个字节加载到地址0x7c00处执行。

注意,这里只加载了512字节的内容。

这段512字节的代码(其中还包含了64字节的硬盘分区表)会从硬盘的活动分区加载一个boot loader。而boot loader又会从其他地方加载真正的内核。

正是因为系统启动需要有这么多次的加载过程,造成其会对内存进行多次移动和拷贝。这主要是历史遗留问题

论坛徽章:
0
6 [报告]
发表于 2007-05-26 22:55 |只看该作者
楼上和楼上的楼上说法一致么?能解释一下么?

论坛徽章:
0
7 [报告]
发表于 2007-05-29 08:53 |只看该作者
是一至的,只不过我ls那个倾向于解释硬件处理的部分,而我说的是硬件处理完了,然后从硬盘开始加载软件的部分

论坛徽章:
0
8 [报告]
发表于 2007-05-29 12:36 |只看该作者
bios把控制交给操作系统,这就是你们两人说法的分界点,是么

论坛徽章:
0
9 [报告]
发表于 2007-05-29 21:12 |只看该作者
是的:)

论坛徽章:
0
10 [报告]
发表于 2007-05-30 08:52 |只看该作者
谢谢解释
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP