获取物理内存容量

1.linux获取物理内存的方法

0xE820 方法1
总共有三种,我们只需要了解一种,因为它一般不会出错

2.注意

实际物理内存 和 检测出来的结果 之间总是相差1MB的,原因是因为有些老的ISA设备要用到地址15MB以上的内存作为缓冲区,也就是说此缓冲区的大小为1MB,操作系统不可以访问这段内存

3.代码

Total_Memory_Bytes dd 0 ;以字节形式表示的内存大小 存放在此处


MemoryBuf times 244 db 0 ; 获取到的全部的信息 存放在此处
ARDS_Count dw 0			;获取到了几个ARDS结构


;/*******Loader_Start***********/

; /*******int 0x15 EAX=0x0000E820 ***/
Loader_Start:

MOV EBX, 0x0				;ARDS的后续值 第一次必须为0
MOV EDX, 0x534d4150 		; 固定的签名标记
MOV DI,  MemoryBuf			;ES:DI 的地址 存放获取到的信息

.E820_MemGetLoop:  			;方法1的循环
	
	MOV EAX, 0x0000E820 	; 功能号
	MOV ECX, 0x14			; 指定ARDS结构体的大小
	INT 0x15				;执行中断

	JC .E820_Fail_Try_E801	;若C位为1 用另外一种方式去读取
			      			;若读取成功	
	Add DI, 0x14;			;偏移到下一个保存ARDS结构的位置
	INC word [ARDS_Count] 	;ARDS的个数++
	CMP EBX, 0		; EBX = 0 表示全部的读取 结束了
	JNZ .E820_MemGetLoop	; 没结束 继续读取

	;下面就是全部读取完成 判断出最大的那个内存
	MOV CX, [ARDS_Count]	;
	MOV EBX, MemoryBuf	 
	MOV EDX, 0x0			;EDX 保存最大的那个内存 先清0 

.Find_Max_Memory:

	MOV EAX, [EBX]		;BaseAddLow + LengthLow 
	ADD EAX, [EBX+8]
	CMP EDX, EAX		; 比较前一次的最大值 和 这次的
	
	JGE .Next_ARDS
	MOV EDX, EAX		;EDX 保存了 Total Memory	


.Next_ARDS:
	ADD EBX, 0x14		;继续判断下一个
	LOOP .Find_Max_Memory
	JMP .Memory_Get_OK 		;比较完成了 跳转到OK
;/*******************************/


;/**********INT15 AX= 0xe801****/
		
.E820_Fail_Try_E801:
	MOV AX, 0xe801
	INT 0x15
	JC .E801_Fail_Try_88		;fail

	;LOW 15MB
	MOV CX, 0x400			;1KB 
	MUL CX				;AX *= CX   高16位在DX中 低16位在AX中
	SHL  EDX, 16			;*result High 16
	AND EAX, 0x0000FFFF
	OR EDX, EAX
	ADD EDX, 0x10000		;+1MB
	MOV ESI, EDX				


	;MoreThan 16MB
	MOV EAX, 0x0
	MOV AX, BX
	MOV ECX, 0x10000		;64kb
	MUL ECX
	MOV EDX, ESI	

	JMP .Memory_Get_OK


;/****************************/


;/***********INT15 AX = 0x88**/
.E801_Fail_Try_88:

	MOV AH, 0x88
	INT 0x15
	JC .Error_HLT			;Error 

	AND EAX, 0x0000FFFF
	MOV CX, 0x400			;1kb
	MUL CX
	SHL EDX, 16			;result high 16
	OR  EDX, EAX
	ADD EDX, 0x10000		;1MB


;/****************************/
.Memory_Get_OK:
	MOV [Total_Memory_Bytes], EDX



.Error_HLT:
	HLT

4.获取到的内存的大小

在这里插入图片描述
可以看到获取到的内存的大小是32MB,和我们配置的环境一模一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用VMware Fusion时,出现物理内存不足的问题可以采取以下解决方案: 1. 调整虚拟机内存分配:根据引用,可以尝试降低虚拟机内存的分配。可以在VMware Fusion中打开编辑选项,然后选择首选项,进入内存选项,将内存调整至较低的值。 2. 结束内存占用程序:如果虚拟机运行时遇到物理内存不足的问题,可以关闭一些占用内存的程序或进程,以释放更多的内存给虚拟机使用。 3. 提高电脑内存配置:如果上述方法无法解决问题,可以考虑升级电脑的内存配置。增加电脑内存容量可以提供更多的可用内存给虚拟机使用。 另外,根据引用,您还可以尝试在VMware官网下载最新版的VMware Fusion软件,并获取免费许可证。这可能会解决一些与软件版本和兼容性相关的问题。 总结来说,解决VMware Fusion物理内存不足的问题可以通过调整虚拟机内存分配、结束内存占用程序和提高电脑内存配置来实现。此外,确保您正在使用最新版本的VMware Fusion软件也是一种解决方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [VMware Workstation物理内存不足,无法使用配置的设置开启虚拟机。](https://blog.csdn.net/T_Y_F_/article/details/127503275)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [VMware Fusion(虚拟机)免费下载正版授权(Mac升级到Big Sur后旧版VM显示物理内存不足)](https://blog.csdn.net/qq_34497272/article/details/116837513)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值