chapt14、探索虚拟内存

本文详细解析了Windows系统中内存管理和进程虚拟地址空间的原理,包括获取系统信息、虚拟内存状态检测以及虚拟内存状态的种类与含义。
探索windows的内存管理和进程的虚拟地址空间

获取系统信息--System Info
VOID GetSystemInfo(LPSYSTEM_INFO psinf);
typedef struct _SYSTEM_INFO {
   union {
      DWORD dwOemId;   // Obsolete, do not use
      struct {
         WORD wProcessorArchitecture;
         WORD wReserved;
      };
   };
   DWORD     dwPageSize; // 页面大小
   LPVOID    lpMinimumApplicationAddress; // 最小可用地址
   LPVOID    lpMaximumApplicationAddress; // 最大可用地址
   DWORD_PTR dwActiveProcessorMask;
   DWORD     dwNumberOfProcessors; // 处理器个数
   DWORD     dwProcessorType;
   DWORD     dwAllocationGranularity; // CPU内存分配粒度
   WORD      wProcessorLevel;
   WORD      wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;

虚拟内存状态--Virtual Memory Status
VOID GlobalMemoryStatus(LPMEMORYSTATUS pmst);
typedef struct _MEMORYSTATUS {
   DWORD dwLength; // 结构体大小
   DWORD dwMemoryLoad; // 内存使用率
   SIZE_T dwTotalPhys; // RAM大小
   SIZE_T dwAvailPhys; // 可用RAM
   SIZE_T dwTotalPageFile; // PageFile大小
   SIZE_T dwAvailPageFile; // 可用PageFile大小
   SIZE_T dwTotalVirtual; // 总地址空间
   SIZE_T dwAvailVirtual; // 可用地址空间
} MEMORYSTATUS, *LPMEMORYSTATUS;


检测某地址的状态--Determining the State of an Address Space
VirtualAlloc VirtualQuery MEMORY_BASIC_INFORMATION

VirtualAlloc:虚拟内存保留和申请。
VirtualQuery:查询虚拟内存信息
MEMORY_BASIC_INFORMATION:内存基本信息结构体
在32位操作系统里,一个进程有4GB的地址空间,但应用程序一般只用2GB,高位的2GB被系统内核占用了。
虚拟内存一般有3种状态:就是MEMORY_BASIC_INFORMATION的State表示的状态
MEM_COMMIT:提交状态,表示已经占用物理存储的pages(占用了内存或硬盘文件)
MEM_FREE:自由状态,进程不可访问但是可用VirtualAlloc分配
MEM_RESERVE:保留状态,地址空间保留但没有物理存储空间对应,VirtuallAlloc不能分配了,但是可以提交。
而处于COMMIT状态的,一般又分3种
MEM_IMAGE:镜像,这些pages对应了可执行文件(一般就是dll,exe)。
MEM_MAPPED:映射,这些pages对应了其他文件(如map了的文件)
MEM_PRIVATE:私有,这个pages是私有的,不被其他进程共享。相应的,有些shared的,这个信息可以通过QueryWorkingSet获取

// 获取一系列pages的信息
SIZE_T WINAPI VirtualQuery(
  _In_opt_  LPCVOID lpAddress,
  _Out_     PMEMORY_BASIC_INFORMATION lpBuffer,
  _In_      SIZE_T dwLength
);
说明:WirtualQuery返回一系列连续pages的基本信息,这些pages起始于同一个地址并具有如下共同的属性:
-这些pages的状态一致(MEM_COMMIT, MEM_RESERVE, MEM_FREE, MEM_PRIVATE, MEM_MAPPED, or MEM_IMAGE).
-如果其实page不是MEM_FREE的,则所有的pages都属于同一次系统调用,如:VirtualAlloc, MapViewOfFile等。即它们具有相同的AllocationBase
-这些pages的访问属性相同(PAGE_READONLY, PAGE_READWRITE, PAGE_NOACCESS, PAGE_WRITECOPY, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY, PAGE_GUARD, or PAGE_NOCACHE).
一次系统调用申请的空间即具有同一个AllocationBase的空间,可能由若干个符合以上特性的region组成。
在《Windows核心编程》第四版里,把这样的一个region称作一个Block,若干具有同一个AllocationBase的blocks被称作一个Region。

typedef struct _MEMORY_BASIC_INFORMATION {
  PVOID  BaseAddress;
  PVOID  AllocationBase;
  DWORD  AllocationProtect;
  SIZE_T RegionSize;
  DWORD  State;
  DWORD  Protect;
  DWORD  Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
BaseAddress:调用VirtualQuery时所传入的address对于pages大小向下取整,是page size的倍数。
AllocationBase:调用VirtualAlloc是所分配的基础地址。
AllocationProtect:刚分配时所具有的保护属性。
RegionSize:以BaseAddress为起始地址的区域大小。
State:区域内pages的状态,MEM_COMMIT、MEM_FREE、MEM_RESERVE
Protect:区域内pages的访问属性,取值范围同AllocationProtect
Type:区域内pages的物理存储类型,MEM_IMAGE、MEM_MAPPED、MEM_PRIVATE。

<think>好的,用户的问题是关于如何在网页中集成和使用chAPT框架或库。首先,我需要确认chAPT是什么,但根据提供的引用内容,似乎并没有直接提到chAPT的信息。这可能是一个拼写错误,或者用户指的是某个特定的库或框架,比如可能是指ChatGPT相关的工具?结合用户提到的“网页中集成”,以及引用[3]提到的国产工具支持联网搜索、文档上传、智能体等功能,可能用户想了解如何集成类似ChatGPT的AI功能到网页中。 接下来,我需要考虑用户可能的实际需求。用户可能希望在自己的网站或应用中添加智能聊天功能,或者利用自然语言处理的能力。根据引用[2],提到了OpenAI的官方文档和Prompt学习资源,这可能暗示用户希望使用OpenAI的API来实现这一点。 因此,回答应该围绕如何通过OpenAI的API在网页中集成AI功能,比如使用JavaScript调用API,处理前后端的交互,以及安全性的考虑。同时需要提醒用户注意API密钥的保护,避免暴露在前端代码中。此外,可以提到一些现有的国产工具,如引用[3]中的那些,可能提供更便捷的集成方式,适合小白用户。 需要确保回答结构清晰,分步骤说明,同时提供示例代码和注意事项。可能还需要生成相关问题,帮助用户进一步了解优化方法、应用场景或安全措施。</think>### 如何在网页中集成和使用 chAPT 框架或库 根据问题描述,推测您可能希望集成类似**ChatGPT的AI功能**或**自然语言处理工具**到网页中。以下是分步骤实现方法(以OpenAI API为例,其他国产工具可参考类似逻辑): --- #### **步骤1:选择AI服务提供商** - **OpenAI API**:提供文本生成、对话等功能,需注册账号并获取API密钥[^2]。 - **国产工具**(如文心一言、通义千问):部分支持直接嵌入网页,提供SDK或API接口[^3]。 --- #### **步骤2:前端与后端交互设计** 1. **前端界面**:创建输入框和展示区域(HTML+CSS) ```html <div id="chat-container"> <div id="chat-history"></div> <input type="text" id="user-input" placeholder="输入问题..."> <button onclick="sendMessage()">发送</button> </div> ``` 2. **后端代理**(避免前端暴露API密钥) ```javascript // 示例:Node.js Express 代理 app.post('/api/chat', async (req, res) => { const response = await fetch('https://api.openai.com/v1/chat/completions', { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: "gpt-3.5-turbo", messages: [{role: "user
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值