分页这一次又做了一次变换,似乎是成功了。

图下面的代码,那个sprintf是剽别人的各位还是自己从网上下载吧

kernel.c

#include "sprintf.h"

void myhlt(void);
void setup_page(void);
void change_page(void);
void change0(void);
void fillbox(int color, int x0, int y0, int x1, int y1);
void myfillbox(int color, int x0, int y0, int x1, int y1);
void makefont16 (int color, int x, int y, short *font);
void print_gb2312(int color, int x, int y, unsigned char *str);
void copy_str(char *str, char *mystr);

int mymain(int eax, int ebx) {

    int *myfb = (int *)0xe0000000;
    fillbox(0x001e90ff, 0, 0, 799, 599);
    myfillbox(0x00000000, 0, 0, 799, 599);
    unsigned char valuebuf[64];
    
    unsigned char *str = "系统的名字叫做什么呢,暂定为SnailOS吧,真的佩服自己的速度,像蜗牛爬树!";
    print_gb2312(0xffffffff, 80 , 0, str);
    str = "我的系统开始可以打印中文了,不过还不能换行,屏幕也是越界的,好在还是正确的显示了!";
    print_gb2312(0xffffffff, 80, 80, str);
    
    str = "蜗牛(Snial)";
    print_gb2312(0xffffffff, 80 , 96, str);
    str = "该不该搁下重重的壳";
    print_gb2312(0xffffffff, 80 , 112, str);
    str = "寻找到底哪里有蓝天";
    print_gb2312(0xffffffff, 80 , 128, str);
    str = "随着轻轻的风轻轻的飘";
    print_gb2312(0xffffffff, 80 , 144, str);
    str = "历经的伤都不感觉疼";
    print_gb2312(0xffffffff, 80 , 160, str);
    str = "我要一步一步往上爬";
    print_gb2312(0xffffffff, 80 , 176, str);
    str = "等待阳光静静看着它的脸";
    print_gb2312(0xffffffff, 80 , 192, str);
    str = "小小的天有大大的梦想";
    print_gb2312(0xffffffff, 80 , 208, str);
    str = "重重的壳裹着轻轻的仰望";
    print_gb2312(0xffffffff, 80 , 224, str);
    str = "我要一步一步往上爬";
    print_gb2312(0xffffffff, 80 , 240, str);
    str = "在最高点乘着叶片往前飞";
    print_gb2312(0xffffffff, 80 , 256, str);
    str = "让风吹干流过的泪和汗";
    print_gb2312(0xffffffff, 80 , 272, str);
    str = "总有一天我有属于我的天";
    print_gb2312(0xffffffff, 80 , 288, str);

    str = "Hd#蜗牛先生#¥%……来&)(*_*)})。感谢Internet,感谢CSDN,感谢苍老师^_^^_^";
    print_gb2312(0xffffffff, 80 , 336, str);
    sprintf (valuebuf, "eax 等于 0x%x", eax);
    print_gb2312(0x00ff8c00, 80, 384, valuebuf);
    sprintf (valuebuf, "ebx 等于 0x%x", ebx);
    print_gb2312(0x00ffffff , 80, 368, valuebuf);
    
    char * addr0 = (char *) 0x7c00;

    char *mystr = "在进行分页实验!";
    copy_str(addr0, mystr);
    
    fillbox(0x001e90ff, 0, 0, 799, 599);
    myfillbox(0x00000000, 0, 0, 799, 599);
    str = "又做了一些改动,把第一页映射到第七页,借用小米的一句话,\"永远相信美好的事情即将发生\"";
    print_gb2312(0xffffffff, 0, 0, str);
    print_gb2312(0xffffffff, 80, 80, addr0);
    setup_page();
    print_gb2312(0x00ff8c00, 80, 96, addr0);
    mystr = "上面弄错了,是把第0页的映射到7页,这次决定把7页映射到0页";
    copy_str((char *)0x0, mystr);
    change_page();
    print_gb2312(0x00ff0000, 80, 112, (char *)0xc00);
    char *addr1 = (char *)0xc00;
    *addr1 = 0xce;
    *(addr1 + 1) = 0xd2;
    print_gb2312(0x0000ff00, 80, 128, addr1);
    print_gb2312(0xffffffff, 80, 144, addr1);

    print_gb2312(0xffffffff, 80, 160, (char *)0x7000);
    mystr = "地址变换后改变地址0处的内容,向0x7000写入本段字符,则是向地址0处写入";
    copy_str((char *)0x7000, mystr);
    change0();
    print_gb2312(0xffffffff, 80, 176, (char *)0);
    mystr = "再进行一次地址变换则向0x7000写入和向0处写入是一样的";
    copy_str((char *)0x7000, mystr);
    print_gb2312(0xffffffff, 80, 192, (char *)0);    
    
    
    while(1) {
        myhlt();
    }
}

