如何在C程序中直接更改视频内存映射来绘制像素(无库函数)
How to draw a pixel by changing video memory map directly in a C program (without library functions)
是否可以通过使用c程序更改RAM中屏幕(视频即监视器)内存映射中的值来显示黑点?
我不想使用任何库函数,因为我的主要目标是学习如何开发一个简单的操作系统。我尝试访问启动屏幕内存映射即0xA0000(在C中)。
我试着运行这个程序,但由于没有提供直接访问,所以出现了分段故障。在超级用户中,程序在没有任何更改的情况下执行。
目前我正在VirtualBox中进行测试。
"real"操作系统不会使用地址0xA0000处的帧缓冲区,因此您无法通过直接写入来在屏幕上绘制。相反,你的操作系统可能有合适的视频驱动程序,可以通过各种非常复杂的方式与硬件对话。简而言之,在现代操作系统上,没有简单的方法可以做你想做的事情。
另一方面,如果你想学习如何编写自己的操作系统,那么尝试编写一个最小内核将是一个非常好的做法,该内核可以输出到0xB8000的VGA文本帧缓冲区,然后输出到0xA0000的VGA图形帧缓冲区。
您可以在BIOS跳到内核后立即开始使用这些帧缓冲区并在屏幕上绘图,只需进行最少的设置。您可以在实际模式中直接完成这项工作,可能需要一百行汇编程序,或者在C中先用几行汇编程序粘合。更简单的方法是让GRUB设置硬件,引导您的最小内核,然后您可以在几行中直接写入它。
简短的回答是否定的,因为现代操作系统上的帧缓冲区是由vbios和内核驱动程序决定的。这取决于板上存在的VRAM的数量、GART的大小、存在的物理Ram和一大堆其他东西(VRAM保留,它是否应该对CPU可见,等等)。除此之外,现代操作系统正在利用多个后缓冲区,并翻转硬件以在这些缓冲区之间显示,因此即使您可以直接戳到帧缓冲区,地址也会随着帧的变化而变化。
如果您出于学习目的对此感兴趣,我建议您创建一个简单的OGL或D3D(例如)"函数",该函数使用"假"系统分配的帧缓冲区,并使用常规硬件操作将其显示在屏幕上。
你甚至可以在计时器上设置刷新来伪造更新。
然后,你的假操作系统只需将像素写入假系统内存缓冲区,这个渲染函数就会将其显示为真实的。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- QuadTree只在窗口的右上角绘制
- 如何在C程序中直接更改视频内存映射来绘制像素(无库函数)
- 使用opengl绘制和映射纹理到系统RAM