• JOS lab1 part2 分析


    lab1的Exercise 2就是让我们熟悉gdb的si操作,并知道BIOS的几条指令在做什么就够了,所以我们也会尽可能的去分析每一行代码。

    首先进入到6.8282/lab这个目录下,输入指令make qemu-gdb,之后新打开一个terminal,在lab目录下输入gdb。就进入到gdb了

    [f000:fff0]    0xffff0:	ljmp   $0xf000,$0xe05b
    

    这第一条指令呢,是一条跳转指令,跳转到0xfe05b地址处。学过微机原理或者计算机组成就知道0xfe05b=0xf000<<4+0xe05b。简单一点说就是把段寄存器中的值左移4位,形成20位段基址,然后和16位段内偏移相加就得到了真实地址。
    这里要说明一下实模式和保护模式。
    当PC启动的时候,CPU会运行在实模式下,而当进入操作系统内核后,将会运行在保护模式下
    实模式是早期CPU的工作模式,由于它们只有20根地址线,所以它们只能访问1MB的内存空间。但是由于CPU在不断的发展,之后的80286/80386已经具备32位地址总线,能够访问4GB内存空间。保护模式就是为了能够很好的管理这么大的内存空间而被研发出来的。所以现代处理器都是工作在保护模式下的。但是为了实现向后兼容,所以现代的CPU都是在启动时运行于实模式,启动完成后运行于保护模式。
    刚我们运行的BIOS就是PC刚启动时运行的软件,所以它必然工作在实模式。
    保护模式和启动模式的原理可以见这篇文章:
    http://blog.csdn.net/zdwzzu2006/article/details/4030948

    运行si后,继续看下一行代码

    [f000:e05b]    0xfe05b:	cmpl   $0x0,%cs:0x71e8
    

    这一行把0x0这个立即数和$cs:0x6ac8所代表的内存地址处的值比较,不过理由不是很懂。

    [f000:e062]    0xfe062:	jne    0xfd31d
    

    如果ZF为0的时候跳转,即上一条指令cmpl的结果不为0时跳转,或者说是$cs:0x6ac8地址处的值不是0x0时跳转。

    [f000:e066]    0xfe066:	xor    %dx,%dx
    

    将dx清零

    [f000:e068]    0xfe068:	mov    %dx,%ss
    [f000:e06a]    0xfe06a:	mov    $0x7000,%esp
    [f000:e070]    0xfe070:	mov    $0xf36c3,%edx
    [f000:e076]    0xfe076:	jmp    0xfd19d
    

    这几行不是很懂。。

    [f000:d19d]    0xfd19d:	cli    
    

    cli为关闭中断指令。这个关中断指令用于关闭那些可以优先级不是很高的中断。

    [f000:d19e]    0xfd19e:	cld    
    

    设置方向标识位为0
    [f000:d19f] 0xfd19f: mov %eax,%ecx

    [f000:d1a2] 0xfd1a2: mov $0x8f,%eax

    [f000:d1a8] 0xfd1a8: out %al,$0x70

    [f000:d1aa] 0xfd1aa: in $0x71,%al

    [f000:d1ac] 0xfd1ac: in $0x92,%al

    [f000:d1ae] 0xfd1ae: or $0x2,%al

    [f000:d1b0] 0xfd1b0: out %al,$0x92

    [f000:d1b2] 0xfd1b2: mov %ecx,%eax

    [f000:d1b5] 0xfd1b5: lidtw %cs:0x71d8

    [f000:d1bb] 0xfd1bb: lgdtw %cs:0x7194

    [f000:d1c1] 0xfd1c1: mov %cr0,%ecx

    [f000:d1c4] 0xfd1c4: and $0x1fffffff,%ecx

    [f000:d1cb] 0xfd1cb: or $0x1,%ecx

    [f000:d1cf] 0xfd1cf: mov %ecx,%cr0

    [f000:d1d2] 0xfd1d2: ljmpl $0x8,$0xfd1da

  • 相关阅读:
    vika维格表的新 CP ,飞书集成入口上线
    OKR落地四部曲:vika维格表帮你快速养成OKR思维
    ASP.NET, IIS, and Visual Web Developer 技巧与窍门
    VS2008 Tips #008 如何创建ASP.NET Web 用户控件并包含在Web 页面中
    VS2008 Tips #007 如何用 ListView 控件将数据排序
    VS2008 Tips #005 – 如何绑定 ListView 控件
    VS2008 Tip #001 创建、管理和运用样式的强大 CSS 工具
    VS2008 Tips #006 关于“标记导航”的特性
    VS2008 Tips #003 – VS 2008 的拆分视图可以设置为垂直分割
    VS2008 Tips #004 – 您可以通过“浏览方式…”添加浏览器到 Visual Web Developer
  • 原文地址:https://www.cnblogs.com/zhousysu/p/5506995.html
Copyright © 2020-2023  润新知