操作系统专题提供操作系统的最新资讯内容,帮你更好的了解操作系统。
l         FreeLoader 内存布局 0000:0000 - 0000:0FFF:    中断向量表和BIOS数据 0000:1000 - 0000:6FFF:    实模式的栈内存 0000:7000 - 0000:7FFF:    命令行 (multiboot) 0000:8000 - xxxx:xxxx: FreeLoader程序和数据 xxxx:xxxx - 7000:7FF
通过上面引导程序初始化后,引导程序就把控制权交给 ntoskrnl.exe 运行,在内核里需要进一步初始化,这个过程大体如下:   上面是最基本的流程,在这个过程里,还会调用很多函数来设置各种各样的功能。通过上面的流程,就可以了解引导CPU第一个进程,就是IdleLoop进程。
在reactos初始化代码里,经常看到ACPI的缩写,那么它是表示什么意思呢?现在就来解决这个问题,它就是电源管理方面的。具体内容如下: Advanced Configuration and Power Management Interface   ACPI表示高级配置和电源管理接口(Advanced Configuration and Power Management Interface)。对于
看到下面的语句,你能看得懂吗? /* Load the GDT and IDT */     Ke386SetGlobalDescriptorTable(*(PKDESCRIPTOR)&KiGdtDescriptor.Limit); 如果没有去看INTEL的文档,是看不懂的。因为它是跟INTEL的CPU架构密切相关的。现在就去解一下什么叫做全局描述符。先来看看下图的结构: 上面红色的框内就是GDT
中断机制发明以来,就一直成为 CPU 的主导地位通知机制,因为中断的高效方式,没有其它任何的方式可以取代它的。在 IA-32 的 CPU 架构里,采用了中断寄存器和中断描述符来判断中断的来源,如下图所示: 在ReactOS里使用下面这行代码来设置IDTR寄存器的值: Ke386SetInterruptDescriptorTable(*(PKDESCRIPTOR)&KiIdtDescriptor.L
有了上面的知识,就来分析 ReactOS 里引导任务是怎么样设置全局描述符表。其工作过程如下图所示: 由于CPU初始化运行后,就当作为一个任务在运行。这里主要设置这个任务的运行保存环境,以便CPU可以交给其它任务运行,否则切换到其它任务运行后,就再也回不到这个内核任务运行了。这里先取得引导任务KiBootTss,然后设置全局描述符里的内核任务描述符,也就是KGDT_TSS这个,原先缺省都是0值,肯
从 ReactOS 看到下面这行代码: /* Get GDT, IDT, PCR and TSS pointers */     KiGetMachineBootPointers(&Gdt, &Idt, &Pcr, &Tss); 它是代表什么意思呢?实际上是获取全局描述符表、中断描述符表、进程控制块和任务状态段的指针。那么这个函数又是怎么样实现的呢? 先来分析怎么样获取GDT和IDT的指针,它的代
下面来分析一下系统任务是怎么样初始化的,先来看这行代码: /* Setup the TSS descriptors and entries */     Ki386InitializeTss(Tss, Idt, Gdt); 在这个Ki386InitializeTss函数里就是进行初始化系统任务的工作,因此要分析这个函数的代码,才可以理解系统任务的工作。 #001  VOID #002  FASTC
在 ReactOS 里有这么一段初始化代码,如下: #001  AppCpuInit: #002      /* Loop until we can release the freeze lock */ #003      do #004      { #005          /* Loop until execution can continue */ #006          while
下面仔细分析这个函数的代码: #001  /* Switch to new kernel stack and start kernel bootstrapping */ #002      KiSetupStackAndInitializeKernel(&KiInitialProcess.Pcb, #003                                      InitialT
从上面分析可以看到,主要调用函数 KiInitializeKernel 来初始化内核,这个函数传送的参数与函数 KiSetupStackAndInitializeKernel 的参数是一样的,如下: #001  VOID #002  NTAPI #003  KiInitializeKernel(IN PKPROCESS InitProcess, # 004                     
在 X86 的体系架构里,整数运算和浮点运算是分开的。算术逻辑单元 (Arithmetic Logic Unit, ALU) 是中央处理器 (CPU) 的执行单元,是所有中央处理器的核心组成部分,由 " 与门 " 和 " 或门 " 构成的算术逻辑单元,主要功能是进行二进制的算术运算,如加减乘 ( 不包括整数除法 ) 。基本上,在所有现代 CPU 体系结构中,二进制都以二补数的形式来表示。浮点运算器
由于 CPU 是多种多样,具备能力也是不一样的,并且不同厂家都会创新不同的功能。下面就来了解 CPU 特征识别,如下: /* Get the processor features for the CPU */     FeatureBits = KiGetFeatureBits(); 这里是通过函数KiGetFeatureBits来获取CPU特征位,它的代码如下: #001  ULONG #002
下面来了解内核执行体的处理,它是在初始化内核线程后运行的,代码如下: #001   /* Setup the Idle Thread */ #002      KeInitializeThread(InitProcess, #003                         InitThread, #004                         NULL, #005        
 初始化NLS代码表。 #124      /* Initialize the NLS Tables */ #125      RtlInitNlsTables((PVOID)((ULONG_PTR)ExpNlsTableBase + #126                               ExpAnsiCodePageDataOffset), #127               
 从Boot.S文件里初始化系统基本组件后,就跳到空闲函数处理,就成为一个空闲处理的线程,其实也是一个管理系统的任务。下面就来分析KiIdleLoop函数的代码,如下: #001  .globl @KiIdleLoop@0 #002  .func @KiIdleLoop@0, @KiIdleLoop@0 #003  @KiIdleLoop@0: #004    获取KPCR的指针地址,这样就可以方
下面来仔细查看Windows系统结构图:   由于ReactOS是兼容Windows为目标的,那么它的体系结构跟Windows越像,就具有兼容性。这里先来了解Windows的体系结构。最低层是硬件抽象层HAL;接着是内核层,设备驱动程序和文件系统,I/O管理器,文件系统缓存管理器,对象管理器,即插即用管理器,电源管理器,安全监视管理器,虚拟内存管理器,进程和线程管理器,注册表和配置管理器,本地调用
 在很早的电脑里,就带有一个小喇叭,可以发出不同频率的声音。主要用来判断系统是否有问题使用,比如BIOS检查硬有问题时,就会发出不同的声音,提醒用户是那里出问题了。在操作系统里,也经常使用这个小喇叭来提醒用户是什么问题,比如输入非法的按键时,就响一声。在早期的五笔输入法时,输入的字不对,就会用这个小喇叭提醒,让忘打的操作人员回到屏幕上选择所需要的字。那么这个小喇叭的驱动是怎么样进行的呢?这里就来研
 在操作系统里,有时候需要从保护模式转换为实模式来调用BIOS一些功能。因此在硬件抽象层里,就需要提供这样的函数支持,这个函数代码如下: #001  BOOLEAN #002  NTAPI #003  HalpBiosDisplayReset(VOID) #004  { #005      ULONG Flags = 0; #006    保存CPU所有状态寄存器,然后关闭中断。 #007    
 在ReactOS内存管理里,有一块内存区是非分页内存,也就是这块内存始终保持在系统物理内存里面,不会换到磁盘上。那为什么需要这样做呢?全部使用分页内存不是更简单,更方便吗?肯定不行的,因为IA86的内存管理就决定它不能这样做了,当CPU缺页中断时,就需要操作系统把分页内存换到磁盘上,再把加载数据从磁盘读取回来。如果操作系统使用的内存都是分页内存,那么操作系统就没有办法运行了,因为所需要运行的代码