佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 434|回复: 1

操作系统的API只不过是……

[复制链接]
发表于 1-3-2021 10:43 PM | 显示全部楼层 |阅读模式
本帖最后由 褐眼睛 于 1-3-2021 10:45 PM 编辑

我这里指的是Windows NT的翻版React OS(https://github.com/reactos/reactos)

ReactOS的内部API与Windows几乎一样,它也能运行Windows EXE。虽然如此,开发人员并没有抄袭Windows内核。

我这里讲一讲Console.WriteLine(C#)或Print(Visual Basic)的典故,以前DOS时代,程序员可以直接写入Screen Buffer B800:0或A000:0。
现在除非在Windows 32-bit使用NTVDM(Virtual DOS Machine),不然操作系统禁止直接写入内存。

换句话说,操作系统只能允许程序员使用它的API(如Win32 API)来WriteLine 或Print字符串。
Win32 API主要有两款:WriteFile和WriteConsole,都可以显示字符串在CUI (Console Screen)之下,不过WriteFile除了可以WriteConsole外,它可以重定向到文件写入。
这里只是列举WriteConsole. Win32 API又有提供两款WriteConsole,一个是显示Unicode字符串,一个是显示ANSI字符串(为英语系国家用户所用)。


  1. #ifdef UNICODE
  2. #define WriteConsole WriteConsoleW
  3. #else
  4. #define WriteConsole WriteConsoleA
  5. #endif
复制代码


然后,WriteConsoleA的函数是:


  1. BOOL
  2. WINAPI
  3. WriteConsoleA(
  4.   _In_ HANDLE hConsoleOutput,
  5.   _In_reads_(nNumberOfCharsToWrite) CONST VOID *lpBuffer,
  6.   _In_ DWORD nNumberOfCharsToWrite,
  7.   _Out_opt_ LPDWORD lpNumberOfCharsWritten,
  8.   _Reserved_ LPVOID lpReserved);
复制代码
这里可以说ReactOS模仿得Windows很好,连Win32 API的参数都一样。


如果大家有仔细找到WriteConsoleA的做法,可以在这里讨论出来。我读了一回,它其实也不过是用RtlCopyMemory()将字符串复制到另一处,虽然我没有找到那“另一处”是什么,但是我敢假设,它也是复制到Screen Buffer。

由始至终,Windows 只不过复制了DOS时代让程序员自由发挥的方法,进而限制他们不再能有Direct Memory Access (DMA),唯独通过操作系统的内部API。
这也不难理解,现代操作系统同时有许多进程,需要锁定某个内存区域,避免让程序员自由写入或读取。
回复

使用道具 举报


ADVERTISEMENT

发表于 1-3-2021 11:56 PM | 显示全部楼层
嘗試換一個角度來敘述。

軟件需要在硬體上執行,而不同硬體有不同的規格 (cpu, ram, i/o)

如果要軟件開發商根據不同的硬體做不同版本的軟件,會很多工作以及很多 debug 的工作。
一些軟件就使用自家或者市場上的 "engine",
而 engine 就根據不同的 機器/系統 處理相同的工作,以達到接近甚至相同的效果。



os 基本的工作是 "資源分配"
哪一個軟件使用多少的 cpu, ram, i/o

讓軟件不必處理額外的事情。
(例如在播放視頻的時候 軟件不需要檢查有沒有 電郵/來電,而是由 os 顯示訊息,甚至暫停播放器)

要使用這些資源,就需要通過 api 來獲取資源。



關於各種的 buffer, low level hardward i/o, 有興趣的可以參考 z80。
這是直接讀寫 硬件的位置。
如果硬體不同/不兼容,位址/資料/使用方式 都會不同。



參考:
Unity (game engine)
https://en.wikipedia.org/wiki/Un ... Supported_platforms

ONLY FOR PROGRAMMERS: Operating System
https://only4programmers.blogspo ... erating-system.html

How to Build a Z80 Computer, Part 1: The CPU | PIC | Maker Pro
https://maker.pro/pic/projects/z ... ject-part-1-the-cpu

x86 programming for Ms Dos Computers in CGA , EGA and VGA!
https://www.chibialiens.com/8086/msdos.php



评分

参与人数 1积分 +20 收起 理由
褐眼睛 + 20 谢谢分享

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 28-3-2024 07:01 PM , Processed in 0.067333 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表