暑假学习小日本的那本书: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
下面是第四天的成果: