免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-22 21:32 |只看该作者 |倒序浏览
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

论坛徽章:
0
2 [报告]
发表于 2007-10-22 21:50 |只看该作者
原帖由 zylthinking 于 2007-10-22 21:32 发表
p18:
当计算机复位或开机时, cpu自动将cs设为0xf000, 则其段基址被设置为0xffff0000, 段长度64k, IP设置为0xfff0, 因此代码指针指向0xfffffff0.

问题是, 通过 段基址 + IP 就可以获得指令地址, 那CS在 ...


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

cs设为0xf000, 则其段基址被设置为0xffff0000, 段长度64k, IP设置为0xfff0

这是一个初始状值,所有的机器字,寄存器等总要有个初始值呀。况且,在这里你还没弄明白 CS 寄存器的结构

0xF000 是 CS 的 selector 域
0xFFFF0000 是 CS 的 base address 域。
它们都是 CS 的一部分。 那么你说 CS 起什么作用呢?

在实模式下:从初始值变化以后, CS.base = CS.selector << 4



>>问题:
>>        CS和IP值为什么会这样变化, jumpi 语句怎么个执行原理。
>>        如上贴, 加电时CS被初始化0xf000, 这里怎么又说默认值0

jmp segment : offset   这种格式执行流程是:
实模式下:
1、加载 segment 值到 CS.selector
2、CS.base = CS.selector << 4     也就是: CS.base = segment << 4
3、转移到 CS.base + IP 处执行

至于这句话“加电时CS被初始化0xf000, 这里怎么又说默认值0” 说得有问题,不知所谓

论坛徽章:
0
3 [报告]
发表于 2007-10-22 21:54 |只看该作者
对于你的第一个问题,我觉得可能是作者此处有误,当PC的电源打开后,80x86结构的CPU将自动进入实模式,并从地址0xFFFF0开始自动执行程序代码,这个地址通常是ROM-BIOS中的地址。

论坛徽章:
0
4 [报告]
发表于 2007-10-22 21:59 |只看该作者
原帖由 mik 于 2007-10-22 21:50 发表


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

cs设为0xf000, 则其段基址被设置为0xffff0000, 段长度64k, IP设置为0xfff0

这是一个初始状值,所有的机器字,寄存器等总 ...


您说的selector, base address应该是在保护模式之后的术语了吧? 在刚刚启动时还处于实模式状态, 此时的CS寄存器就单纯地为一个寄存器而已. 不用考虑这么多吧?
望指教!

论坛徽章:
0
5 [报告]
发表于 2007-10-22 22:12 |只看该作者
原帖由 scutan 于 2007-10-22 21:59 发表


您说的selector, base address应该是在保护模式之后的术语了吧? 在刚刚启动时还处于实模式状态, 此时的CS寄存器就单纯地为一个寄存器而已. 不用考虑这么多吧?
望指教!


所以说,不建议你看那些学习“汇编语言”的教材,特别是国内的,

在中国,有相当多的人被那些教材误了,好象那个清华大学出版的”IBM PC 汇编语言“教材,没什么好值得推崇的。

要看就直接看 intel 或者 amd 的手册


说回正事:

CS (包括所有的段寄存器)就是一个物理级的寄存器。实际上它就包括 4 部分,selector,base,limit 以及 attributes。这些是物理存在的,怎么会在实模式无而保护模式有??

实模式下 limit 以及 attribute 无法更改,它们都是初始状态。保护模式下,limit 以及 attribute 随着 descriptor 的不同而更改

论坛徽章:
0
6 [报告]
发表于 2007-10-22 22:18 |只看该作者
原帖由 mik 于 2007-10-22 22:12 发表


所以说,不建议你看那些学习“汇编语言”的教材,特别是国内的,

在中国,有相当多的人被那些教材误了,好象那个清华大学出版的”IBM PC 汇编语言“教材,没什么好值得推崇的。

要看就直接看 intel 或 ...


哦,非常感谢,是我自己才浅薄了!把学到的知识忘掉了.
段寄存器的确是如你所说,就一般来说,分为可见部分与隐藏部分,可见部分就是平时所说的这16位段选择符,而隐藏部分就包括了段基地址,等内容.
我刚才想起了,其实在杨季文的书上讲过这个的. 怪自己看书没仔细!

论坛徽章:
0
7 [报告]
发表于 2007-10-22 22:19 |只看该作者
原帖由 scutan 于 2007-10-22 21:54 发表
对于你的第一个问题,我觉得可能是作者此处有误,当PC的电源打开后,80x86结构的CPU将自动进入实模式,并从地址0xFFFF0开始自动执行程序代码,这个地址通常是ROM-BIOS中的地址。


又被误导了,关于这个问题,就算是 Intel 以及 AMD 这些权威的文档都没能说清楚。

这个问题是要靠自已慢慢去理解体会。

RESET 和 INIT 时,processor 处理于混纯状态,并不是纯实模式,更不可能是保护模式,

但 CS.base + IP 是第1条指令处,是铁的真实。 也就是 0xFFFFFFF0 就是第 1 条指令处。此时,不需理解 processor 处于实模式还是保护模式。它只要执行指令就行了(BIOS)。

当执行第1条 jmp segment : offset  或 call segment : offset 指令时,它就真正进入了实模式状态。

论坛徽章:
0
8 [报告]
发表于 2007-10-22 22:31 |只看该作者

回复 #7 mik 的帖子

嗯, 谢谢. 明白了!

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
9 [报告]
发表于 2007-10-22 23:53 |只看该作者
唉, 我最挫。 不是不理解CS结构, 实际上根本不懂。
CS.base =  CS << 4, 算是明白了, 原以为base放在另一个寄存器里那。

第2个问题意思是既然 cs值为 0xf000了, 怎么后面又说其值为0, 如果将其理解成c的一个变量的话, 总要有个重赋值的过程。
而且, 加载 segment 值到 CS.selector, 如果原来是0x0000:0x7c00, 那么加载后应该是0x07c0:0x7c00, 为什么IP变成了0x0005, 那么下一条指令地址是0x00007c05, 这个指令是什么, 是
go:     mov      ax, cs
吗?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2007-10-22 23:56 |只看该作者
也就是说 jumpi 指令占用了5个字节?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP