30天自制操作系统第四天学习笔记

Posted on 2013-08-01 18:49  冰天雪域  阅读(250)  评论(0编辑  收藏  举报

 

暑假学习小日本的那本书: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\n\t"
     "rep\n\t"
     "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



下面是第四天的成果:





 

Copyright © 2024 冰天雪域
Powered by .NET 8.0 on Kubernetes