reactos操作系统实现(1)
reactos操作系统实现(16)
下面仔细分析这个函数的代码: #001 /* Switch to new kernel stack and start kernel bootstrapping */ #002 KiSetupStackAndInitializeKernel(&KiInitialProcess.Pcb, #003
日期 2023-06-12 10:48:40reactos操作系统实现(20)
下面来了解内核执行体的处理,它是在初始化内核线程后运行的,代码如下: #001 /* Setup the Idle Thread */ #002 KeInitializeThread(InitProcess, #003 InitTh
日期 2023-06-12 10:48:40reactos操作系统实现(24)
在很早的电脑里,就带有一个小喇叭,可以发出不同频率的声音。主要用来判断系统是否有问题使用,比如BIOS检查硬有问题时,就会发出不同的声音,提醒用户是那里出问题了。在操作系统里,也经常使用这个小喇叭来提醒用户是什么问题,比如输入非法的按键时,就响
日期 2023-06-12 10:48:40reactos操作系统实现(26)
在ReactOS内存管理里,有一块内存区是非分页内存,也就是这块内存始终保持在系统物理内存里面,不会换到磁盘上。那为什么需要这样做呢?全部使用分页内存不是更简单,更方便吗?肯定不行的,因为IA86的内存管理就决定它不能这样做了,当CPU缺页中断
日期 2023-06-12 10:48:40reactos操作系统实现(29)
内存大小好像永远追不上人们的需求,以前以为512K就很大了,到现在内存已经是4G,8G内存了,但还是不能满足人们的需求。因为目前的系统都是多进程运行,每个进程都需要占用4G的内存,那么10个进程,就占用相当可观的内存了。这时就需要把进程不经常使用的内存数据切
日期 2023-06-12 10:48:40reactos操作系统实现(11)
中断机制发明以来,就一直成为 CPU 的主导地位通知机制,因为中断的高效方式,没有其它任何的方式可以取代它的。在 IA-32 的 CPU 架构里,采用了中断寄存器和中断描述符来判断中断的来源,如下图所示: 在ReactOS里使用
日期 2023-06-12 10:48:40reactos操作系统实现(12)
有了上面的知识,就来分析 ReactOS 里引导任务是怎么样设置全局描述符表。其工作过程如下图所示: 由于CPU初始化运行后,就当作为一个任务在运行。这里主要设置这个任务的运行保存环境,以便CPU可以交给其它任务运行,否则切换到其它任务运行后,就再也回不到
日期 2023-06-12 10:48:40reactos操作系统实现(15)
在 ReactOS 里有这么一段初始化代码,如下: #001 AppCpuInit: #002 /* Loop until we can release the freeze lock */ #003 do #004 { #005 /
日期 2023-06-12 10:48:40reactos操作系统实现(46)
在线程调度里可以看到,需要调用函数KiSwapContext来进行运行环境切换,由于每个CPU都是只能运行一个线程,而多个线程在运行过程中被中断了,那么就需要保存CPU所有寄存器,以便下一次恢复线程时可以接续运行。现在就来分析这个函数是怎么样实现这些工作的,代码如下&
日期 2023-06-12 10:48:40reactos操作系统实现(63)
前面把注册表初始化完成之后,就开始进行安装引导程序了。这里安装的引导程序是分区引导程序,或者安装到软盘引导程序。当然也可以选择跳过不安装它,界面如下: 这个函数的代码如下: #001 static PAGE_NUMBER #002 BootLoaderPage
日期 2023-06-12 10:48:40reactos操作系统实现(69)
当用户安装系统时,就会出现几个向导界面,这几个向导界面是怎么样实现的呢?具体又是做些什么样的功能呢?它的实现代码如下: #001 VOID #002 InstallWizard(VOID) #003 { #004 PROPSHEETHEADER psh; #005
日期 2023-06-12 10:48:40reactos操作系统实现(71)
I/O管理器是管理着整个计算机的输入和输出的操作,因此它是一个基本的组成部份。I/O管理器的初始化调用是在文件reactos/ntoskrnl/ex/init.c里,它主要调用I/O管理器的函数IoInitSystem()来实现,这个函数在文件reactos/ntoskrnl/io/iomgr/iomgr.c
日期 2023-06-12 10:48:40reactos操作系统实现(76)
当键盘类驱动程序或鼠标类驱动程序枚举时,会找到很多设备,这些设备需要使用回调的方式来进行初始化。下面的函数,就是实现回调初始化驱动程序,如下: #001 VOID #002 NTAPI #003 IopReinitializeBootDrivers(VOID) #00
日期 2023-06-12 10:48:40reactos操作系统实现(77)
因为PC里一条总线上可以连接很多设备,就像一棵树一样,需要遍历所有总线上所有子设备,并且为每一个子设备安装相应的驱动程序,下面这个函数,实现枚举所有子设备,实现代码如下: #001 NTSTATUS #002 IopEnumerateDevice
日期 2023-06-12 10:48:40reactos操作系统实现(84)
在系统里User32.dll,kernel32.dll,shell32.dll,gdi32.dll,rpcrt4.dll,comctl32.dll,advapi32.dll,version.dll等dll代表了Win32 API的基本提供者。Win32
日期 2023-06-12 10:48:40reactos操作系统实现(87)
应用程序对设备I/O进行Win32调用,这个调用由I/O系统服务接收,然后I/O管理器从这个请求构造一个合适的I/O请求包(IRP)。那么I/O管理器是怎么样创建这个I/O请求包(IRP)的呢?又是怎么样传送给驱动程序的呢?我们带着这两个问
日期 2023-06-12 10:48:40reactos操作系统实现(88)
IRP 是 I/O request packet 的缩写,即 I/O 请求包。驱动与驱动之间通过 IRP 进行通信。而使用驱动的应用层调用的 CreatFile,ReadFile,WriteFile,DeviceIoControl 等函数,说到底也是使用 IRP 和驱动进行通信。 一个 IRP 由两部分组成。首先是头部或
日期 2023-06-12 10:48:40reactos操作系统实现(98)
通过上面的分析,发现设置一个中断处理是非常复杂的,下面就来通过图来分析一个中断发生时,中断处理的过程如下图: 其实所有上面代码,就是设置这些流程里工作的函数关键代码,以便整个中断连接起来。其中一些函数是在汇编代码里面,这些都需要仔细分析才能
日期 2023-06-12 10:48:40reactos操作系统实现(91)
驱动程序很多配置参数是保存在注册表里,比如IO资源参数,中断号等内容。因此只有了解注册表的读取,以及相关内容才可以清楚知道键盘驱动程序,主要操作那些相关的端口,还有配置参数。下面来分析函数ReadRegistryEntries的实现,如下: #001
日期 2023-06-12 10:48:40reactos操作系统实现(92)
在DirverEntry函数,可以看到下面这句: #054 DriverObject->DriverExtension->AddDevice = i8042AddDevice; 这里是设置了驱动程序的AddDevice函数指针,它是指向函数i8042AddDevice。PnP管
日期 2023-06-12 10:48:40reactos操作系统实现(95)
在PNP管理器里,最重要的处理,就是即插即用消息。下面来分析键盘的即插即用消息处理函数,实现的代码如下: #001 NTSTATUS NTAPI #002 i8042Pnp( #003 IN PDEVICE_OBJECT DeviceObject, #004 IN P
日期 2023-06-12 10:48:40reactos操作系统实现(112)
IdeReadWrite函数主要实现了IDE设备的读和写命令发送。具体实现函数如下: #001 ULONG #002 NTAPI #003 IdeReadWrite( #004 IN PVOID HwDeviceExtension, #005 IN PSCSI_REQUEST_BLOCK Srb #
日期 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操作系统实现(120)
CreateDiskDeviceObject函数主要就是为了物理设备创建磁盘对象,并且查找磁盘上每个分区和创建相应的对象。具体实现代码如下: #001 NTSTATUS #002 NTAPI #003 CreateDiskDeviceObject( #004 IN PDRIVER_OBJECT Driv
日期 2023-06-12 10:48:40reactos操作系统实现(129)
功能驱动将构造请求包,就可以发送到底层总线驱动上。因此需要创建一个IRP,这就需要用IoBuildDeviceIoControlRequest创建一个IO控制码的IRP,用IoCallDriver将URB发送到底层总线驱动上。由于上层驱动无法知道底层驱动是同步还是异步完成的,因此需要做一个判断。if
日期 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操作系统实现(184)
GreExtTextOutW函数实现一串字符串输出到指定区域,当然是从字符串变成图片输出。这些都调用FreeType库来实现的,具体实现代码如下: #001 BOOL #002 APIENTRY #003 GreExtTextOutW( #004 IN HDC hDC, #005
日期 2023-06-12 10:48:40reactos操作系统实现(143)
VgaIsPresent函数通过读取图形模式的索引寄存器和数据寄存器来检查VGA显示卡是否安装,实现代码如下: #001 BOOLEAN #002 NTAPI #003 VgaIsPresent(VOID) #004 { #005 UCHAR VgaReg, VgaReg2, VgaReg3; #
日期 2023-06-12 10:48:40reactos操作系统实现(146)
Reactos的显示组成主要由GDI、视频端口驱动程序、小端口驱动程序和显示驱动程序组成。当GDI系统接到应用程序请求后,就会查找相应的小端口驱动程序,接着小端口驱动程序,就会设置视频端口驱动程序和显示驱动程序。在GDI和小端口驱动程序调用流程如下图所示:
日期 2023-06-12 10:48:40reactos操作系统实现(149)
IntVideoPortFindAdapter函数主要用来查找到相应显示卡,并且把显示卡驱动安装到对象管理器里,以便GUI界面调用时,可以找到相应驱动程序显示。具体实现代码如下: #001 NTSTATUS NTAPI #002 IntVideoPortFindAdapter( #00
日期 2023-06-12 10:48:40