SylixOS free命令实现过程

  1. SylixOS free 命令
    在 SylixOS 系统下敲下 free 命令,会出现如下如图 1.1 所示:

图 1.1 启核操作大致流程
1) kersys :显示的是内核堆信息
2) vmm physical zone show :zone 1和zone 2 映射信息,分别显示映射的起始地址、所占内存大小、虚拟页大小、PGD表项入口、空闲页面个数、页面属性;
3) ALL-Physical memory size :整个系统可用的实际物理内存上的大小。
4) VMM-Physical memory size:所有zone映射的物理内存大小即为上述(VMM size 之和) 十六进制(8000000+30100000);
5) VMM-Physical memory free:空闲页面大小((30796+196864)<< 12)/(1024*1024);

  1. free 命令实现
    free 命令是SylixOS系统下的一条shell 命令,在SylixOS下它的实现遵循SylixOS shell实现规则,具体实现如下:
    (1) 使用API_TShellKeywordAdd("free", tshellSysCmdFree) 增加系统下free 命令,当敲入 free 时,调用 tshellSysCmdFree 函数。
    (2) 在 tshellSysCmdFree 函数中分别调用 API_RegionShow(0)、 API_VmmPhysicalShow()。
    (3) API_RegionShow(LW_OBJECT_HANDLE ulId)显示指定内存池信息,当为0 时表示显示内存堆和系统堆信息;调用 API_KernelHeapInfo(ULONG ulOption,…..)函数,当为内核堆时显示内核堆的信息,当有系统堆时,显示系统堆信息。
    ulOption 可以为以下两个值:
    LW_OPTION_HEAP_KERNEL
    LW_OPTION_HEAP_SYSTEM
    (4) API_KernelHeapInfo(ULONG ulOption,…..) 函数将内核中的内存堆和系统堆全局缓冲区 _K_pheapKernel、_K_pheapSystem变量对形参进行赋值;
    (5) API_VmmPhysicalShow()用来显示物理存储器信息;分别调用API_VmmZoneStatus和API_VmmPhysicalKernelDesc 分别显示zone和物理内存信息;
    (6) API_VmmZoneStatus()显示zone 的情况,通过物理zone控制块数组_G_vmzonePhysical全局变量的值获取相关数据信息;
    (7) API_VmmPhysicalKernelDesc()函数获取物理内存内核的TEXT 、DATA段;
    API_VmmPhysicalKernelDesc 调用__vmmPhysicalGetKernelDesc()获得物理内存内核 TEXT 和DATA段,通过全局物理内存结构体_G_vmphydescKernel 赋值;
    (8) API_VmmPhysicalShow()用来显示物理存储器信息;分别调用API_VmmZoneStatus和API_VmmPhysicalKernelDesc分别显示zone和物理内存信息;
    (9) _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 启核操作大致流程
(10) _G_vmzonePhysical、_G_vmphydescKernel 由vmmPhysicalCreate()函数赋值,vmmPhysicalCreate创建一个物理分页区域由API_VmmLibPrimaryInit调用,在bsp 下API_VmmLibPrimaryInit 对bspMap.h 分好的区域进行初始操作。BspMap.h对整个内存进行了划分。

上一篇:SylixOS内存空间映射关系


下一篇:GCP消息队列Pubsub详解,简单好用还不用自己运维