Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371326
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1767
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-24 16:18
个人简介

为啥不能追求自己的爱好一辈子呢

文章分类

全部博文(80)

文章存档

2017年(1)

2015年(2)

2014年(18)

2013年(59)

分类: C/C++

2013-05-10 16:56:32

概述:

setup程序的作用是把显示模式更改成video的1024*768模式,然后禁止中断,开启A20管脚,把内核代码转移到物理地址0处,并且进入32位保护模式运行,并跳转到绝对地址0处。

代码:


点击(此处)折叠或打开

  1. INITSEG   EQU 0x9000
  2. SETUPSEG  EQU 0x9020
  3. SYSSEG    EQU 0x1000

  4. LEDS     EQU        0x0001            ;键盘状态
  5. VMODE    EQU        0x0002            ; 真彩色位数
  6. SCRNX    EQU        0x0004            ; x分辨率
  7. SCRNY    EQU        0x0006            ; y分辨率
  8. VRAM     EQU        0x0008            ; 界面地址
  9. VBEMODE  EQU        0x105
  10. [bits 16]        
  11. ;我们首先把界面设置为1024*768,大部分机器都支持,如果不支持我们设置为320*200
  12.         mov ax,INITSEG
  13.         mov ds, ax
  14.         mov ax,0x2800;随便改到这里
  15.         mov es,ax;缓存地址
  16.         mov di,0;检查是否支持vesa
  17.         mov ax,0x4f00
  18.         int 0x10
  19.         cmp al,0x4f
  20.         jne scrn320
  21.         
  22.         mov ax,[es:di + 4];判断版本
  23.         cmp ax,0x200
  24.         jb scrn320
  25.         ;下边是标准的bios测试vesa的功能,请参照http://community.osdev.info/index.php?VESA
  26.         mov cx,VBEMODE
  27.         mov ax,0x4f01
  28.         int 0x10
  29.         cmp ax,0x004f;返回0x4f表示能用
  30.         jne scrn320
  31.         
  32.         cmp byte[es:di + 0x19],8;颜色是 8位
  33.         jne scrn320
  34.         cmp byte[es:di+0x1b],4;测试是不是调色板
  35.         jne scrn320
  36.         mov ax,[es:di+0x00];模式属性,bit7如果不是1就不好办(这样的话就不能加上0x400)
  37.         and ax,0x0080
  38.         jz scrn320
  39.         
  40.         mov bx, VBEMODE+0x4000;1024*768
  41.         mov ax,0x4f02
  42.         int 0x10
  43.         
  44.         mov byte[VMODE],8
  45.         mov ax,[es:di+0x12];x分辨率
  46.         mov word[SCRNX],ax
  47.         mov ax,[es:di+0x14]
  48.         mov word[SCRNY],ax
  49.         mov eax,[es:di+0x28]
  50.         mov dword[VRAM],eax
  51.         jmp keyboard
  52.         
  53.         
  54.         
  55. scrn320:
  56.         MOV        AL,0x13            ;
  57.         MOV        AH,0x00
  58.         INT        0x10
  59.         MOV        BYTE [VMODE],8    
  60.         MOV        WORD [SCRNX],320        
  61.         MOV        WORD [SCRNY],200        
  62.         MOV        DWORD [VRAM],0x000a0000
  63.         


  64. keyboard:
  65.         MOV        ah,0x02
  66.         INT        0x16             ; keyboard BIOS
  67.         MOV        [LEDS],al
  68.         
  69.         ;禁用pic中断
  70.         MOV        al,0xff
  71.         OUT        0x21,al
  72.         NOP                        ;
  73.         OUT        0xa1,al
  74.         CLI                        ; 禁用可屏蔽中断
  75.         
  76.         ;开启A20管脚,也就是开启了1M以上内存
  77.         CALL    waitkbdout
  78.         MOV        AL,0xd1
  79.         OUT        0x64,AL
  80.         CALL    waitkbdout
  81.         MOV        AL,0xdf            ; enable A20
  82.         OUT        0x60,AL
  83.         CALL    waitkbdout
  84.         
  85.         

  86.         lidt    [idt_48 + 512];因为现在ds指向0x9000,我们的加上偏移量512
  87.         LGDT    [GDTR0 + 512]            ;
  88.         MOV        EAX,CR0
  89.         AND        EAX,0x7fffffff    ;禁止分页
  90.         OR        EAX,0x00000001    ; 开启保护模式
  91.         MOV        CR0,EAX
  92.     
  93.         
  94.     
  95. move:;我们把0x10000-0x8ffff中512k的内容转移到地址的0处。
  96.         cli;我们先禁用 中断
  97.         cld;清 方向
  98.         mov ax,2*8
  99.         mov ds,ax
  100.         mov es,ax
  101.         mov esi,0x10000
  102.         mov edi,0x00000
  103.         mov ecx ,0x80000/4
  104.         a32 rep movsd
  105.         
  106.         

  107.         JMP        dword 8:0x0000000;dword必须的,表示段间转移,跳转了cpu才真正变成保护模式
  108.         
  109. waitkbdout:
  110.         IN         AL,0x64
  111.         AND         AL,0x02
  112.         JNZ        waitkbdout        ;
  113.         RET
  114.         
  115.         ALIGNB    16
  116. GDT0:
  117.         RESB    8    
  118.         DW        0x07ff,0x0000,0x9a00,0x0040    ; 可执行        ;
  119.         DW        0xffff,0x0000,0x9200,0x00c0    ; 数据

  120.         DW        0
  121. idt_48:
  122.         dw 0
  123.         DD 0
  124. GDTR0:
  125.         DW        8*3-1
  126.         DD        GDT0+512+0x90000

  127.         ALIGNB    16

  128.         


继续编译bat脚本

点击(此处)折叠或打开

  1. del /Q .bin*.bin
  2. del /Q .bin*.o
  3. nasm -o .\bin\loader.bin bootloader.asm
  4. nasm -o .\bin\setup.o setup.asm
继续linux生成光盘:

点击(此处)折叠或打开

  1. dd if=./loader.bin of=./disk.img bs=512 count=1
  2. dd if=./setup.o    of=./disk.img bs=512 count=1 seek=1
  3. dd if=/dev/zero    of=./disk.img bs=512 count=2878 seek=5

运行之可以看到屏幕鼠标的标志没了,屏幕变大了。


阅读(1401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~