void myprintf(char * str) {
    return;
}

void fillbox(int color, int x0, int y0, int x1, int y1) {
    int *myfb = (int *)0xe0000000;
    int xsize = 800;
    int x, y;
    for (y = 0; y <= y1 - y0; y++) {
        for (x = 0; x <= x1 - x0; x++) {
            myfb[x0 + x + (y0 + y) * xsize] = color;
        }
    }
}


void myfillbox(int color, int x0, int y0, int x1, int y1) {
    int *myfb = (int *)0xe0000000;
    int xsize = 800;
    int x, y;
    if (x0 < 80 || y0 < 80 || x1 > 719 || y1 > 519) {
        x0 = 80;
        y0 = 80;
        x1 = 719;
        y1 = 519;
    }
    for (y = 0; y <= y1 - y0; y++) {
        for (x = 0; x <= x1 - x0; x++) {
            myfb[x0 + x + (y0 + y) * xsize] = color;
        }
    }
}

void print_ascii (int color, int x, int y, char *font) {
    int *myfb = (int *)0xe0000000;
    int xsize = 800;
    char d;
    int *p;
    int i;
    for (i = 0; i < 16; i++){
        p = myfb + (y + i) * xsize + x;
        d = font[i];
        if ((d & 0x80) != 0) {p[0] = color;}
        if ((d & 0x40) != 0) {p[1] = color;}
        if ((d & 0x20) != 0) {p[2] = color;}
        if ((d & 0x10) != 0) {p[3] = color;}
        if ((d & 0x08) != 0) {p[4] = color;}
        if ((d & 0x04) != 0) {p[5] = color;}
        if ((d & 0x02) != 0) {p[6] = color;}
        if ((d & 0x01) != 0) {p[7] = color;}
    }
    return;
}

void makefont16 (int color, int x, int y, short *font) {
    int *myfb = (int *)0xe0000000;
    int xsize = 800;
    short d;
    int *p;
    int i;
    for (i = 0; i < 16; i++){
        p = myfb + (y + i) * xsize + x;
        d = font[i];
        if ((d & 0x80) != 0) {p[0] = color;}
        if ((d & 0x40) != 0) {p[1] = color;}
        if ((d & 0x20) != 0) {p[2] = color;}
        if ((d & 0x10) != 0) {p[3] = color;}
        if ((d & 0x08) != 0) {p[4] = color;}
        if ((d & 0x04) != 0) {p[5] = color;}
        if ((d & 0x02) != 0) {p[6] = color;}
        if ((d & 0x01) != 0) {p[7] = color;}
        if ((d & 0x8000) != 0) {p[8] = color;}
        if ((d & 0x4000) != 0) {p[9] = color;}
        if ((d & 0x2000) != 0) {p[10] = color;}
        if ((d & 0x1000) != 0) {p[11] = color;}
        if ((d & 0x800) != 0) {p[12] = color;}
        if ((d & 0x400) != 0) {p[13] = color;}
        if ((d & 0x200) != 0) {p[14] = color;}
        if ((d & 0x100) != 0) {p[15] = color;}
    }
    return;
}

void print_gb2312(int color, int x, int y, unsigned char *str) {
    extern short font[0x8000];
    extern char myfont[0x1000];
    int i = 0, j = 0;
    unsigned char a, b;
    unsigned int offset;
    while (str[i] != 0) {
        if (str[i] < 0x80) {
            a = str[i];
            print_ascii (color, x + j, y, myfont + a * 16);
            if (str[i + 1] == 0)
                break;
            i++;
            j += 8;
        } else {    
            a = str[i] - 0xa0;
            b = str[i + 1] - 0xa0;
            offset = ((a - 1) * 94 + (b - 1)) * 16;
            makefont16 (color, x + j , y, font + offset);
            i += 2;
            j += 16;
        }
    }
    return;
}

