- SylixOS free 命令
在 SylixOS 系统下敲下 free 命令,会出现如下如图 1.1 所示:
图 1.1 启核操作大致流程
- kersys :显示的是内核堆信息
- vmm physical zone show :zone 1和zone 2 映射信息,分别显示映射的起始地址、所占内存大小、虚拟页大小、PGD表项入口、空闲页面个数、页面属性;
- ALL-Physical memory size :整个系统可用的实际物理内存上的大小。
- VMM-Physical memory size:所有zone映射的物理内存大小即为上述(VMM size 之和) 十六进制(8000000+30100000);
- VMM-Physical memory free:空闲页面大小((30796+196864)<< 12)/(1024*1024);
- free 命令实现
free 命令是SylixOS系统下的一条shell 命令,在SylixOS下它的实现遵循SylixOS shell实现规则,具体实现如下:
- 使用API_TShellKeywordAdd("free", __tshellSysCmdFree) 增加系统下free 命令,当敲入 free 时,调用 tshellSysCmdFree 函数。
- 在 tshellSysCmdFree 函数中分别调用 API_RegionShow(0)、 API_VmmPhysicalShow()。
- API_RegionShow(LW_OBJECT_HANDLE ulId)显示指定内存池信息,当为0 时表示显示内存堆和系统堆信息;调用 API_KernelHeapInfo(ULONG ulOption,…..)函数,当为内核堆时显示内核堆的信息,当有系统堆时,显示系统堆信息。
ulOption 可以为以下两个值:
LW_OPTION_HEAP_KERNEL
LW_OPTION_HEAP_SYSTEM
- API_KernelHeapInfo(ULONG ulOption,…..) 函数将内核中的内存堆和系统堆全局缓冲区 _K_pheapKernel、_K_pheapSystem变量对形参进行赋值;
- API_VmmPhysicalShow()用来显示物理存储器信息;分别调用API_VmmZoneStatus和API_VmmPhysicalKernelDesc 分别显示zone和物理内存信息;
- API_VmmZoneStatus()显示zone 的情况,通过物理zone控制块数组_G_vmzonePhysical全局变量的值获取相关数据信息;
- API_VmmPhysicalKernelDesc()函数获取物理内存内核的TEXT 、DATA段;
API_VmmPhysicalKernelDesc 调用__vmmPhysicalGetKernelDesc()获得物理内存内核 TEXT 和DATA段,通过全局物理内存结构体_G_vmphydescKernel 赋值;
- API_VmmPhysicalShow()用来显示物理存储器信息;分别调用API_VmmZoneStatus和API_VmmPhysicalKernelDesc分别显示zone和物理内存信息;
- _K_pheapKernel由_HeapKernelInit()内核堆内存函数对其赋值, _K_pheapSystem由_HeapSystemInit()系统堆内存函数对其赋值,HeapKernelInit 、HeapSystemInit 由函数 _KernelPrimaryLowLevelInit()调用,KernelPrimaryLowLevelInit 由API_KernelPrimaryStart()函数调用,API_KernelPrimaryStart由API_KernelStart()函数调用,分别由 __heap_start、__heap_end,由文件SylixOSBSP.ld实现,具体可以看https://blog.csdn.net/automan12138/article/details/77478315 博客,如图 2.1 所示;
图 2.1 启核操作大致流程
- _G_vmzonePhysical、_G_vmphydescKernel 由__vmmPhysicalCreate()函数赋值,__vmmPhysicalCreate创建一个物理分页区域由API_VmmLibPrimaryInit调用,在bsp 下API_VmmLibPrimaryInit 对bspMap.h 分好的区域进行初始操作。BspMap.h对整个内存进行了划分。