现在就来分析第一阶段的进程管理器初始化函数PspInitPhase0,如下:
#001 BOOLEAN
#002 NTAPI
#003 PspInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
#004 {
#005 NTSTATUS Status;
#006 OBJECT_ATTRIBUTES ObjectAttributes;
#007 HANDLE SysThreadHandle;
#008 PETHREAD SysThread;
#009 MM_SYSTEMSIZE SystemSize;
#010 UNICODE_STRING Name;
#011 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
#012 ULONG i;
#013
获取系统物理内存的大小。
#014 /* Get the system size */
#015 SystemSize = MmQuerySystemSize();
#016
下面根据内存大小来做进程管理器进程个数设置。
#017 /* Setup some memory options */
#018 PspDefaultPagefileLimit = -1;
#019 switch (SystemSize)
#020 {
中等规模系统内存。
#021 /* Medimum systems */
#022 case MmMediumSystem:
#023
#024 /* Increase the WS sizes a bit */
#025 PsMinimumWorkingSet += 10;
#026 PsMaximumWorkingSet += 100;
#027
大规模系统内存。
#028 /* Large systems */
#029 case MmLargeSystem:
#030
#031 /* Increase the WS sizes a bit more */
#032 PsMinimumWorkingSet += 30;
#033 PsMaximumWorkingSet += 300;
#034
最小的,就使用默认参数。
#035 /* Small and other systems */
#036 default:
#037 break;
#038 }
通过上面这段代码,就可以看到Reactos会根据内存大小来选择不同的进程个数,以便达到优化系统性能。在一个内存过少的设备里,是不可能创建很多并发进程的。
#039
#040 /* Setup callbacks */
#041 for (i = 0; i < PSP_MAX_CREATE_THREAD_NOTIFY; i++)
#042 {
#043 ExInitializeCallBack(&PspThreadNotifyRoutine[i]);
#044 }
#045 for (i = 0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++)
#046 {
#047 ExInitializeCallBack(&PspProcessNotifyRoutine[i]);
#048 }
#049 for (i = 0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; i++)
#050 {
#051 ExInitializeCallBack(&PspLoadImageNotifyRoutine[i]);
#052 }
#053
设置进程调度表。比如进程是多长时间就轮转一次,还是实时地运行一个线程。
#054 /* Setup the quantum table */
#055 PsChangeQuantumTable(FALSE,PsRawPrioritySeparation);
#056
#057 /* Set quota settings */
#058 if (!PspDefaultPagedLimit) PspDefaultPagedLimit = 0;
#059 if (!PspDefaultNonPagedLimit) PspDefaultNonPagedLimit = 0;
#060 if (!(PspDefaultNonPagedLimit) && !(PspDefaultPagedLimit))
#061 {
#062 /* Enable give-backs */
#063 PspDoingGiveBacks = TRUE;
#064 }
#065 else
#066 {
#067 /* Disable them */
#068 PspDoingGiveBacks = FALSE;
#069 }
#070
现在只能分配1MB内存页面。
#071 /* Now multiply limits by 1MB */
#072 PspDefaultPagedLimit <<= 20;
#073 PspDefaultNonPagedLimit <<= 20;
#074 if (PspDefaultPagefileLimit != -1U) PspDefaultPagefileLimit <<= 20;
#075