reactos操作系统实现(30)
reactos操作系统实现(17)
从上面分析可以看到,主要调用函数 KiInitializeKernel 来初始化内核,这个函数传送的参数与函数 KiSetupStackAndInitializeKernel 的参数是一样的,如下: #001 VOID #002 NTAPI #003 KiIniti
日期 2023-06-12 10:48:40reactos操作系统实现(18)
在 X86 的体系架构里,整数运算和浮点运算是分开的。算术逻辑单元 (Arithmetic Logic Unit, ALU) 是中央处理器 (CPU) 的执行单元,是所有中央处理器的核心组成部分,由 " 与门 " 和 " 或门 " 构成的算术逻辑单元&
日期 2023-06-12 10:48:40reactos操作系统实现(1)
reactos是什么操作系统呢?它是一个开源的操作系统,并且是兼容Windows XP的应用程序和驱动程序的操作系统。意思就是说,直接安装一个reactos之后,把第三方的驱动程序安装好后,就可以运行第三方的Windows应用程序了。这样达到替换微软的windows操作系统的目的
日期 2023-06-12 10:48:40reactos操作系统实现(19)
由于 CPU 是多种多样,具备能力也是不一样的,并且不同厂家都会创新不同的功能。下面就来了解 CPU 特征识别,如下: /* Get the processor features for the CPU */ FeatureBits = KiGetFeatureBi
日期 2023-06-12 10:48:40reactos操作系统实现(2)
对于开发一个操作系统是一个漫长的过程,并不像一个Hello world程序那么快捷,那么明了。因此对开发OS的基本知识,基本技能也需要比较高深一些,特别对一些名词和概念,更需要深入地了解。由于操作系统大部份需要与硬件打交道,所以硬件的知识需要了解,特别CPU
日期 2023-06-12 10:48:40reactos操作系统实现(20)
下面来了解内核执行体的处理,它是在初始化内核线程后运行的,代码如下: #001 /* Setup the Idle Thread */ #002 KeInitializeThread(InitProcess, #003 InitTh
日期 2023-06-12 10:48:40reactos操作系统实现(3)
有人说,reactos不是实时操作系统,不能做嵌入式系统,难道真的不能做嵌入式系统吗?其实不是这样的,嵌入式系统本来就包括有两类系统,一种是要求实时性强,一种是要求实时性弱的。这两种都是嵌入式系统。因此,ReactOS做嵌入式系统是没有问题的
日期 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操作系统实现(30)
对无效页面的一次访问称为“缺页错误”。对于这类错误都会导致中断处理函数MmAccessFault。那么什么样的情况才叫做无效页面呢?主要有下面几种情况: l 所有访问的页面不存内存里,而是磁盘里。 l 访问的页面在后备列表里。 l 访问的页面没有提交写操作。
日期 2023-06-12 10:48:40reactos操作系统实现(8)
通过上面引导程序初始化后,引导程序就把控制权交给 ntoskrnl.exe 运行,在内核里需要进一步初始化,这个过程大体如下: 上面是最基本的流程,在这个过程里,还会调用很多函数来设置各种各样的功能。通过上面的流程,就可以了解引导CP
日期 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操作系统实现(47)
当光盘变成记录数据以后,就开始使用光盘来分发操作系统了。毕竟光盘有着储存数据量大,成本便宜的优势。下面就来分析Reactos是怎么样通过光盘的格式来引导操作系统的。 现今的计算机BIOS,会在开机时根据El Torito规格,查找光盘上的开机代码。若该光盘具有开机代码,则BIOS
日期 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操作系统实现(55)
在语言选择里,倒底做了什么样的事情,让ROS系统可以选择不同的语言?ROS系统又是怎么样实现不同的语言支持的呢? #001 static PAGE_NUMBER #002 LanguagePage(PINPUT_RECORD Ir) #003 { 初始化语言列表。 #004
日期 2023-06-12 10:48:40reactos操作系统实现(62)
当文件拷贝完成后,主要就是把已经拷贝的文件进行注册表登记,还需要把用户在安装过程里选择的配置保存到注册表,同时也需要把检查到的硬件保存到注册表里。其实注册表,就是保存一些配置信息,这样下一次启动时,就可以直接把这些信息加载到内存就行了,不需要用户重新选择
日期 2023-06-12 10:48:40reactos操作系统实现(67)
前面分析安装后,就会调用setup.exe程序运行,在入口函数里处理命令行参数newsetup后,就会调用函数newsetup来运行,下面来仔细地分析这个函数是到底做什么事情。如下: #001 static VOID #002 RunNewSetup (HINSTANCE
日期 2023-06-12 10:48:40reactos操作系统实现(69)
当用户安装系统时,就会出现几个向导界面,这几个向导界面是怎么样实现的呢?具体又是做些什么样的功能呢?它的实现代码如下: #001 VOID #002 InstallWizard(VOID) #003 { #004 PROPSHEETHEADER psh; #005
日期 2023-06-12 10:48:40reactos操作系统实现(73)
即插即用(Plug and Play,PnP)是计算机系统I/O设备与部件配置的应用技术。PnP就是指插入就可以使用,不需要进行任何的硬件配置。其实还是需要安装相应的驱动程序才可以使用的。随着人们对计算机使用多样化,不断地需要添加各种各样的硬件卡到计算机的主板上,这样就需要配置硬件
日期 2023-06-12 10:48:40reactos操作系统实现(32)
这个函数主要功能就是实现访问不存在的页面。 #001 NTSTATUS #002 NTAPI #003 MmNotPresentFault(KPROCESSOR_MODE Mode, #004 ULONG_PTR Address, #005
日期 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操作系统实现(37)
下面来继续分析创建进程函数,过程如下: 保存工作集数据。 #070 /* Save working set data */ #071 MinWs = PsMinimumWorkingSet; #072 MaxWs = PsMaximumWorkingSet; #073
日期 2023-06-12 10:48:40reactos操作系统实现(85)
内核里也需要访问用户应用程序内存,那么有什么方法呢?在ReactOS主要有两种方法:一种是使用缓冲I/O的方法,在驱动程序运行前,I/O管理器把写数据复制到这个缓冲区,并在请求完成时把读数据复制回到用户空间;另一种是使用直接I/O,这是优先
日期 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操作系统实现(99)
下面来分析键盘的中断处理函数的实现,如下: #001 BOOLEAN NTAPI #002 i8042KbdInterruptService( #003 IN PKINTERRUPT Interrupt, #004 PVOID Context) #005 { #006 PI8042
日期 2023-06-12 10:48:40reactos操作系统实现(101)
这里主要来分析ATAPI驱动程序,那么就要先了解ATAPI的相关知识了。 1. AT ATTACHMENT (ATA):ATA接口是个人电脑上最具有实力的存储接口,ATA接口早先被广泛应用于IBM及其兼容机,它被定义为标准的硬盘接口。 2
日期 2023-06-12 10:48:40reactos操作系统实现(102)
ATAPI驱动程序的源码在目录drivers/storage/ide/atapi里,其实ATAPI是一个IDE的小端口驱动程序,主要初始化不同总线上的ATAPI设备,其中最重要的就是从PCI总线里查找到IDE控制器。下面来分析这个驱动程序的入口函数: #001 ULONG #002 NT
日期 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操作系统实现(110)
AtapiStartIo函数主要处理同步的IO请求包。具代的实现代码如下: #001 BOOLEAN #002 NTAPI #003 AtapiStartIo( #004 IN PVOID HwDeviceExtension, #005 IN PSCSI_REQUEST_BLOCK Srb #006
日期 2023-06-12 10:48:40