免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lmarsin
打印 上一主题 下一主题

学习linux内核时,模仿linux编写的操作系统 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2010-03-25 23:53 |只看该作者
佩服

论坛徽章:
0
52 [报告]
发表于 2010-03-26 09:25 |只看该作者
传说中的李纳斯二代???

论坛徽章:
0
53 [报告]
发表于 2010-03-26 14:35 |只看该作者
好贴!

我是个文科生,生来对数字和硬件不敏感,对这些内存地址管理之类的更是头疼,读之如读天书;但是在我的既往经历中,也确实有过征服抽象的代码的经历,诀窍在于先观察哪些现实世界的东西,然后再把现实世界的东西想办法跟抽象的数字和代码关联起来,这是激发探究欲望最直接、有效的方法,有了兴趣,后面的一切就水到渠成。

论坛徽章:
0
54 [报告]
发表于 2010-03-26 17:34 |只看该作者
强帖留名
等能看懂的时候再来看

论坛徽章:
0
55 [报告]
发表于 2010-03-27 09:07 |只看该作者
同膜拜!

论坛徽章:
0
56 [报告]
发表于 2010-03-27 14:46 |只看该作者
只有膜拜的份。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
57 [报告]
发表于 2010-03-28 15:36 |只看该作者
看了boot.asm和setup.asm部分的代码,确实如文档中描述的,省略了将boot代码拷贝到0x90000处的过程,直接将setup的两个扇区读取到内存的0x90000处。
而setup程序本身也指定了链接时从0x90000地址开始。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
58 [报告]
发表于 2010-03-28 16:03 |只看该作者
setup.asm中
[ORG 0x90000]
    mov    ax, SETUP_SEG
    mov    ds, ax
    mov    es, ax

    mov    si, boot_msg
    call   print_msg
   
    mov    ax, 0x0000;
    mov    ds, ax
    mov    es, ax

这段代码的作用是打印启动信息的吗?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
59 [报告]
发表于 2010-03-28 16:19 |只看该作者
错误在于:

00090020: (                    ): int 0x15                  ; cd15            
00090022: (                    ): add ax, 0x0400            ; 050004          >> ax = 0
00090025: (                    ): shr ax, 0x02              ; c1e802
00090028: (                    ): shr ax, 0x0a              ; c1e80a




你使用了 int 0x15 来进行获取 memory size, 它返回 memory 放在 ax,加上 0x400 是什么意思?

mik兄,这个地方我的理解是这样的,通过0x15中断获取到的是1M之外扩展内存的大小,以K为单位,保存在ax中。
因此,计算全部内存的时候,需要这1M内存加上,即1024K=0x400.
这就是add ax, 0x0400的原因。

论坛徽章:
0
60 [报告]
发表于 2010-03-28 21:15 |只看该作者
回复 59# Godbach


    就是因为加了 0x400 导致 ax 溢出被清 0

 结果无论多少内存,都视为 0

 应该先 zero-extended 到 eax 然后再 0x400

或者:eax = ax * 0x400  化为以 byte 为单位,再加上 0x100000
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP