zoukankan      html  css  js  c++  java
  • 30天自制操作系统第四天学习笔记

    暑假学习小日本的那本书:30天自制操作系统

    qq交流群:122358078    ,更多学习中的问题、资料,群里分享

    environment:开发环境:ubuntu

    第四天的学习笔记:

    要有一个态度,有一个好的心态,问题越多,学到的越多。坚持下去就行了。

    halt的机器码为0xf4

    用gcc内嵌gas汇编的方法非常好,也非常的高效。

    只需要用一个宏定义就行了,如要在c中调用汇编的hlt指令,只需要
    #define io_halt() asm("hlt")

    这样就可以把io_halt()当一个正常的函数用了,但是这是最容易的,有输入,输出参数的函数的调用规则要复杂一些。但是只是一个规则。
    还有我们的bootmain,函数现在还不知道是否在运行。没有复制到1MB以后的地址,不知道会不会有问题。

    在32位的模式下,已经可以把dram当内存一样操作了。我们来试试。

    指针的出现,使我们可以方便用指针向memory maped的地址空间写入数据,这在开始os的过程中是非常重要的。



    包汇编包含在c中,而且汇编和c中还有参数的传递。如何进行的。

    asm ( "statements" : output_registers : input_registers : clobbered_registers);
    上面是基本的格式:

    下面是例子:

    asm ("cld "
         "rep "
         "stosl"
         : /* no output registers */
         : "c" (count), "a" (fill_value), "D" (dest)
         : "%ecx", "%edi" );

    上面的指令只有,cld ,rep,stosl,但是如何对输入,输出参数进行传递的呢??
    上面无返回值,有三个传入参数,使用到的其它的寄存器。

    cld: clear direction bit of the flags registers ,你不知道在这个寄存器会有什么,
    rep:


    ecx=count
    eax=fill_value
    edi=dest


    a        eax
    b        ebx
    c        ecx
    d        edx
    S        esi
    D        edi
    I        constant value (0 to 31)
    q,r      dynamically allocated register (see below)
    g        eax, ebx, ecx, edx or variable in memory
    A        eax and edx combined into a 64-bit integer (use long longs)




    outb函数是往指定的设备,送数据。
    cpu的管脚与内存相连是为了取指令,取数据,完成计算和存储的功能,数据就是信息,信息就需要存储。

    但是cpu还要对键盘进行响应,要通过网卡得到信息,通过声卡发送音乐。向软盘写数据,之前我们用的软盘控制程序是调用int 0x13来读软盘的。

    这些i/o 设备我们称为device,他们也是连在cpu上,通过他们自己的controller.

    out指令是向设备发送信息
    in指令是读取设备的信息。

    设备有设备号,每个设备都有内上port,通过out指令就能 控制 这些设备,通过in指令 可以知道这些设备的状态

    out指令执行时 ,数据从cpu内部产生,然后告别cpu,到了显卡中。
    c中没有的部分,用内嵌的方法实现。c中没有in out,指令,所以在c中内嵌汇编就搞定了。

    可以看出汇编在操作具体硬件上面是非常强大的。

    设备号:
    0x03c8
    0x03c9



    对cpsr的操作,只能用汇编完成。

    320x200=64000
    第一个点是左上角,坐标为0,0
    最后一个点是右下角,坐标为319,199,
    每个点的具体在vram中的地址为
    点的坐标,起点x=0,y=0, 终点x=0,y=199,就画了一条线。
    0xa0000+x+y*320

    for y=0,x=0;x<320;x++
    {
     *(0xa0000+x+y*320)=color
    }

    运行方法:
    在ubuntu下
    sudo -s

    make
    make copy
    make run



    下面是第四天的成果:





  • 相关阅读:
    Java--8--新特性--Lambda
    java--Annotation实现
    原生Ajax代码实现
    java--动态代理设计模式,CGLIB实现的动态代理设计模式
    java--分析简单java类与反射的联系
    java--反射的基本概念
    Oracle-4
    初始化springbean
    spring初始化bean对象的三种方式:init-method,afterPropertiesSet和BeanPostProcessor
    在注释中查看其它的类的方式
  • 原文地址:https://www.cnblogs.com/aukle/p/3230729.html
Copyright © 2011-2022 走看看