void copy_str(char *str, char *mystr) {
    int i = 0;
    for (; i <= strnlen(mystr, 0); i++)
        *(str + i) = *(mystr + i); 
    return;
}

boot.s

MULTIBOOT2_HEADER_MAGIC = 0xe85250d6
GRUB_MULTIBOOT_ARCHITECTURE_I386 = 0x0
MULTIBOOT_HEADER_TAG_ADDRESS = 0x2
MULTIBOOT_HEADER_TAG_OPTIONAL = 0x1
MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS = 0x3
MULTIBOOT_HEADER_TAG_END = 0x0
MULTIBOOT_HEADER_TAG_FRAMEBUFFER = 0x5

.globl _start, _myhlt, _setup_page, _change_page, _change0
.extern _mymain, _myprintf

_start:
    jmp multiboot_entry
.align 8

multiboot_header:
    .int MULTIBOOT2_HEADER_MAGIC
    .int GRUB_MULTIBOOT_ARCHITECTURE_I386
    .int multiboot_header_end - multiboot_header
    .int -(MULTIBOOT2_HEADER_MAGIC + GRUB_MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))

.align 8
    
address_tag_start:
    .short MULTIBOOT_HEADER_TAG_ADDRESS
    .short MULTIBOOT_HEADER_TAG_OPTIONAL
    .int address_tag_end - address_tag_start
    .int multiboot_header
    .int _start
    .int 0x0
    .int 0x0
address_tag_end:

.align 8

entry_address_tag_start:
    .short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS
    .short MULTIBOOT_HEADER_TAG_OPTIONAL
    .int entry_address_tag_end - entry_address_tag_start
    .int multiboot_entry
entry_address_tag_end:

.align 8

framebuffer_tag_start:
    .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
    .short MULTIBOOT_HEADER_TAG_OPTIONAL
    .int framebuffer_tag_end - framebuffer_tag_start
    .int 800
    .int 600
    .int 32
framebuffer_tag_end:

.align 8

undefined_tag:
    .short MULTIBOOT_HEADER_TAG_END
    .short 0
    .int 8
    
multiboot_header_end:
.align 8
multiboot_entry:

    movl $stack, %esp
    pushl $0
    popf
    
    
    pushl %ebx
    pushl %eax
    
    call _mymain
    
    pushl $str
    call _myprintf
    
1:
    hlt
    jmp 1b

str:
    .string "idealOS is halt!\n"

.align 0x1000    
.fill 0xf000, 1, 0
stack:

_gdtr:
    .short 3 * 8 - 1
    .int _gdt
    
.align 8
_gdt:
    .quad 0x0000000000000000
    .quad 0x00c092000000ffff
    .quad 0x00c09a000000ffff
    
_myhlt:
    cli
    hlt
    ret

_load_gdtr: # void load_gdtr (int limit, int addr);
    mov 4(%esp), %ax
    mov %ax, 6(%esp)
    lgdt 6(%esp)
    
    mov $0x08, %eax
    mov %eax, %ds
    mov %eax, %es
    mov %eax, %fs
    mov %eax, %gs

    jmpl $0x10, $mystart
mystart:
    ret
    
_load_idtr: # void load_idtr (int limit, int addr);
    mov 4(%esp), %ax
    mov %ax, 6(%esp)
    lidt 6(%esp)
    ret

.align 8
_setup_page:
    
    movl $0x400, %ecx
    movl $0x1000007, %eax
    movl $0xfff000, %edi
    cld
1:
    stosl
    addl $0x1000, %eax
    loop 1b

    
    movl $0x100000, %ecx
    movl $0x7, %eax
    movl $0x1000000, %edi
    
1:
    stosl
    addl $0x1000, %eax
    loop 1b

    movl $0xfff000, %eax
    movl %eax, %cr3
    
    movl %cr0, %eax
    orl $0x80000000, %eax
    movl %eax, %cr0
    ret
    
_change_page:
    mov $0x7007, %eax
    mov $0x1000000, %edi
    stosl
    
    mov $0x0007, %eax
    mov $(0x1000000 + 7 * 4), %edi
    stosl
    
    movl $0xfff000, %eax
    movl %eax, %cr3
    ret
    
_change0:
    mov $0x0007, %eax
    mov $0x1000000, %edi
    stosl
    
    movl $0xfff000, %eax
    movl %eax, %cr3
    ret

猜你喜欢

转载自blog.csdn.net/weixin_39410618/article/details/82734380