`
suoyihen
  • 浏览: 1359023 次
文章分类
社区版块
存档分类
最新评论

Linux0.11内核--启动引导代码分析setup.s

 
阅读更多

setup的整体作用:

首先利用BIOS中断读取机器的数据,将其保存在地址0x9000:0x0000处,覆盖了原来bootsect.s代码所在的位置,由于bootsetc模块的代

码运行完毕,已经没有其他的用处了,所以可以将其覆盖掉。

然后关闭中断,setup将system模块整体移动至内存起始处,原来位于0x1000:0x0000,由于movsb和movsw指令的功能是移动一个字节或

者一个字,源地址由寄存器ds:si指定,目的地址由es:di指定。

指令cld指明di和si的方向是递增,而std是递减。

由于system模块大小超过64K(实模式一个段的最大偏移),而移动指令需要指明段寄存器,所以需要分段移动,下面是移动代码,代码语法是

AT&T改写的

然后设置数据段寄存器ds并加载中断描述符和全局描述符

lidt和lgdt的操作数是6个字节

第一第二字节表示描述符表的长度值,第三到第六字节表示的是32位的线性基地址(描述符在内存的中的位置)

GDT格式的详情请见

Linux0.11内核--32位保护模式GDT(全局描述符表)

idt_48和gdt_48的内容如下:

其中gdt_48中第一个字节表示描述符表中的描述符的个数,由于GDT表在内存中占用2KB的内存空间,一个GDT有64位(8个字节),故有

256项,后面四个字节表示一个32位的线性地址0x0009<<16+0x0200+gdt

实际就是本程序中的gdt的地址。

下面开启A20地址线

操作系统从实模式转换成保护模式时需要开启A20地址线,那什么是A20地址线呢?

在8086/8088CPU中,地址线只有20根,而寄存器都是16位的,为了能够使用20位地址线,它采用段地址:偏移地址的形式,寻址范围

就可以达到1M,但是到了80286地址线达到24根,80386达到32根寻址能力达到4GB。为了向后兼容,IBM采用了一个控制方法:用键盘

控制器上的一个空闲的控制线来控制。即A20控制线。当A20打开时可以使用20-31的地址线,如果A20没有打开,后面的地址线就不可以使

用,全部为0。

所以,激活A20地址线的流程为:

1.关闭中断;

2.等待8042 Input buffer为空;

3.发送禁止键盘操作命令;

4.等待8042 Input buffer为空;

5.发送读取8042 Output Port命令;

6.等待8042 Output buffer有数据;

7.读取8042 Output buffer,并保存得到的字节;

8.等待8042 Input buffer为空;

9.发送Write 8042 Output Port命令到8042 Input buffer;

10.等待8042 Input buffer为空;

11.将从8042 Output Port得到的字节的第2位置1(或清0),然后写入8042 Input buffer;

12.等待,直到8042 Input buffer为空为止;

13.发送允许键盘操作命令到8042 Input buffer;

14. 打开中断。

下面是as86的汇编代码(linux0.11内核中)

然后对中断进行编程

实际上就是设置8259中断控制器的ICW字

其中.word 0x00eb是直接进跳转指令的操作码,带一个字节的相对移位值,移动范围是-127--+127CPU通过将这个移位值加到EIP寄

存器,形成新的地址。实际上就是起到延迟的作用。

最后,进入32位的保护模式运行,首先加载机器状态字,CR0,其比特位0置1表示CPU工作在保护模式下。

下面分别是AS86格式和AT&T汇编格式

分享到:
评论

相关推荐

    Linux-0.11 [内核源代码带中文注释]

    bootsect.s 被bios-启动子程序加载至0x7c00 (31k)处,并将自己 ! 移到了地址0x90000 (576k)处,并跳转至那里。 ! ! 它然后使用BIOS 中断将'setup'直接加载到自己的后面(0x90200)(576.5k), ! 并将system 加载到地址...

    Linux0.11内核初始化讲解与调试

    结合bochs仿真调试工具边讲解边调试linux0.11版本内核初始化过程,通过该课程可以学习和理解关于linux内核在内存中的分布、分段及分页机制、逻辑地址线性地址及物理地址的区别,更系统的理解CPU实模式及保护模式等。...

    linux-0.11中保护模式建立过程的分析

    linux-0.11是Linus写的比较老的一个linux版本,该版本的linux利用了很多80x86的特性,特别...所以我从我学习的角度并结合linux-0.11的三个文件bootsect.s、setup.s和head.s来说说80x86实模式和保护模式的一下工作细节。

    linux内核 0.11版本源码 带中文注释

    * 以下这些数据是由setup.s 程序在引导时间设置的(参见第2 章2.3.1 节中的表2.1)。 */ #define EXT_MEM_K (*(unsigned short *)0x90002) // 1M 以后的扩展内存大小(KB)。 #define DRIVE_INFO (*(struct ...

    Linux0.11内核 遇见的问题

    Linux–“bad interpreter”问题 1、问题原因:在Windows下进行编辑后拷贝到Linux下...2)直接执行sed -i “s/\r//” setup.sh来转化。 3)直接执行dos2unix setup.sh来转化。 dos2unix setup.sh 或者 busybox dos2unix

    linux-0.11 [内核源代码带英文注解]

    * This is set up by the setup-routine at boot-time */ #define EXT_MEM_K (*(unsigned short *)0x90002) #define DRIVE_INFO (*(struct drive_info *)0x90080) #define ORIG_ROOT_DEV (*(unsigned short *)0x...

    linux-0.11:来自Linux内核完全注释的内容

    进度内核引导启动程序 boot boot sect.s setup.s head.s内核初始化 kernel init main.c##进程调度与系统调用 asm.s traps.c system_call.s mktime.c sched.c signal.c exit.c fork.c sys.c vsprintf.c p

    windows上可编译Linux内核

    2.MinGW中不带as86编译器,因而把boot目录下原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.并且更名为bootsect.asm和setup.asm. 3.在Makefile作的主要修改: 在LDFLAGS中加了--image-base ...

    Linux0.11内核之Boot那些事

    详细介绍linux0.11版本内核boot目录下的三个启动文件:bootsect.s、setup.s和head.s。

    windows下可编译linux 用insight+bochs源码级调试

    2.MinGW中不带as86编译器,因而把boot目录下原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.并且更名为bootsect.asm和setup.asm. 3.在Makefile作的主要修改: 在LDFLAGS中加了--image-base ...

    linux_kernel12:国科大操作系统高级教程-linux_kernel-课堂项目

    0.11代码,里面有vs2015的工程文件,可以方便的看代码||----source_code_att 修改后的linux-0.11代码,里面的src中bootsec.s,setup.s,head.s使用AT&T格式编写,负责生成linux内核 image安装必要的细节apt-get install ...

Global site tag (gtag.js) - Google Analytics