操作系统的启动引导_第1页
操作系统的启动引导_第2页
操作系统的启动引导_第3页
操作系统的启动引导_第4页
操作系统的启动引导_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统的启动引导操作系统的启动引导操作系统初探操作系统初探l计算机硬件结构l计算机系统结构l什么是操作系统计算机硬件结构计算机硬件结构计算机硬件结构计算机硬件结构l计算机是如何在上屏幕上输出“hello!”的?计算机系统结构计算机系统结构l操作系统是计算机硬件和应用之间的一层软件什么是操作系统什么是操作系统l是计算机硬件和应用之间的一层软件p方便我们使用硬件,如使用显存p高效的使用硬件,如开多个终端(窗口)l管理什么Linux 0.11Linux 0.11启动代码分析启动代码分析l计算机是如何工作的l引导扇区代码:Bootsect.slSetup模块分析lSystem模块分析计算机是如何工作

2、的计算机是如何工作的l从白纸到图灵机从白纸到图灵机计算机是如何工作的计算机是如何工作的l从图灵机到通用图灵机从图灵机到通用图灵机计算机是如何工作的计算机是如何工作的l从通用图灵机到计算机从通用图灵机到计算机p冯渃依曼在1946年提出存储程序思想p存储程序的主要思想:将程序和数据存放到计算机内部的存储器中,计算机在程序的控制下一步一步进行处理p计算机由五大部件组成:输入设备、输出设备、存储器、运算器、控制器计算机是如何工作的计算机是如何工作的l打开电源,计算机执行的第一条指令打开电源,计算机执行的第一条指令p计算模型我们要关注指针IP及其指向的内容计算机刚打开电源时,IP=?是由硬件设计者决定!

3、lx86 PCx86 PCpx86 PC刚开机时CPU处于实模式(cs:ip的寻址模式)p开机时,CS=0 xFFFF; IP=0 x0000寻址0 x?(为ROM BIOSROM BIOS映射区映射区)p检查RAM,键盘,显示器,软硬磁盘p将磁盘0磁道0扇区读入cs=0 x07c0, ip=0 x0000处,寻址0 x?计算机是如何工作的计算机是如何工作的l0 x7c000 x7c00处存放的代码处存放的代码p是从磁盘引导扇区读入的那512个字节p引导扇区就是启动设备的第一个扇区p启动设备信息被设置在CMOS中CMOS是BIOS吗?p因此,硬盘的第一个扇区上存放着开机后执行的第一段我们可以控

4、制的程序CMOSCMOS: 互补金属氧化物半导体(64B-128B),是电脑主板上用来保存计算机基本启动信息。CMOS RAM本身只是一块存储器,只有数据保存功能。对BIOSBIOS中各项参数的设定要通过专门的程序。因此BIOS设置有时也被叫做CMOS设置。 引导扇区代码:引导扇区代码:Bootsect.sBootsect.s.globl begtext,begdata,begbss,endtext,enddata,endbss.text /文本段begtext:.data /数据段begdata:.bss /未初始化数据段begbss:entry start /关键字entry告诉链接器“程

5、序入口”start:mov ax, #BOOTSEG mov ds, axmov ax, #INITSEG mov es, axmov cx, #256sub si, si sub di,direp movwjmpi go, INITSEG.text等是伪操作符,告诉编译器产生文本段,.text用于标识文本段的开始位置。SETUPLEN = 4BOOTSEG = 0 x07c0INITSEG = 0 x9000SETUPSEG = 0 x9020SYSSEG = 0 x1000ENDSEG = SYSSEG + SYSSIZEROOT_DEV = 0X306ds=0 x07c0es=0 x90

6、00cx计数寄存器计数256W表示移动的是字移动多少字节呢?si=0, di=0这就是0 x7c00处存放的语句ds:si为0 x7c00,ds为数据段寄存器,si为源变址寄存器,可用来存放相对于DS段之源变址指针es:di为0 x90000,es为附加段寄存器,di为目地变址寄存器,可用来存放相对于 ES 段之目的变址指针段间跳转:cs=INITISE=0 x9000,ip=go引导扇区代码:引导扇区代码:Bootsect.sBootsect.slBootsect.s首先将自身复制到地址0 x90200中,并跳转到复制后的地址中执行:引导扇区代码:引导扇区代码:Bootsect.sBoots

7、ect.sl jmpi go, INITSEG之后go: mov ax,csmov ds,ax mov es,ax mov ss,ax mov sp,#0 xff00load_setup: /载入setup模块mov dx,#0 x0000 mov cx,#0 x0002 mov bx,#0 x0200mov ax,#0 x0200+SETUPLEN int 0 x13 /BIOS中断jnc ok_load_setupmov dx,#0 x0000mov ax,#0 x0000int 0 x13j load_setup /重读 cs=0 x9000ds, es, ss=0 x9000sp=0

8、xFF00栈空间为?0 x90000- 0 x9FF00INT 0 x13,AH=02:BIOS读磁盘扇区的中断:dh=磁头号,dl=驱动器号,驱动器0,磁头0ch=柱面号,cl=开始扇区,磁道0,扇区2es:bx=读出数据的缓冲区地址(es:bx为0 x90200)al=要读的扇区数(SETUPLEN=4)如果成功,则跳转到ok_load_setup跳转到load_setup,重读否则,复位磁盘引导扇区代码:引导扇区代码:Bootsect.sBootsect.sl执行jmpi go,INITSEG后就由开始的Bootsect.s跳转到复制后的Bootsect.s中的标号go处继续执行;然后B

