从零制作操作系统-第五部分(简单显示与连接器)

文章目录

  • VGA(Video Graphics Array)
    • VGA文本模式
  • ld链接器
  • makefile语法
    • 一般形式
    • 语法
    • 源码

VGA(Video Graphics Array)

VGA(Video Graphics Array)是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用

VGA文本模式

VGA 文本模式(VGA text mode)是打印字符到屏幕的一种简单方式

为了在 VGA 字符模式中向屏幕打印字符,我们必须将它写入硬件提供的 VGA 文本缓冲区(VGA text buffer)。通常状况下,VGA 文本缓冲区是一个二维数组,它的内容将被实时渲染到屏幕。这个数组的元素被称作字单元(character cell),它使用下面的格式描述一个屏幕上的字符:
从零制作操作系统-第五部分(简单显示与连接器)_第1张图片

从零制作操作系统-第五部分(简单显示与连接器)_第2张图片

文本缓冲区最小单元:一个字(两个字节)

文本缓存区起始地址:0xB8000 (物理地址)

缓冲区大小:2x高度x宽度 以字符为单位

ld链接器

ld(Linker)是一个负责将目标文件和库文件链接成可执行文件或共享库的程序。在编译过程中,编译器将源代码编译成目标文件,然后ld将这些目标文件链接成可执行文件或共享库。

或者说

链接过程是将各式各样的.o文件链接为一个文件的过程。链接脚本描述连接器如何将这些输入文件(.o)文件映射为一个输出文件的,并且规定描述了输出文件的内存布局。几乎所有的链接脚本都是在做这些事情。

makefile语法

一般形式

语法

=相当于只要用到该变量,那么随着该变量的变化,用到该变量的变量也会变化。

HELLO = world
HELLO_WORLD = $(HELLO) world!

# This echoes "world world!"
echo $(HELLO_WORLD)

HELLO = hello

# This echoes "hello world!"
echo $(HELLO_WORLD)

:=相当于用到它的变量使用时所对应的变量的值在定义时才会改变

HELLO = world
HELLO_WORLD := $(HELLO) world!

# This echoes "world world!"
echo $(HELLO_WORLD)

HELLO = hello

# Still echoes "world world!"
echo $(HELLO_WORLD)

HELLO_WORLD := $(HELLO) world!

# This echoes "hello world!"
echo $(HELLO_WORLD)

?=作用是当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值

CURDIR是Makefile的内嵌变量,自动设置为当前目录

在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。

mkinc自定义的名字

我们会在 Makefile 中调用另外的 Makefile 文件,呈现出 Makefile 的层级结构。

上层 make 过程要将所执行的 Makefile 中的变量传递给子 make 过程,需要明确地指出。

在 GNU make 中,实现此功能的指示符是 export。当一个变量使用 export 进行声明后,变量和它的值将被加入到当前工作的环境变量中,以后在 make 执行的所有规则的命令都可以使用这个变量。

预定义变量CC:i686-elf-gcc
预定义变量LD:ld
预定义变量AR:i686-elf-ar

在一个规则中,如果存在多个target,那么make将为每个target独立运行规则中的命令。$@是个自动变量,其内容为每次命令独立运过程中的target名称。

分号是分隔符,反斜线是换行符。像if语句块或for语句要写在一行时,必须使用分号进行分隔,在此期间如需进行换行则使用反斜线\进行换行即可。此外,注意if语句后的左中括号[前后都有有空格,双等号“==”表示相等符号,单等号“=”既可以表示相等也可表示赋值,其区别为:当比较时,比较符号左右都有空格;赋值时,等号左右没空格

源码

你可能感兴趣的:(从零自制操作系统,学习,linux)