08.C语言绘制系统界面

本文介绍了如何使用C语言在保护模式下实现图形显示,包括设置栈空间、编译C代码为汇编、修改汇编文件、创建内核加载器,并通过BIOS调用设置显示器为图形模式。
摘要由CSDN通过智能技术生成

简介

上一节我们实现了从实模式到保护模式下字符复制到1M内存空间外的显示。直观感受从实模式到保护模式地址寻址的变化。

目标

显示器基本都有字符模式和图形显示模式,用C语言实现色彩斑斓的图形显示。引入C语言开发操作系统需要对C语言函数参数传递机制有基本认识。

1、为了能使用C语言,我们需要设置栈空间。C语言函数体中的变量就是使用栈管理的,默认情况下C语言编译后生成的代码是能在该操作系统下运行的可执行文件,在链接中链接器会插入相关的描述信息。但我们要开发的是系统内核,如果将内核编译成可执行的文件,那么就不能直接将内核加载到内存直接执行。所以需要想新的办法。

2、用反汇编结合C语言和汇编语言
gcc 编译器给我们提供了相关的编译选项,我们把C语言编译成2进制文件后使用反汇编器得到nasm 汇编器能编译的汇编文件。

用以下命令编译C代码模块,以便后面反汇编:
gcc -m32 -c -fno-asynchronous-unwind-tables os.c -o os.o

-m32:编译的指令是32位指令集
-c:编译出2进制机器指令

反汇编工具objconv安装 https://github.com/vertis/objconv.git
下载后进入objconv目录,编译该工具,运行下面的命令:
g++ -o objconv -O2 src/*cpp , -O2中的圆圈是大写字母O

用objconv 反汇编C语言生成的目标文件os.o,命令如下:
objconv -fnasm os.o -o os.s,目录下便有一个反汇编文件os.s

修改os.s 汇编文件,删除多余的 SECTION 等不合适的汇编伪指令
在kernel.s 汇编文件中使用 %include "os.s" 导入os.s汇编文件

至此,我们便可使用nasm 正常编译该文件生成2进制内核文件

3.kernel.s 文件内容如下:

;全局描述符结构 8字节
    ; byte7 byte6 byte5 byte4 byte3 byte2 byte1 byte0
    ; byte6低四位和 byte1 byte0 表示段偏移上限
    ; byte7 byte4 byte3 byte2 表示段基址
    


    ;定义全局描述符数据结构
    ;3 表示有3个参数分别用 %1、%2、%3引用参数
    ;%1:段基址     %2:段偏移上限  %3:段属性
    %macro GDescriptor  3
        dw %2 & 0xffff
        dw %1 & 0xffff
        db (%1>>16) & 0xff 
        dw ((%2>>8) & 0x0f00) | (%3 & 0xf0ff)
        db (%1>>24) & 0xff 
    %endmacro


    DA_32       EQU 0x4000   ; 32 位段
    DA_CODE     EQU 0x98     ; 只执行代码段属性值
    DA_RW       EQU 0x92     ; 可读写数据段属性值


   
   
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值