博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个操作系统的实现-笔记-开启时钟中断
阅读量:5780 次
发布时间:2019-06-18

本文共 2444 字,大约阅读时间需要 8 分钟。

hot3.png

##版本0.2 设置IDT,开启时钟中断

代码如下

kernel.asm

; nasm -f elf kernel.asm -o kernel.o; ld -s -Ttext 0x10000 kernel.o -o kernel.bin        ; dd if=kernel.bin of=a.img bs=512 seek=1 conv=notrunc[section .text][bits 32]global _start_start:    mov ax, 16    mov ds, ax    mov es, ax    mov ss, ax    mov esp, 0x7c00    mov ax, 24    mov gs, ax    lidt [idtptr]    call print    call init8259a    stiend:    jmp endprint:    mov edi, (80 * 11 + 79) * 2    mov ah, 0x0c    mov al, 'K'    mov [gs:edi], ax    ret_clock:clock equ _clock - $$ + 0x10000           ; 0x10000就是ld中的入口地址    inc byte [gs:((80 * 11 + 79) * 2)]    mov edi, (80 * 11 + 78) * 2    mov ah, 0x0c    mov al, 'I'    mov [gs:edi], ax    mov al, 0x20    out 0x20, al    iretdinit8259a:    mov al, 0x11    out 0x20, al    call io_delay    out 0xa0, al    call io_delay    mov al, 0x20    out 0x21, al    call io_delay    mov al, 0x28    out 0xa1, al    call io_delay    mov al, 0x04    out 0x21, al    call io_delay    mov al, 0x02    out 0xa1, al    call io_delay    mov al, 0x01    out 0x21, al    call io_delay    out 0xa1, al    call io_delay    mov al, 11111110b ;    out 0x21, al    call io_delay    mov al, 11111111b    out 0xa1, al    call io_delay    retio_delay:    nop    nop    nop    nop    retidt:%rep 255    dw (clock & 0xffff)    dw 8    dw 0x8e00    dw (clock >> 16)%endrepidtlen equ $-idtidtptr dw idtlen-1       dd idt

通过readelf -a kernel.bin, 可以知道.text的大小是0x8ac,4个多扇区,所以直接读入内存5个扇区。

bootsect.asm

; nasm bootsect.asm -o bootsect.bin; dd if=bootsect.bin of=a.img bs=512 count=1 conv=notruncorg 0x7c00jmp startgdt:    dw 0    dw 0    dw 0    dw 0gdt_code:       ; 基址为0,大小4GB的32位可执行代码段    dw 0xffff    dw 0x0000    dw 0x9a00    dw 0x00cfgdt_data:       ; 基址为0,大小4GB的32位可读写数据段    dw 0xffff    dw 0x0000    dw 0x9200    dw 0x00cfgdt_video:      ; 基址为0xb8000,大小64KB的可读写显存段    dw 0xffff    dw 0x8000    dw 0x920b    dw 0x0000gdtlen equ $ - gdtgdtptr dw gdtlen -1       dd gdtstart:; 利用0x13号BIOS中断,将软盘kernel.bin中的.text读入内存0x1000:0x0000(实模式)。    mov ax, 0x1000    mov es, ax    mov bx, 0    mov ax, 0x0205  ; 读入5个扇区    mov cx, 0x000a    mov dx, 0    int 0x13into_kernel:    ; 加载GDT    lgdt [gdtptr]    ; 关中断    cli    ; 开启A20线    in al, 0x92    or al, 00000010b    out 0x92, al    ; 打开保护模式    mov eax, cr0    or eax, 1    mov cr0, eax    ; 进入保护模式    jmp dword 0x8:0x10000 ; 0x8, 可执行代码段gdt_codefill:   times 510-($ - $$) db 0   dw 0xaa55

转载于:https://my.oschina.net/wangconglin87/blog/549402

你可能感兴趣的文章
消费贷用户70%月收入低于5000元 80、90后是主要人群
查看>>
2018年内蒙古外贸首次突破1000亿元
查看>>
CTOR有助于BCH石墨烯技术更上一层楼
查看>>
被遗忘的CSS
查看>>
Webpack中的sourcemap以及如何在生产和开发环境中合理的设置sourcemap的类型
查看>>
做完小程序项目、老板给我加了6k薪资~
查看>>
java工程师linux命令,这篇文章就够了
查看>>
关于React生命周期的学习
查看>>
webpack雪碧图生成
查看>>
搭建智能合约开发环境Remix IDE及使用
查看>>
Spring Cloud构建微服务架构—服务消费基础
查看>>
RAC实践采坑指北
查看>>
runtime运行时 isa指针 SEL方法选择器 IMP函数指针 Method方法 runtime消息机制 runtime的使用...
查看>>
LeetCode36.有效的数独 JavaScript
查看>>
Scrapy基本用法
查看>>
PAT A1030 动态规划
查看>>
自制一个 elasticsearch-spring-boot-starter
查看>>
软件开发学习的5大技巧,你知道吗?
查看>>
java入门第二季--封装--什么是java中的封装
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>