reactos操作系统实现(7)
reactos操作系统实现(1)
reactos是什么操作系统呢?它是一个开源的操作系统,并且是兼容Windows XP的应用程序和驱动程序的操作系统。意思就是说,直接安装一个reactos之后,把第三方的驱动程序安装好后,就可以运行第三方的Windows应用程序了。这样达到替换微软的windows操作系统的目的
日期 2023-06-12 10:48:40reactos操作系统实现(21)
初始化NLS代码表。 #124 /* Initialize the NLS Tables */ #125 RtlInitNlsTables((PVOID)((ULONG_PTR)ExpNlsTableBase + #126 ExpAnsiCodePageData
日期 2023-06-12 10:48:40reactos操作系统实现(22)
从Boot.S文件里初始化系统基本组件后,就跳到空闲函数处理,就成为一个空闲处理的线程,其实也是一个管理系统的任务。下面就来分析KiIdleLoop函数的代码,如下: #001 .globl @KiIdleLoop@0 #002 .func @KiIdl
日期 2023-06-12 10:48:40reactos操作系统实现(24)
在很早的电脑里,就带有一个小喇叭,可以发出不同频率的声音。主要用来判断系统是否有问题使用,比如BIOS检查硬有问题时,就会发出不同的声音,提醒用户是那里出问题了。在操作系统里,也经常使用这个小喇叭来提醒用户是什么问题,比如输入非法的按键时,就响
日期 2023-06-12 10:48:40reactos操作系统实现(26)
在ReactOS内存管理里,有一块内存区是非分页内存,也就是这块内存始终保持在系统物理内存里面,不会换到磁盘上。那为什么需要这样做呢?全部使用分页内存不是更简单,更方便吗?肯定不行的,因为IA86的内存管理就决定它不能这样做了,当CPU缺页中断
日期 2023-06-12 10:48:40reactos操作系统实现(12)
有了上面的知识,就来分析 ReactOS 里引导任务是怎么样设置全局描述符表。其工作过程如下图所示: 由于CPU初始化运行后,就当作为一个任务在运行。这里主要设置这个任务的运行保存环境,以便CPU可以交给其它任务运行,否则切换到其它任务运行后,就再也回不到
日期 2023-06-12 10:48:40reactos操作系统实现(14)
下面来分析一下系统任务是怎么样初始化的,先来看这行代码: /* Setup the TSS descriptors and entries */ Ki386InitializeTss(Tss, Idt, Gdt); 在这个Ki386InitializeTss函数里就是进行初始化系统任务的工作
日期 2023-06-12 10:48:40reactos操作系统实现(44)
前面分析了怎么样把一个线程放到延迟就绪队列,接着下来的问题就是这些在就绪队列里的线程什么时候开始运行呢?又是怎么样把就绪队列的线程取出来运行的呢?线程调度的触发事件有以下四种: 1) 线程进入就绪状态,如一个刚创建的线程,或者一个刚结束的线程。 2&
日期 2023-06-12 10:48:40reactos操作系统实现(45)
怎么样从一个延迟就绪队列里选择合适的线程运行呢?下面就来分析这段代码,如下: #001 // #002 // This routine scans for an appropriate ready thread to select at the #003 // given priority and
日期 2023-06-12 10:48:40reactos操作系统实现(46)
在线程调度里可以看到,需要调用函数KiSwapContext来进行运行环境切换,由于每个CPU都是只能运行一个线程,而多个线程在运行过程中被中断了,那么就需要保存CPU所有寄存器,以便下一次恢复线程时可以接续运行。现在就来分析这个函数是怎么样实现这些工作的,代码如下&
日期 2023-06-12 10:48:40reactos操作系统实现(50)
当运行到内核函数Phase1Initialization里,就是进行内核第一阶段初始化了,这时在这个函数又调用函数Phase1InitializationDiscard进行复杂的处理,在这里有一个重要的步骤,就是打开内核应用程序smss.exe来运行。具体代码如下: #001
日期 2023-06-12 10:48:40reactos操作系统实现(49)
前面已经介绍怎么样从ISOBOOT里加载SETUPLDR.SYS,下面来分析一下这个程序与一般硬盘引导程序freeldr.sys有什么区别。 在文件freeldr.c里是这样这样调用安装函数的: #001 VOID BootMain(LPSTR CmdLine) #002 { #003 CmdLin
日期 2023-06-12 10:48:40reactos操作系统实现(58)
格式化磁盘主要做什么样的工作呢?根据用户选择的文件系统,把格式化的数据和分区表写到磁盘,然后判断引导分区,写入引导代码到引导分区。具代实现代码如下: #001 static ULONG #002 FormatPartitionPage (PINPUT_RECORD Ir)
日期 2023-06-12 10:48:40reactos操作系统实现(62)
当文件拷贝完成后,主要就是把已经拷贝的文件进行注册表登记,还需要把用户在安装过程里选择的配置保存到注册表,同时也需要把检查到的硬件保存到注册表里。其实注册表,就是保存一些配置信息,这样下一次启动时,就可以直接把这些信息加载到内存就行了,不需要用户重新选择
日期 2023-06-12 10:48:40reactos操作系统实现(73)
即插即用(Plug and Play,PnP)是计算机系统I/O设备与部件配置的应用技术。PnP就是指插入就可以使用,不需要进行任何的硬件配置。其实还是需要安装相应的驱动程序才可以使用的。随着人们对计算机使用多样化,不断地需要添加各种各样的硬件卡到计算机的主板上,这样就需要配置硬件
日期 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操作系统实现(34)
现在就来分析第一阶段的进程管理器初始化函数PspInitPhase0,如下: #001 BOOLEAN #002 NTAPI #003 PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock) #004 { #005 NTSTATUS Statu
日期 2023-06-12 10:48:40reactos操作系统实现(82)
在I/O管理最后阶段,就是加载系统所有动态连接库,比如加载NTDLL动态连接库,具体实现代码如下: #001 NTSTATUS #002 NTAPI #003 PsLocateSystemDll(VOID) #004 { #005 OBJECT_ATTRIBUTES
日期 2023-06-12 10:48:40reactos操作系统实现(35)
初始化活动的进程列表。 #076 /* Initialize the Active Process List */ #077 InitializeListHead(&PsActiveProcessHead); #078 KeInitializeGuardedMutex(&PspActiveProce
日期 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操作系统实现(38)
由于Reactos是以线程为最小的调度单位,如果仅仅创建进程的数据结构,不足以运行进程的任务,每个进程至少需要一个线程才可以运行,下面就来分析系统进程的线程创建,代码如下: #195 /* Setup the system initialization t
日期 2023-06-12 10:48:40reactos操作系统实现(86)
创建完成端口需要调用Windows API CreateIoCompletionPort: HANDLE CreateIoCompletionPort( HANDLE FileHandle, HANDLE ExistingCompletionPort, DWORD CompletionKey, DWOR
日期 2023-06-12 10:48:40reactos操作系统实现(96)
调用函数IoConnectInterrupt来设置键中断处理函数。 #028 Status = IoConnectInterrupt( #029 &PortDeviceExtension->KeyboardInterrupt.Object, #030 i8042KbdInterrup
日期 2023-06-12 10:48:40reactos操作系统实现(107)
IssueIdentify函数主要是发送IDENTIFY命令给一个ATAPI设备,并且获取这个设备相关信息,比如磁头的个数。 #001 BOOLEAN #002 NTAPI #003 IssueIdentify( #004 IN PVOID HwDeviceExtension, #005
日期 2023-06-12 10:48:40reactos操作系统实现(109)
AtapiInterrupt函数是实现ATAPI的中断功能,主要根据SRB来判断是读取数据还是写入数据,然后对IDE设备读取或写入数据,还需要处理很多出错的情况。具体实现代码如下: #001 BOOLEAN #002 NTAPI #003 AtapiInterrupt( #004
日期 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操作系统实现(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操作系统实现(116)
PciIdeXFdoStartDevice函数是用来处理即插即用的启动设备消息,主要设置了DMA操作和保存设备端口的基地址,这里就是启动PCIIDE的物理设备,具体实现代码如下: #001 static NTSTATUS #002 PciIdeXFdoStartDevice( #003
日期 2023-06-12 10:48:40reactos操作系统实现(118)
ScsiClassInitialize函数初始化驱动程序对象,主要是找到合适的端口驱动程序,并设置它来处理磁盘的命令,具体实现代码如下: #001 ULONG #002 NTAPI #003 ScsiClassInitialize( #004 IN PVOID
日期 2023-06-12 10:48:40reactos操作系统实现(121)
CreatePartitionDeviceObjects函数是通过分析MBR扇区的数据,然后来创建所有分区对象。具体实现代码如下: #001 NTSTATUS #002 NTAPI #003 CreatePartitionDeviceObjects( #004 IN PDEVICE_OBJECT Phy
日期 2023-06-12 10:48:40reactos操作系统实现(120)
CreateDiskDeviceObject函数主要就是为了物理设备创建磁盘对象,并且查找磁盘上每个分区和创建相应的对象。具体实现代码如下: #001 NTSTATUS #002 NTAPI #003 CreateDiskDeviceObject( #004 IN PDRIVER_OBJECT Driv
日期 2023-06-12 10:48:40