Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,长修远,我们不能没有钱
随笔 - 172, 文章 - 0, 评论 - 257, 引用 - 0
数据加载中……

Linux内核引导分析

MOVW 指令

MOVW:将DS:SI的内容送至ES:DI,是复制过去,原来的代码还在。很多书用了“移”这个字,实际上是复制过去。每次复制.DS:SI ,ES:DI自动加1

Linux内核中引导部分一开始有这样一段代码:

45 entry start ! 告知连接程序,程序从start 标号开始执行。
46 start:
47 mov ax,#BOOTSEG ! 将ds 段寄存器置为0x7C0;
48 mov ds,ax
49 mov ax,#INITSEG    ! 将es 段寄存器置为0x9000;
50 mov es,ax
51 mov cx,#256             ! 移动计数值=256 字;
52 sub si,si                    ! 源地址 ds:si = 0x07C0:0x0000
53 sub di,di                    ! 目的地址 es:di = 0x9000:0x0000
54 rep                              ! 重复执行,直到cx = 0
55 movw                          ! 移动1 个字;
56 jmpi go,INITSEG      ! 间接跳转。这里INITSEG 指出跳转到的段地址。
57 go: mov ax,cs            ! 将ds、es 和ss 都置成移动后代码所在的段处(0x9000)。

! 47--56 行作用是将自身(bootsect)从目前段位置0x07c0(31k)
! 移动到0x9000(576k)处,共256 字(512 字节),然后跳转到
! 移动后代码的go 标号处,也即本程序的下一语句处。

注意,在55行执行完毕之后,0x7c00之后的512字节应当与0x9000之后的512字节一模一样。
然后看56行,这里的go是段内偏移,也就是0x39(十进制的57),而INITSEG=0x9000,所以执行这条语句是跳到0x9000:0x39也就是复制过去的第57行,这样代码就相当于在一个程序里继续执行了。

----------------------------------------------------
REP指令

每次执行rep指令,CX减1,然后判断CX是否等于0,如果不为0则继续执行rep指令后的串操作指令,直到CX为0,实现重复。

----------------------------------------------------

Jmpi指令

段间跳转,其Opcode为Eah,其格式为:jmpi Offset, Segment Selector


posted on 2007-03-02 09:44 Khan 阅读(2002) 评论(1)  编辑 收藏 引用 所属分类: GCC/G++跨平台开发周边技术

评论

# re: Linux内核引导分析  回复  更多评论   

good
2008-09-18 16:06 | fjx

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理