免费注册 查看新帖 |

Chinaunix

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

bootsect启动时,为何要把自己搬到0x9000呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-27 19:36 |只看该作者 |倒序浏览
如题,初学源码,看0.11源码注释的时候遇到的问题,找了几本书,没有看到答案……
bootsect之后的作用好像仅仅是509那两个字节吧……

论坛徽章:
0
2 [报告]
发表于 2009-01-31 19:32 |只看该作者
bootsect.s开头有一段注释
  16! NOTE! currently system is at most 8*65536 bytes long. This should be no
  17! problem, even in the future. I want to keep it simple. This 512 kB
  18! kernel size should be enough, especially as this doesn't contain the
  19! buffer cache as in minix
最后提到了与minix比较
估计当时Linus参考minix进行开发,受到minix的影响吧
可以找一下《操作系统 设计与实现》这本书翻一下,书中有没有讲就不清楚了
或者看一下早期minix启动部分源码看一下又没有注释

个人感觉这是根据早期内核大小设置了一个值
你可以这么想,你自己写一个系统,通过控制它的内存使用,只要保证系统不被破坏,
具体搬到什么地方以及是否搬移都可以由你来控制

论坛徽章:
0
3 [报告]
发表于 2009-01-31 21:22 |只看该作者
终于有个人回答了……感动……
我就是觉得有点奇怪,按理说LInux这么优秀的操作系统,尽管是0.11,也不应该出现多此一举的事情才对……
可是实在看不出原因……还是去看看你说的书吧……谢谢~

论坛徽章:
0
4 [报告]
发表于 2009-01-31 21:32 |只看该作者
POST后调用int 19h 将 MBR 加载到 0x7c00 这是 x86 体系决定,
MBR 又加载 bootsect 到令一个地方进行解压或什么的,如又加到 0x7c00 或 0x6000 或 0x20000 或其它,这些工作都是前期的,一般操作系统都这么做。

论坛徽章:
0
5 [报告]
发表于 2009-01-31 21:38 |只看该作者
原帖由 mik 于 2009-1-31 21:32 发表
POST后调用int 19h 将 MBR 加载到 0x7c00 这是 x86 体系决定,
MBR 又加载 bootsect 到令一个地方进行解压或什么的,如又加到 0x7c00 或 0x6000 或 0x20000 或其它,这些工作都是前期的,一般操作系统都这么做。

呃,我想问的是这么做的意义……直接在0x7c00运行不好么?

论坛徽章:
0
6 [报告]
发表于 2009-01-31 21:44 |只看该作者
原帖由 jjj137 于 2009-1-31 21:38 发表

呃,我想问的是这么做的意义……直接在0x7c00运行不好么?

0x7c00是 bios 加载的,
理论上可以加载到任何地方执行。

但是,一个OS不是简单的某一块数据,有N多的数据要加载,需要加载多次,总得另找个地方放吧

论坛徽章:
0
7 [报告]
发表于 2009-01-31 22:16 |只看该作者
原帖由 mik 于 2009-1-31 21:44 发表

0x7c00是 bios 加载的,
理论上可以加载到任何地方执行。

但是,一个OS不是简单的某一块数据,有N多的数据要加载,需要加载多次,总得另找个地方放吧

我的意思是直接加载下一个模块setup不行么?毕竟bootsect已经在0x7c00了,可以直接运行。不复制bootsect不是可以减少出错的几率么?对于实模式来说,操作应该越少越好吧……

论坛徽章:
0
8 [报告]
发表于 2009-01-31 22:36 |只看该作者
原帖由 jjj137 于 2009-1-31 22:16 发表

我的意思是直接加载下一个模块setup不行么?毕竟bootsect已经在0x7c00了,可以直接运行。不复制bootsect不是可以减少出错的几率么?对于实模式来说,操作应该越少越好吧……


0x7c00 被加载进去的是 MBR,linux 的 0x7c00 我没看过是怎样的,

