小编Ste*_*eve的帖子

如何在不使用BIOS的情况下将数据写入显卡?

我想制作一个(非常简单的)操作系统.我目前正在学习显卡.

这是我目前所知的(如果我错了,请纠正我):

  • 显卡有两种模式:文本模式和图形模式.
  • 您可以使用BIOS将数据写入图形卡(而不是直接访问图形卡).

我想要做的是直接写入显卡的视频内存而不使用BIOS(因为我想了解事情是如何工作的).所以我有以下问题:

  1. 我如何知道显卡视频内存的基地址是什么,这是通过探测PCI总线获取基地址,还是固定基址来完成的(就像COM端口基地址固定一样) )?
  2. 是否以相同方式访问所有图形卡,或者是否必须为所有可用图形卡创建设备驱动程序?

编辑:我正在使用x86.

c hardware x86 assembly operating-system

13
推荐指数
1
解决办法
1911
查看次数

使用端口映射I/O时是否使用虚拟内存?

如果我有一个内存映射的I/O设备,并且我想写入位于0x16D340x16D34地址的该设备的寄存器,该地址实际上是一个虚拟地址,CPU将首先将其转换为物理地址,然后写入数据到物理地址.

但对于端口映射I/O设备(例如:串行端口),所以如果我想要写一个寄存器位于地址串口0x3F8,是0x3F8地址的物理地址或虚拟地址?


编辑:我在x86架构上.

c linux x86 device-driver virtual-memory

6
推荐指数
1
解决办法
620
查看次数

为什么名称修改与WinMain()函数一起使用?

根据我的理解,当存在函数重载时使用名称修改,以便可以区分具有相同名称的函数.

但我注意到名称修改也与WinMain()函数一起使用(没有重载).名称变形之后就变成了_WinMain@16.

那么为什么名称修改与WinMain()函数一起使用?


这是我使用的代码:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c winapi name-mangling

4
推荐指数
1
解决办法
165
查看次数

配置空间寄存器映射到内存空间还是IO空间?

我读到每个PCI设备功能都有一组称为配置空间的寄存器,这个配置空间有256字节长。您可以使用以下两个端口映射的 I/O 地址来访问这些寄存器:

CONFIG_ADDRESS 0x3f8
CONFIG_DATA 0x3fc
Run Code Online (Sandbox Code Playgroud)

我的问题是,configuration space寄存器是否也映射到内存空间或IO空间?或者访问它们的唯一方法是通过0x3f80x3fc

hardware x86

1
推荐指数
1
解决办法
2587
查看次数

溢出意味着什么?

我已经读了两个关于溢出意味着什么的定义.

假设我们有以下添加:

 11111111
 00000001
 --------
100000000
Run Code Online (Sandbox Code Playgroud)

我读过的第一个定义是结果不适合8位(在本例中需要9位)的事实,然后这称为溢出.


我读过的另一个定义是,如果我们有两个有符号整数的加法(例如两个补码整数):

 10011001
 10111011
 --------
101010100
Run Code Online (Sandbox Code Playgroud)

然后,如果8位result(01010100)的符号与两个整数的符号不同(在本例中它是不同的),那么这称为溢出.

哪个定义是正确的?

math assembly integer overflow twos-complement

1
推荐指数
2
解决办法
90
查看次数