reactos操作系统实现(8)
reactos操作系统实现(24)
在很早的电脑里,就带有一个小喇叭,可以发出不同频率的声音。主要用来判断系统是否有问题使用,比如BIOS检查硬有问题时,就会发出不同的声音,提醒用户是那里出问题了。在操作系统里,也经常使用这个小喇叭来提醒用户是什么问题,比如输入非法的按键时,就响
日期 2023-06-12 10:48:40reactos操作系统实现(4)
由于近来家里的电脑坏了,老是上网就死机,也上不了网发贴。近来也是经济危机到来的时候,事情还是比较多。本来不太打算更换电脑的,等到明年电脑降价了,再去买的。但这台电脑也用了四年了,又急着想上网,就下定决心去买了一台电脑回来。当然,这次配置的电脑
日期 2023-06-12 10:48:40reactos操作系统实现(29)
内存大小好像永远追不上人们的需求,以前以为512K就很大了,到现在内存已经是4G,8G内存了,但还是不能满足人们的需求。因为目前的系统都是多进程运行,每个进程都需要占用4G的内存,那么10个进程,就占用相当可观的内存了。这时就需要把进程不经常使用的内存数据切
日期 2023-06-12 10:48:40reactos操作系统实现(5)
一般的电脑都是使用硬盘来引导操作系统,由于硬盘是电脑的最常用的存储媒介,在 ReactOS 里,它会把一个硬盘划分成如下的形式: 通过安装程序把扇区引导程序写到硬盘分区引导记录扇区,然后当BIOS加电后,
日期 2023-06-12 10:48:40reactos操作系统实现(9)
在reactos初始化代码里,经常看到ACPI的缩写,那么它是表示什么意思呢?现在就来解决这个问题,它就是电源管理方面的。具体内容如下: Advanced Configuration and Power Management Interface ACPI表示高级配置和电
日期 2023-06-12 10:48:40reactos操作系统实现(6)
硬盘引导的流程与相应源码文件名称: 引导序号 引导过程 引导执行代码位数 目标文件名称 1. 主引导代码(Master Boot Record (MBR) code)
日期 2023-06-12 10:48:40reactos操作系统实现(42)
接着下来,就需要分析函数KiReadyThread的作用了。根据线程状态来判断是否可以放入延迟队列,还是设置它为转换状态,代码如下: #001 VOID #002 NTAPI #003 KiReadyThread(IN PKTHREAD Thread) #004 { 获取
日期 2023-06-12 10:48:40reactos操作系统实现(41)
当线程初始化成功后,是怎么样放到推迟就绪队列的呢?通过下面这几个函数的分析,就会了解这个问题了。从以前的分析可以知道是调用函数KeReadyThread来执行的,这个函数的代码如下: #001 VOID #002 NTAPI #003 KeReadyThread(IN
日期 2023-06-12 10:48:40reactos操作系统实现(43)
前面介绍放到延迟队列是单核的版本,下面来学习多核的版本,代码如下: #001 // #002 // This routine makes the thread deferred ready on the boot CPU. #003 // #004 FORCEINLINE #005 VOI
日期 2023-06-12 10:48:40reactos操作系统实现(50)
当运行到内核函数Phase1Initialization里,就是进行内核第一阶段初始化了,这时在这个函数又调用函数Phase1InitializationDiscard进行复杂的处理,在这里有一个重要的步骤,就是打开内核应用程序smss.exe来运行。具体代码如下: #001
日期 2023-06-12 10:48:40reactos操作系统实现(53)
在前面的代码分析里,发现创建一个线程,而这个线程运行的主函数是PnpEventThread。那么创建这个线程是用来做什么事情的呢?那就得去分析文件reactos/base/setup/usetup/interface/devinst.c里的代码,如下: #001 DWORD W
日期 2023-06-12 10:48:40reactos操作系统实现(63)
前面把注册表初始化完成之后,就开始进行安装引导程序了。这里安装的引导程序是分区引导程序,或者安装到软盘引导程序。当然也可以选择跳过不安装它,界面如下: 这个函数的代码如下: #001 static PAGE_NUMBER #002 BootLoaderPage
日期 2023-06-12 10:48:40reactos操作系统实现(65)
激动人心的时刻到了,最后安装成功了。会出现下面的界面,如下: 上面成功的实现代码如下: #001 static PAGE_NUMBER #002 SuccessPage(PINPUT_RECORD Ir) #003 { 显示成功安装的信息。 #004
日期 2023-06-12 10:48:40reactos操作系统实现(68)
前面介绍怎么样调用动态连接库里的InstallReactOS函数,下面就来分析这个函数的代码,看看这个函数是怎么运行向导界面,又做了些什么样的工作。如下: #001 DWORD WINAPI #002 InstallReactOS(HINSTANCE hInstance) #003
日期 2023-06-12 10:48:40reactos操作系统实现(72)
ReactOS通过对象管理机制为内核提供了一致的和安全的访问方式。对象管理器是一个用于创建、删除、保护和跟踪对象的内核一部份。由于I/O管理的设备是多方面的,就需要创建很多对象来表达这种设备,下面就来了解关于I/O相关的对象,初始化的代码如下: #001 BOOLEAN #002 INI
日期 2023-06-12 10:48:40reactos操作系统实现(73)
即插即用(Plug and Play,PnP)是计算机系统I/O设备与部件配置的应用技术。PnP就是指插入就可以使用,不需要进行任何的硬件配置。其实还是需要安装相应的驱动程序才可以使用的。随着人们对计算机使用多样化,不断地需要添加各种各样的硬件卡到计算机的主板上,这样就需要配置硬件
日期 2023-06-12 10:48:40reactos操作系统实现(76)
当键盘类驱动程序或鼠标类驱动程序枚举时,会找到很多设备,这些设备需要使用回调的方式来进行初始化。下面的函数,就是实现回调初始化驱动程序,如下: #001 VOID #002 NTAPI #003 IopReinitializeBootDrivers(VOID) #00
日期 2023-06-12 10:48:40reactos操作系统实现(80)
下面的函数主要初始化PnP发现的设备,并为它安装服务,代码如下: #001 NTSTATUS #002 IopInitializePnpServices(IN PDEVICE_NODE DeviceNode) #003 { #004 DEVICETREE_TRAVERSE_CONTEXT
日期 2023-06-12 10:48:40reactos操作系统实现(78)
ARC命名是Windows NT系统用来定位其引导分区所在的路径,也就是利用它指明引导分区在哪一个磁盘控制器,哪一个硬盘,哪一个分区内。ARC命名可分为两大类,以scsi为首或以multi为首,现分别说明如下: scsi(x)disk(y)rdisk(0)partit
日期 2023-06-12 10:48:40reactos操作系统实现(91)
驱动程序很多配置参数是保存在注册表里,比如IO资源参数,中断号等内容。因此只有了解注册表的读取,以及相关内容才可以清楚知道键盘驱动程序,主要操作那些相关的端口,还有配置参数。下面来分析函数ReadRegistryEntries的实现,如下: #001
日期 2023-06-12 10:48:40reactos操作系统实现(99)
下面来分析键盘的中断处理函数的实现,如下: #001 BOOLEAN NTAPI #002 i8042KbdInterruptService( #003 IN PKINTERRUPT Interrupt, #004 PVOID Context) #005 { #006 PI8042
日期 2023-06-12 10:48:40reactos操作系统实现(100)
在分析文件所有操作之前,先来看看文件操作的基来流程,与那些系统是相关联的。如下图所示: 应用程序先发起文件的操作,接着就调用到IO管理器的内核函数,IO管理器函数就会生成IRP请求包,并把IRP请求包传送给文件系统驱动程序,接着文件系统把请求
日期 2023-06-12 10:48:40reactos操作系统实现(111)
IdeSendSmartCommand函数主要发送IDE的命令。具体实现代码如下: #001 ULONG #002 NTAPI #003 IdeSendSmartCommand( #004 IN PVOID HwDeviceExtension, #005 IN PSCSI_REQUEST_BLOCK
日期 2023-06-12 10:48:40reactos操作系统实现(126)
VfatCreateFile函数主要用来创建或者打开一个文件,具体实现如下: #001 static NTSTATUS #002 VfatCreateFile ( PDEVICE_OBJECT DeviceObject, PIRP Irp ) #003 /* #004 * FUNCTION: Create o
日期 2023-06-12 10:48:40reactos操作系统实现(119)
前介绍了初始化函数ScsiClassInitialize,那么在这个函数里使用下面的语句来查找SCSI的磁盘,如下: if (InitializationData->ClassFindDevices(DriverObject, Argument2, InitializationData,portDevic
日期 2023-06-12 10:48:40reactos操作系统实现(123)
目前,Reactos主要使用FAT的文件系统,因此下面就先来分析这个文件系统,以便了解这个文件系统的功能。这个文件系统的实现是在驱动程序FASTFAT.SYS里实现的,所以来分析这个驱动程序的源码,就可以了解FAT文件系统了。 6.2.1 FAT文件系统驱动程序入口函数 FA
日期 2023-06-12 10:48:40reactos操作系统实现(131)
VfatRead函数用来读取FAT文件系统里的文件数据,如果缓冲区里有数据就直接从缓冲区里读取,否则就从磁盘上读取。具体实现如下: #001 NTSTATUS #002 VfatRead(PVFAT_IRP_CONTEXT IrpContext) #003 { #004 NTSTATUS S
日期 2023-06-12 10:48:40reactos操作系统实现(134)
文件控制块主要用来表示一个ReactOS打开文件的对象。下面就来仔细地分析文件控制块的结构,如下: #001 typedef struct _VFATFCB #002 { ROS的文件头部,主要包括文件流的描述和系统使用的变量。 #003 /* FCB header required by
日期 2023-06-12 10:48:40reactos操作系统实现(180)
DefWndNCPaint函数实现窗口非客户区的显示部分,比如窗口的标题、最大化、最小化、关闭按钮、滚动条等等。 #001 LRESULT #002 DefWndNCPaint(HWND hWnd, HRGN hRgn, BOOL Active) #003 { #004 HDC hDC; #005 DWO
日期 2023-06-12 10:48:40reactos操作系统实现(140)
在创建文件成功后,然后就往文件里写入数据,而写入数据说明就需要文件系统给文件分配储存空间,以便保存这些数据到磁盘里,下面就来分析分配文件大小的函数,如下: #001 NTSTATUS #002 VfatSetAllocationSizeInformation(PF
日期 2023-06-12 10:48:40reactos操作系统实现(184)
GreExtTextOutW函数实现一串字符串输出到指定区域,当然是从字符串变成图片输出。这些都调用FreeType库来实现的,具体实现代码如下: #001 BOOL #002 APIENTRY #003 GreExtTextOutW( #004 IN HDC hDC, #005
日期 2023-06-12 10:48:40