linux-0.11调试教程,con_init函数和右上角的EGAc

linux-0.11调试教程,con_init函数和右上角的EGAc_第1张图片


linux-0.11调试教程,con_init函数和右上角的EGAc_第2张图片

最后4个字母是EGAc对应8个字节0x07470745      0x07630741



因为是EGAc,所以0xb8000是显存的起始地址,而这时origin 也设置为video_mem_start0xb8000

所以可以在0xb8030既第24个字母处(每个字母用2个字节表示),设置badc。







#define ORIG_VIDEO_MODE        ((*(unsigned short *)0x90006) & 0xff)

所以,ORIG_VIDEO_MODE 为03不等于7,所以 运行   else                                /* If not, it is color. */

之后的语句

又因为#define ORIG_VIDEO_EGA_BX    (*(unsigned short *)0x9000a)

所以ORIG_VIDEO_EGA_BX 为0x0003,不等于0x10,所以会运行下面的语句。

        if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10)
        {
            video_type = VIDEO_TYPE_EGAC;
            video_mem_end = 0xbc000;
            display_desc = "EGAc";
        }



相关代码:

void con_init(void)
{
    register unsigned char a;
    char *display_desc = "????";
    char *display_ptr;

    video_num_columns = ORIG_VIDEO_COLS;
    video_size_row = video_num_columns * 2;
    video_num_lines = ORIG_VIDEO_LINES;
    video_page = ORIG_VIDEO_PAGE;
    video_erase_char = 0x0720;
    
    if (ORIG_VIDEO_MODE == 7)            /* Is this a monochrome display? */
    {
        video_mem_start = 0xb0000;
        video_port_reg = 0x3b4;
        video_port_val = 0x3b5;
        if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10)
        {
            video_type = VIDEO_TYPE_EGAM;
            video_mem_end = 0xb8000;
            display_desc = "EGAm";
        }
        else
        {
            video_type = VIDEO_TYPE_MDA;
            video_mem_end    = 0xb2000;
            display_desc = "*MDA";
        }
    }
    else                                /* If not, it is color. */
    {
        video_mem_start = 0xb8000;
        video_port_reg    = 0x3d4;
        video_port_val    = 0x3d5;
        if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10)
        {
            video_type = VIDEO_TYPE_EGAC;
            video_mem_end = 0xbc000;
            display_desc = "EGAc";
        }
        else
        {
            video_type = VIDEO_TYPE_CGA;
            video_mem_end = 0xba000;
            display_desc = "*CGA";
        }
    }

    /* Let the user known what kind of display driver we are using */
    
    display_ptr = ((char *)video_mem_start) + video_size_row - 8;
    while (*display_desc)
    {
        *display_ptr++ = *display_desc++;
        display_ptr++;
    }
    
    /* Initialize the variables used for scrolling (mostly EGA/VGA)    */
    
    origin    = video_mem_start;
    scr_end    = video_mem_start + video_num_lines * video_size_row;
    top    = 0;
    bottom    = video_num_lines;

    gotoxy(ORIG_X,ORIG_Y);
    set_trap_gate(0x21,&keyboard_interrupt);
    outb_p(inb_p(0x21)&0xfd,0x21);
    a=inb_p(0x61);
    outb_p(a|0x80,0x61);
    outb(a,0x61);
}



你可能感兴趣的:(linux-0.11调试教程,con_init函数和右上角的EGAc)