windows vista 的 0x7c00 区域我倒是略为看过。

int 19h 把磁盘的 MBR 加载到 0x7c00(不是 bootsect),转到 0x7c00,然后搬到 0x6000 继续执行

MBR 的主要任务的,检查磁盘4个主分区,发现第1个可启动分区时,将这个分区的 bootsect 重新加载到 0x7c00 再执行,这时候才是加载的分区的 bootsect。





贴一段 vista 安装的 MBR,如下:

00007c00:        xor ax, ax
00007c02:        mov ss, ax
00007c04:        mov sp, 0x7c00
00007c07:        mov es, ax
00007c09:        mov ds, ax
00007c0b:        mov si, 0x7c00
00007c0e:        mov di, 0x0600
00007c11:        mov cx, 0x0200
00007c14:        cld
00007c15:        rep movsb byte ptr es:[di], byte ptr ds:[si]     /* 搬到 0x6000, 长度 512 字节 */
00007c17:        push ax
00007c18:        push 0x061c
00007c1b:        retf
00007c1c:        sti
00007c1d:        mov cx, 0x04
00007c20:        mov bp, 0x07be
00007c23:        cmp byte ptr ss:[bp], 0x00             /* 检查引导标志,是否为 0x80,可启动标志 */
00007c27:        jl .+0x0b       (0x00007c34)
00007c29:         jnz .+0x0110  (0x00007d3d)
00007c2d:        add bp, 0x10
00007c30:        loop .+0xfff1
00007c32:        int 0x18
00007c34:        mov byte ptr ss:[bp], dl             /* dl = 0x80, 写引导标志为 0x80 */
00007c37:        push bp
00007c38:        mov byte ptr ss:[bp+0x11], 0x05      /* 写第2个分区表*/
00007c3c:        mov byte ptr ss:[bp+0x10], 0x00      /* 写第2个分区表*/
00007c40:        mov ah, 0x41
00007c42:        mov bx, 0x55aa                    
00007c45:        int 0x13                            /* 检查扩展功能是否存在 */
00007c47:        pop bp
00007c48:        jb .+0x000f                         /* 假如出错 */
00007c4a:        cmp bx, 0xaa55
00007c4e:        jnz .+0x0009
00007c50:        test cx, 0x01
00007c54:        jz .+0x03
00007c56:        inc byte ptr ss:[bp+0x10]
00007c59:        pushad
00007c5b:        cmp byte ptr ss:[bp+0x10], 0x00
00007c5f:                        jz .+0x26
00007c61:        push 0x00
00007c67:        push dword ptr ss:[bp+0x08]
00007c6b:        push 0x00
00007c6e:        push 0x7c00
00007c71:        push 0x01
00007c74:        push 0x10
00007c77:        mov ah, 0x42
00007c79:        mov dl, byte ptr ss:[bp]
00007c7c:        mov si, sp
00007c7e:        int 0x13
00007c80:        lahf
00007c81:        add sp, 0x10
00007c84:        sahf
00007c85:        jmp .+0x14
00007c87:        mov ax, 0x0201
00007c8a:        mov bx, 0x7c00
00007c8d:        mov dl, byte ptr ss:[bp]
00007c90:        mov dh, byte ptr ss:[bp+0x01]
00007c93:        mov cl, byte ptr ss:[bp+0x02]
00007c96:        mov ch, byte ptr ss:[bp+0x03]
00007c99:        int 0x13                 /* 读进第1个分区 */

... ...

论坛徽章:
0
9 [报告]
发表于 2009-01-31 22:39 |只看该作者
……看来咱们说的是两回事……我问的不是MBR……

论坛徽章:
0
10 [报告]
发表于 2009-01-31 22:44 |只看该作者
哦哦,终于找到了,原来是为了setup.S将参数表保存到那里而预留空间……
PS:发现我Google搜索任意关键字全被归为恶意网站……

[ 本帖最后由 jjj137 于 2009-1-31 22:47 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP