4077|4

93

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

linux(0.11)内核完全剖析, 碰到问题了 [复制链接]

p18:
当计算机复位或开机时, cpu自动将cs设为0xf000, 则其段基址被设置为0xffff0000, 段长度64k, IP设置为0xfff0, 因此代码指针指向0xfffffff0.

问题是, 通过 段基址 + IP 就可以获得指令地址, 那CS在这里起什么作用那


P31:
由于BIOS把程序加载到物理内存0x7c00处并跳转到该处时, 所有段寄存器(包括CS)默认值均为0, 即此时CS:IP = 0x0000:0x7c00, 因此这里的段间跳转语句就是为了给CS寄存器赋值0x7c0, 该语句执行后CS:IP = 0x07c0:0x0005。

相关代码:

BOOTSEG = 0x07c0
.......
          jumpi    go,BOOTSEG
go:     mov      ax, cs
........

问题:

        CS和IP值为什么会这样变化, jumpi 语句怎么个执行原理。
        如上贴, 加电时CS被初始化0xf000, 这里怎么又说默认值0
此帖出自Linux开发论坛

最新回复

Linux 初学者 还看不懂   详情 回复 发表于 2008-3-21 20:10
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
佩服,看得好仔细哟。
帮顶!
此帖出自Linux开发论坛
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
p18: 给 cs赋值 就是给了你段的基地址。这就是cs的作用,以后,代码的执行就是cs:ip形式寻址了。
p31: cs,ip的变化: 因为jumpi为段间跳转,如果跳转成功,即给了cs与ip新的值(新的地址),在上面程序中
                     即cs为bootseg的值。而ip的值原来为0,但是经过几条指令执行后ip的地址逐增加1。请
                     再去详细阅读。

                     加电的时候,是cpu给予了一个初始值给cs,让cpu在这里寻找指令开始,这是历史原因造就的(以方面进入bios,方面代码的引导)。而在开始执行后(进入了引导区代码),cs及其他的段都重新给于0。现在虽然已经加载了代码到目的位置,但没有设置寄存器的,所以必须有以上代码设置。请注意分清:BIOS加载程序到0x7c0处是由于引导区代码设置了段的开始地址,一运行就加载到此。而与此时段的寄存器并无关。

请各位再讨论。
此帖出自Linux开发论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
那么重新设置IP是引导区代码干得了 但我在那个代码中没有见到, 似乎在进入引导区之前IP就已经是0了, 而之前, 大概也就是0xfffffff0的那个jmp指令吧, 也似乎没有机会设置ip
此帖出自Linux开发论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
Linux 初学者 还看不懂
此帖出自Linux开发论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表