原课程这里是三段代码,放在一起
// 彭东 @ 2021.01.09
void _strwrite(char *string)
{
char *p_strdst = (char *)(0xb8000);
while (*string)
{
*p_strdst = *string++;
p_strdst += 2;
}
return;
}
void printf(char *fmt, ...)
{
_strwrite(fmt);
return;
}
void main()
{
printf("Hello OS!");
return;
}
比较重要的就是第一段
void _strwrite(char *string)
{
char *p_strdst = (char *)(0xb8000);
while (*string)
{
*p_strdst = *string++;
p_strdst += 2;
}
return;
}
这段C代码的功能是将一个字符串写入到特定的内存地址。这个地址是0xb8000
,它通常在x86架构的计算机中被映射到显存的开始地址,这是因为在这些计算机中,文本模式的视频缓冲区通常开始于此地址。
以下是代码的每一行的解释:
void _strwrite(char *string)
: 这是一个名为_strwrite
的函数,它接受一个字符指针string
作为参数。这个指针通常指向一个C字符串,即一系列字符后面跟随一个空字符'\0'。char *p_strdst = (char *)(0xb8000);
: 这一行创建了一个新的字符指针p_strdst
,并将其设置为地址0xb8000
。这个地址在计算机内存中的位置是硬编码的,通常被映射到显存。while (*string)
: 这是一个while循环,它会持续执行,直到*string
为零。在C中,字符串是以空字符'\0'(其值为0)结尾的,所以这个循环会一直执行,直到遇到字符串的结尾。*p_strdst = *string++;
: 这一行做了几件事。首先,它将*string
的值(即当前字符)复制到*p_strdst
指向的地址。然后,它将string
指针向前移动一位,指向下一个字符。p_strdst += 2;
: 这一行将p_strdst
指针向前移动两位。由于每个字符占用2字节的空间,所以这样做是为了跳过下一个字符的颜色属性字节。
这个函数将一个字符串复制到内存地址0xb8000
的位置,并且每个字符之间有一个额外的字节的空间。这是因为在x86的文本模式显存中,每个字符后面通常跟随一个字节的颜色属性。这里忽略了这些颜色属性,只复制了字符本身。
补充知识
VESA
VESA(Video Electronics Standards Association)是一个制定电子显示标准的国际非营利组织。VESA开发了许多重要的标准,包括DisplayPort、Embedded DisplayPort (eDP)、Flex Video Interface (FVI)、Display Data Channel (DDC)等等。
VESA在个人电脑的早期发展中发挥了重要的作用。例如,它开发了VESA Local Bus (VLB)标准,这是一种提高显卡性能的早期方法。此外,VESA还开发了VESA BIOS Extensions (VBE)标准,这是一种用于改进图形显示性能的接口标准。
VESA Local Bus (VLB):这是一种在早期个人电脑中使用的总线标准。VLB直接连接到处理器的本地总线,能够提供更高的数据传输速率。VLB被广泛用于提高显卡的性能,尤其是在1990年代初的486电脑中。
VESA BIOS Extensions (VBE):这是一种用于改进图形显示的接口标准。VBE提供了一种方法,使操作系统能够更方便地访问更高分辨率和更多颜色的图形模式。VBE定义了一组标准的函数,这些函数可以在实模式或保护模式下通过BIOS调用。
VESA还制定了其他许多标准,包括最新的显示接口标准,如DisplayPort。DisplayPort是一种可以传输视频和音频信号的数字显示接口,与HDMI类似,但设计上更偏向于电脑显示设备,而不是家庭娱乐系统。
显卡的字符模式和图形模式
字符模式(也称为文本模式)是一种只能显示文本的模式。在这种模式下,屏幕被划分为一个由行和列组成的网格,每个单元格可以显示一个字符。每个字符通常有一个前景色和一个背景色。此外,字符模式还支持各种字符属性,如闪烁、加亮等。在字符模式下,显示设备的工作方式是:显卡将字符和它们的属性(如颜色)存储在显存中,然后显示设备会根据显存中的内容来更新屏幕。
在早期的个人电脑中,字符模式是常用的显示模式。例如,IBM的原始PC和许多其他的8086和8088基础的计算机默认启动进入字符模式。这种模式的优点是简单易用,而且需要的显存很少。但是,字符模式的缺点是它不能显示图形,只能显示预定义的字符集。
图形模式,顾名思义,是一种可以显示图形的模式。在图形模式下,屏幕被划分为像素网格,每个像素都可以设置为一个特定的颜色。图形模式允许软件绘制各种形状和图像,从而提供了更为丰富和详细的视觉表现。图形模式需要更多的显存,并且编程也更复杂。
许多VESA标准,如VESA BIOS Extensions (VBE),都是为了使操作系统和软件能更容易地使用图形模式。例如,VBE定义了一组标准的BIOS调用,这些调用可以用来查询显卡的能力,设置图形模式,更改显示设置等。
字符模式和图形模式都是显卡支持的两种基本显示模式,它们分别适用于不同的使用场景。
VGABIOS
VGABIOS是一个开源的项目,它提供了一个实现了VESA BIOS Extensions(VBE)和其他一些功能的VGA BIOS。VGA BIOS是一种用于初始化和控制VGA(Video Graphics Array)显卡的程序,它通常存储在显卡的固件中。
VGA BIOS在计算机启动时运行,用于初始化显卡并设置默认的显示模式。它还提供了一些基本的函数,比如设置显示模式、绘制像素、绘制字符等等。这些函数可以通过INT 10H中断来调用,这是一个由x86架构的CPU提供的软件中断。
VGABIOS特别重要的一点是它实现了VESA BIOS Extensions(VBE)。VBE是一种标准,它定义了一组额外的函数,用于支持更高分辨率和更多颜色的显示模式。VBE的函数也可以通过INT 10H中断来调用。




