从零开始搭建环境编写操作系统 AT&T GCC (四)绘制界面

  昨天写了一晚上的文章说没就没了???!!!一夜回到解放前啊,csdn不应该做出点补偿么……从头再来,也没有什么关系嘛。
  今天的主要内容是整理文件,改正之前的几个错误点,简单讲一下VGA,然后写几个绘制界面的函数。
一、整理文件
  在system.s文件夹创建一个functions.s的文件,这个文件用于补充c语言不能编写的内容,比如底层硬件的in和out操作,关闭中断cli操作,暂停hlt操作。system和loader两个文件夹下的makefile我都进行了修改,使得系统可以进入gdb和monitor调试模式,便于发现系统的问题,首先将makefile贴上来。
  loader makefile

run : loader.bin
    dd if=$(BIN_DIR)/loader.bin of=$(BIN_DIR)/loader.img bs=512 count=1
    dd if=$(BIN_DIR)/system.bin of=$(BIN_DIR)/system.img bs=1474048 count=1 conv=sync
    dd if=$(BIN_DIR)/system.img of=$(BIN_DIR)/loader.img bs=512 seek=1 
#   qemu-system-i386 -fda $(BIN_DIR)/loader.img -boot a -gdb tcp::1234 -S -monitor stdio 
    qemu-system-i386 -fda $(BIN_DIR)/loader.img -boot a -gdb tcp::1234 -monitor stdio 

loader.bin : loader.o Makefile loader.lds
    ld -M --oformat binary -m elf_i386 -o $(BIN_DIR)/loader.bin $(OBJ_DIR)/loader.o -T loader.lds 

loader.o : loader.s Makefile
    as --32 loader.s -o $(OBJ_DIR)/loader.o 

  qemu-system-i386 -fda $(BIN_DIR)/loader.img -boot a -gdb tcp::1234 -monitor stdio ,这一行改动最大,-gdb tcp::1234是启动远程gdb调试,具体使用方法等单独拿出一节来讲,-monitor stdio是使用标准输入输出进行monitor调试,这个调试功能没有gdb功能丰富,但是可以观察所有registers寄存器的状态,还是必须要用的。
  system makefile

system.bin : system.o Makefile system.lds main.o functions.o
    ld -M -m elf_i386 -o $(BIN_DIR)/system.elf \
    $(OBJ_DIR)/system.o $(OBJ_DIR)/functions.o $(OBJ_DIR)/main.o \
    -T system.lds

    objcopy -O binary $(BIN_DIR)/system.elf $(BIN_DIR)/system.bin 

system.o : system.s Makefile
    as --32 system.s -o $(OBJ_DIR)/system.o

main.o : main.c Makefile
    gcc -c main.c -o $(OBJ_DIR)/main.o -m32

functions.o : functions.s Makefile
    as --32 functions.s -o $(OBJ_DIR)/functions.o

  这个makefile的主要改动就是增加了functions.s的编译
  
二、改正错误
  1、如果继续我之前的环境编写下去,就会发现c语言中全局变量和静态变量无法使用,昨天用了大半天的时间查找这个问题,在这里记录一下变量的存储方式。
  全局变量和静态变量是存储在.data段和.bss段内的,已经初始化的变量放在.data段内,未初始化的变量放在.bss段内。局部变量使用栈的方式存储。所以无法使用静态变量一定是向.data段的寻址出现了问题,寻址问题一般出现在段的划分上,恍然大悟,之前把ds的基址直接放在了0xa0000的位置上,寻址的时候自然也是以这个位置作为首地值,这个问题还没有想出一个好的解决方法,暂时把ds的基址定为0,把段限定为4G,就是数据段的地址与内存物理地址一一对应,lds文件要这么写:
  

SECTIONS
{
    . = 0x8200;
    .text :
    {
        *(.text)
    }
    .data : { *(.data) }
    .bss : { *(.bss) }
}

  2、当程序越写越大,就会发现出现各种奇怪的错误,后来一条条指令debug终于发现了第二个弱智错误,我把GDT表放在了0x8400处,程序从0x8200处开始运行,只有0x200,512字节的空间可以放下我们的程序,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值