9、ootsect.s把Setup.s从磁盘中读取到内存位置0 x90200处,如下图所示:引导扇区代码:引导扇区代码:Bootsect.s Bootsect.s Ok_load_setup: /载入setup模块 mov dl,#0 x00 mov ax,#0 x0800 int 0 x13 mov ch,#0 x00 mov sectors,cx mov ah,#0 x03 xor bh,bh int 0 x10 /读光标 mov cx,#24 mov bx,#0 x0007 mov bp,#msg1 mov ax,#1301 int 0 x10 /显示字符 mov ax,#SYSSEG /S

10、YSSEG=0 x1000 mov es,ax call read_it /读入system模块 jmpi 0,SETUPSEGbootsect.s中的数据/在文件末尾sectors: .word 0 /磁道扇区数msg1:.byte 13,10/换行+回车.ascii “Loading system.”.byte 13,10,13,10 /2对换行+回车获得磁盘参数,dl为磁盘驱动器号获取光标位置和形状,bh为页号cx=24表示输出24个字符, bl=7为显示属性写字符串,al=1表示字符串只包含字符码,显示之后更新光标位置es:bp为字符串的段:偏移地址,bp=msg1,es=SSSEG=

11、0 x1000ip=0,cs=SETUPSEG=0 x9020,cs:ip为0 x90200,跳转到0 x90200地址处的第一条指令继续执行,也就是进入到了Setup.s中引导扇区代码:引导扇区代码:Bootsect.sBootsect.sl加载完Setup.s后在屏幕上打印Loading system .l接着调用read_it把SYSTEM,也就是LINUX0.11的内核读取到内存位置0 x10000处引导扇区代码:引导扇区代码:Bootsect.sBootsect.sl为什么读入system模块还需要定义一个函数?read_it: mov ax,es cmp ax,#ENDSEG jb

12、 ok1_read retok1_read:mov ax,sectorssub ax,sread /sread是当前磁道已读扇区数,ax未读扇区数call read_track /读磁道.psystem模块可能很大,要跨越磁道!pENDSEG=SYSSEG+SYSSIZEpSYSSIZE=0 x8000 /该变量可根据Image大小设定(编译操作系统时)引导扇区代码:引导扇区代码:Bootsect.sBootsect.sl引导扇区的末尾/BIOS用以识别引导扇区ljmpi 0, SETUPSEG跳转至setup执行.org 510 .word 0 xAA55 /扇区的最后两个字节lBootSe

13、ct小结:采用分段读入的方式将OS从磁盘载入到内存中p将自身复制到地址0 x90200处p读入setupp在屏幕上打印启动Logop读入systemSetupSetup模块分析模块分析lSetup.s将完成OS启动前的设置start: mov ax,#INITSEG mov ds,ax mov ah,#0 x03 xor bh,bh int 0 x10 mov 0,dx mov ah,#0 x88 int 0 x15 mov 2,ax . cli /不允许中断 mov ax,#0 x0000 clddo_move: mov es,ax add ax,#0 x1000 cmp ax,#0 x90

14、00 jz end_move mov ds,ax sub di,di sub si,si mov cx,#0 x8000 rep movsw jmp do_move INITSEG = 0 x9000ds=0 x9000取光标位置信息放在dx这是间址寻址,当前数据段ds=0 x9000,这条指令将放在dx中的光标位置信息存放在0 x90004+0的位置,即0 x90000获取物理内存大小,返回值放入AX中同理,这条指令将放在ax中的物理内存大小信息存放在0 x9000 Imagetools/system: boot/head.o init/main.o $(DRIVERS) $(LD) boo

15、t/head.o init/main.o $(DRIVERS) -o tools/system Image为输入文件 为软驱AMakefileSystemSystem模块分析模块分析lsetup是进入保护模式,head是进入之后的初始化startup_32: movl $0 x10,%eax mov %ax,%ds mov %ax,%esmov %ax,%fs mov %ax,%gs /指向gdt的0 x10项(数据段)lss _stack_start,%esp /设置栈(系统栈)call setup_idtcall setup_gdt xorl %eax,%eax1:incl %eaxmov

16、l %eax,0 x000000 cmpl %eax,0 x100000je 1b /0地址处和1M地址处相同(A20没开启),就死循环jmp after_page_tables /设置页表之后setup_idt: lea ignore_int,%edxmovl $0 x00080000,%eax movw %dx,%axlea _idt,%edi movl %eax,(%edi) 这是32位汇编代码关于汇编关于汇编las86汇编:能产生16位代码的Intel 8086(386)汇编pmov ax, cs /csax, 目标操作数在前lGNU as汇编:产生32位代码,使用AT&T系统

17、V语法pAT&T美国电话电报公司,包含贝尔实验室等,1983年AT&T UNIX支持组发布了系统Vpmovl var, %eax/(var) %eaxpmovb -4(%ebp), %al /取出一字节l内嵌汇编,gcc编译x.c会产生中间结果as汇编文件x.s_asm_(“汇编语句”: 输出: 输入: 破坏部分描述);_asm_(“movb %fs:%2, %al”:”=a”(_res):”0”(seg),”m”(*(addr);SystemSystem模块分析模块分析lhead.s所做的工作:p又一次初始化了idt表和gdt表p然后开启20号地址线,这样就可以访问4G的内存

18、了lafter_page_tablespsetup_paging执行ret后? 会执行函数main()p进入main()后的栈为0,0,0,L6pmain()函数的三个参数是0,0,0pmain()函数返回时进入L6,死循环.after_page_tables:pushl $0 pushl $0 pushl $0 pushl $L6pushl $_main jmp set_pagingL6: jmp L6setup_paging: 设置页表retSystemSystem模块分析模块分析l进入main函数在init/main.c中void main(void) mem_init(); trap_init(); blk_dev_init(); chr_dev_init(); tty_i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论