zl程序教程

reactos操作系统实现(1)

  • reactos操作系统实现(16)

    reactos操作系统实现(16)

    下面仔细分析这个函数的代码: #001  /* Switch to new kernel stack and start kernel bootstrapping */ #002      KiSetupStackAndInitializeKernel(&KiInitialProcess.Pcb, #003   

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(20)

    reactos操作系统实现(20)

    下面来了解内核执行体的处理,它是在初始化内核线程后运行的,代码如下: #001   /* Setup the Idle Thread */ #002      KeInitializeThread(InitProcess, #003                         InitTh

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(24)

    reactos操作系统实现(24)

     在很早的电脑里,就带有一个小喇叭,可以发出不同频率的声音。主要用来判断系统是否有问题使用,比如BIOS检查硬有问题时,就会发出不同的声音,提醒用户是那里出问题了。在操作系统里,也经常使用这个小喇叭来提醒用户是什么问题,比如输入非法的按键时,就响

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(26)

    reactos操作系统实现(26)

     在ReactOS内存管理里,有一块内存区是非分页内存,也就是这块内存始终保持在系统物理内存里面,不会换到磁盘上。那为什么需要这样做呢?全部使用分页内存不是更简单,更方便吗?肯定不行的,因为IA86的内存管理就决定它不能这样做了,当CPU缺页中断

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(29)

    reactos操作系统实现(29)

     内存大小好像永远追不上人们的需求,以前以为512K就很大了,到现在内存已经是4G,8G内存了,但还是不能满足人们的需求。因为目前的系统都是多进程运行,每个进程都需要占用4G的内存,那么10个进程,就占用相当可观的内存了。这时就需要把进程不经常使用的内存数据切

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(11)

    reactos操作系统实现(11)

    中断机制发明以来,就一直成为 CPU 的主导地位通知机制,因为中断的高效方式,没有其它任何的方式可以取代它的。在 IA-32 的 CPU 架构里,采用了中断寄存器和中断描述符来判断中断的来源,如下图所示: 在ReactOS里使用

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(12)

    reactos操作系统实现(12)

    有了上面的知识,就来分析 ReactOS 里引导任务是怎么样设置全局描述符表。其工作过程如下图所示: 由于CPU初始化运行后,就当作为一个任务在运行。这里主要设置这个任务的运行保存环境,以便CPU可以交给其它任务运行,否则切换到其它任务运行后,就再也回不到

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(15)

    reactos操作系统实现(15)

    在 ReactOS 里有这么一段初始化代码,如下: #001  AppCpuInit: #002      /* Loop until we can release the freeze lock */ #003      do #004      { #005          /

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(46)

    reactos操作系统实现(46)

    在线程调度里可以看到,需要调用函数KiSwapContext来进行运行环境切换,由于每个CPU都是只能运行一个线程,而多个线程在运行过程中被中断了,那么就需要保存CPU所有寄存器,以便下一次恢复线程时可以接续运行。现在就来分析这个函数是怎么样实现这些工作的,代码如下&

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(63)

    reactos操作系统实现(63)

      前面把注册表初始化完成之后,就开始进行安装引导程序了。这里安装的引导程序是分区引导程序,或者安装到软盘引导程序。当然也可以选择跳过不安装它,界面如下:     这个函数的代码如下: #001  static PAGE_NUMBER #002  BootLoaderPage

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(69)

    reactos操作系统实现(69)

    当用户安装系统时,就会出现几个向导界面,这几个向导界面是怎么样实现的呢?具体又是做些什么样的功能呢?它的实现代码如下: #001  VOID #002  InstallWizard(VOID) #003  { #004    PROPSHEETHEADER psh; #005 

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(71)

    reactos操作系统实现(71)

    I/O管理器是管理着整个计算机的输入和输出的操作,因此它是一个基本的组成部份。I/O管理器的初始化调用是在文件reactos/ntoskrnl/ex/init.c里,它主要调用I/O管理器的函数IoInitSystem()来实现,这个函数在文件reactos/ntoskrnl/io/iomgr/iomgr.c

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(76)

    reactos操作系统实现(76)

    当键盘类驱动程序或鼠标类驱动程序枚举时,会找到很多设备,这些设备需要使用回调的方式来进行初始化。下面的函数,就是实现回调初始化驱动程序,如下: #001  VOID #002  NTAPI #003  IopReinitializeBootDrivers(VOID) #00

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(77)

    reactos操作系统实现(77)

    因为PC里一条总线上可以连接很多设备,就像一棵树一样,需要遍历所有总线上所有子设备,并且为每一个子设备安装相应的驱动程序,下面这个函数,实现枚举所有子设备,实现代码如下: #001  NTSTATUS #002  IopEnumerateDevice

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(84)

    reactos操作系统实现(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:40     
  • reactos操作系统实现(87)

    reactos操作系统实现(87)

    应用程序对设备I/O进行Win32调用,这个调用由I/O系统服务接收,然后I/O管理器从这个请求构造一个合适的I/O请求包(IRP)。那么I/O管理器是怎么样创建这个I/O请求包(IRP)的呢?又是怎么样传送给驱动程序的呢?我们带着这两个问

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(88)

    reactos操作系统实现(88)

    IRP 是 I/O request packet 的缩写,即 I/O 请求包。驱动与驱动之间通过 IRP 进行通信。而使用驱动的应用层调用的 CreatFile,ReadFile,WriteFile,DeviceIoControl 等函数,说到底也是使用 IRP 和驱动进行通信。 一个 IRP 由两部分组成。首先是头部或

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(98)

    reactos操作系统实现(98)

      通过上面的分析,发现设置一个中断处理是非常复杂的,下面就来通过图来分析一个中断发生时,中断处理的过程如下图:     其实所有上面代码,就是设置这些流程里工作的函数关键代码,以便整个中断连接起来。其中一些函数是在汇编代码里面,这些都需要仔细分析才能

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(91)

    reactos操作系统实现(91)

    驱动程序很多配置参数是保存在注册表里,比如IO资源参数,中断号等内容。因此只有了解注册表的读取,以及相关内容才可以清楚知道键盘驱动程序,主要操作那些相关的端口,还有配置参数。下面来分析函数ReadRegistryEntries的实现,如下: #001 

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(92)

    reactos操作系统实现(92)

    在DirverEntry函数,可以看到下面这句: #054     DriverObject->DriverExtension->AddDevice = i8042AddDevice; 这里是设置了驱动程序的AddDevice函数指针,它是指向函数i8042AddDevice。PnP管

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(95)

    reactos操作系统实现(95)

    在PNP管理器里,最重要的处理,就是即插即用消息。下面来分析键盘的即插即用消息处理函数,实现的代码如下: #001  NTSTATUS NTAPI #002  i8042Pnp( #003     IN PDEVICE_OBJECT DeviceObject, #004     IN P

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(112)

    reactos操作系统实现(112)

    IdeReadWrite函数主要实现了IDE设备的读和写命令发送。具体实现函数如下: #001  ULONG #002  NTAPI #003  IdeReadWrite( #004      IN PVOID HwDeviceExtension, #005      IN PSCSI_REQUEST_BLOCK Srb #

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(126)

    reactos操作系统实现(126)

     VfatCreateFile函数主要用来创建或者打开一个文件,具体实现如下: #001  static NTSTATUS #002  VfatCreateFile ( PDEVICE_OBJECT DeviceObject, PIRP Irp ) #003  /* #004   * FUNCTION: Create o

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(119)

    reactos操作系统实现(119)

     前介绍了初始化函数ScsiClassInitialize,那么在这个函数里使用下面的语句来查找SCSI的磁盘,如下: if (InitializationData->ClassFindDevices(DriverObject, Argument2, InitializationData,portDevic

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(120)

    reactos操作系统实现(120)

     CreateDiskDeviceObject函数主要就是为了物理设备创建磁盘对象,并且查找磁盘上每个分区和创建相应的对象。具体实现代码如下: #001  NTSTATUS #002  NTAPI #003  CreateDiskDeviceObject( #004      IN PDRIVER_OBJECT Driv

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(129)

    reactos操作系统实现(129)

     功能驱动将构造请求包,就可以发送到底层总线驱动上。因此需要创建一个IRP,这就需要用IoBuildDeviceIoControlRequest创建一个IO控制码的IRP,用IoCallDriver将URB发送到底层总线驱动上。由于上层驱动无法知道底层驱动是同步还是异步完成的,因此需要做一个判断。if

    日期 2023-06-12 10:48:40     
  •  reactos操作系统实现(134)

    reactos操作系统实现(134)

     文件控制块主要用来表示一个ReactOS打开文件的对象。下面就来仔细地分析文件控制块的结构,如下: #001  typedef struct _VFATFCB #002  {   ROS的文件头部,主要包括文件流的描述和系统使用的变量。 #003    /* FCB header required by

    日期 2023-06-12 10:48:40     
  •  reactos操作系统实现(184)

    reactos操作系统实现(184)

    GreExtTextOutW函数实现一串字符串输出到指定区域,当然是从字符串变成图片输出。这些都调用FreeType库来实现的,具体实现代码如下: #001  BOOL #002  APIENTRY #003  GreExtTextOutW( #004      IN HDC hDC, #005  

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(143)

    reactos操作系统实现(143)

     VgaIsPresent函数通过读取图形模式的索引寄存器和数据寄存器来检查VGA显示卡是否安装,实现代码如下: #001  BOOLEAN #002  NTAPI #003  VgaIsPresent(VOID) #004  { #005      UCHAR VgaReg, VgaReg2, VgaReg3; #

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(146)

    reactos操作系统实现(146)

     Reactos的显示组成主要由GDI、视频端口驱动程序、小端口驱动程序和显示驱动程序组成。当GDI系统接到应用程序请求后,就会查找相应的小端口驱动程序,接着小端口驱动程序,就会设置视频端口驱动程序和显示驱动程序。在GDI和小端口驱动程序调用流程如下图所示:

    日期 2023-06-12 10:48:40     
  • reactos操作系统实现(149)

    reactos操作系统实现(149)

    IntVideoPortFindAdapter函数主要用来查找到相应显示卡,并且把显示卡驱动安装到对象管理器里,以便GUI界面调用时,可以找到相应驱动程序显示。具体实现代码如下: #001  NTSTATUS NTAPI #002  IntVideoPortFindAdapter( #00

    日期 2023-06-12 10:48:40