【1】README

  • 1.1) 本代码在于读取内存中多个 内存段的地址范围描述符结构体(ARDS),有多少个内存段可以用;
  • 1.2) source code and images in the blog from orange’s implemention of a os
  • 1.3) the comments towards code are built by myself , which proves to be a key point ,in my opinion.
  • 1.4) for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/p75.asm
  • Other)要知道,os 必须要知道内存的内容,以便进行内存管理。

【2】source code

  • 2.1)得到内存数

    ; 得到内存数 begin mov    ebx, 0mov    di, _MemChkBuf ; _MemChkBuf: times  256 db  0, 缓冲区
    .loop:mov    eax, 0E820hmov    ecx, 20mov    edx, 0534D4150hint    15h ; 每次中断,都把内存数据(不同内存段的描述和大小) copy 到 缓冲区_MemChkBuf中,jc LABEL_MEM_CHK_FAIL ; jump if carry(CF=1), cf=0表示读取内存信息没有错误add    di, 20  ; es:di 指向一个地址范围描述符结构 ARDSinc    dword [_dwMCRNumber]; _dwMCRNumber: dd  0   ; Memory Check Resultcmp    ebx, 0  ; ebx 存储着下一个地址描述符所需要的后续值;jne    .loopjmp    LABEL_MEM_CHK_OK
    LABEL_MEM_CHK_FAIL:mov    dword [_dwMCRNumber], 0
    LABEL_MEM_CHK_OK:; 得到内存数 over
    
  • 代码步骤

    • step1)每次中断,都把不同内存段的 地址范围描述符结构体 copy 到 缓冲区_MemChkBuf中(连续地址),而缓冲区有256Bytes,而结构体有20B,所以只能copy 12个 结构体;copy完后,以便进行数据分析;
    • step2)如果内存段的 ARDS 没有读取出错的话,那么就将 内存数变量_dwMCRNumber 自加1 ;
  • Conclusion:(干货)
    每次中断,都把不同内存段的 地址范围描述符结构体 copy 到 缓冲区_MemChkBuf中,显然,整个内存是分为多个内存段的,然后内存段是由地址范围描述符结构体(ARDS)来描述的。

    (由图知:ARDS的size=20Bytes)

  • 2.2)读取内存数据并显示

    ; call  DispMemSize; 由保护模式的 显示内存信息 跳转到这里
    DispMemSize:push   esipush   edipush   ecx
    ; _MemChkBuf: times 256 db  0
    ; MemChkBuf equ _MemChkBuf  - $$; $$ == LABEL_DATAmov    esi, MemChkBuf ; 他就是 存放内存描述符结构体 的 缓冲区,共256个字节,每个结构体=20字节,所以最多存放12个结构体
    ; _ARDStruct:    ; Address Range Descriptor Structure 地址范围描述符结构体
    ;   _dwBaseAddrLow:  dd 0 基地址低32位
    ;   _dwBaseAddrHigh:    dd  0 基地址高32位
    ;   _dwLengthLow:    dd 0 长度的低32位
    ;   _dwLengthHigh:   dd 0 长度的高32位
    ;   _dwType:     dd 0 这个地址范围的地址类型mov    ecx, [dwMCRNumber]; 外循环 for(int i=0;i<[MCRNumber];i++)//每次得到一个ARDS , line_113已经得到其内存数了,cur_line_328,
    .loop:    ;{ loop 的循环数 == ecx ,上行代码已经赋值mov    edx, 5    ;  内循环 for(int j=0;j<5;j++) //每次得到一个ARDS中的成员; ARDStruct  equ    _ARDStruct  - $$; dwBaseAddrLow   equ    _dwBaseAddrLow  - $$
    ; dwBaseAddrHigh     equ    _dwBaseAddrHigh - $$; dwLengthLow    equ    _dwLengthLow    - $$
    ; dwLengthHigh   equ    _dwLengthHigh   - $$; dwType     equ    _dwType  - $$mov    edi, ARDStruct    ;  {//依次显示BaseAddrLow,BaseAddrHigh,LengthLow,
    .1:   ;             LengthHigh,Typepush   dword [esi]   ; cur_line_343, line_318 mov  esi, MemChkBuf,offset=esi,esi += 4;; line_113在计算内存数时,已经将全部ARDS copy 到 缓冲区了call   DispInt   ; DispInt(MemChkBuf[j*4]); // 显示一个成员pop    eax       ; 将偏移地址 弹出到 eax; cur_line_347, line_340: mov   edi, ARDStructstosd    ; ARDStruct[j*4] = MemChkBuf[j*4]; eax copy到 edi 指向的目的地址(ARDStruct); 为什么要吧内存段描述符结构体从缓冲区copy到ARDS暂存呢?因为下面代码要用到变量:dwType + dwBaseAddrLow + dwLengthLowadd    esi, 4        ; cur_line_348, line_318 mov  esi, MemChkBuf (256个0的内存空间的偏移地址)dec    edx   ; edx == 总循环次数(5--)cmp    edx, 0        ;jnz    .1        ;  } 就这样循环下去吧,直到为0为止;call   DispReturn    ;  printf("\n");cmp    dword [dwType], 1 ;  if(Type == AddressRangeMemory)(该段内存可用的话) , 此刻的 dwType 是由line_349从缓冲区写入的,cur_line_357;jne    .2    ;  {    ;  如果该内存不可用的话,跳转到 .2;mov    eax, [dwBaseAddrLow]; 基地址的低32位add    eax, [dwLengthLow]  ; 长度的低32位cmp    eax, [dwMemSize]  ;    if(BaseAddrLow + LengthLow > MemSize-内存大小),MemSize初始化为0;求最大内存范围值jb .2        ; jb:无符号小于则跳转; _dwMemSize:    dd 0; dwMemSize  equ    _dwMemSize  - $$mov    [dwMemSize], eax  ;    MemSize = BaseAddrLow + LengthLow;
    .2:   ;  } ; Type==AddressRangeReserved (该段内存不可用的话)loop   .loop     ;};call   DispReturn    ;printf("\n");push   szRAMSize     ; _szRAMSize   db "RAM size:", 0 ;字符串以 0 结尾call   DispStr   ;printf("RAM size:");add    esp, 4    ;;push   dword [dwMemSize] ;call   DispInt   ;DispInt(MemSize);add    esp, 4    ;pop    ecxpop    edipop    esiret
    

  • 代码步骤:(干货)
  • step1)首先要知道,上一段代码已经算出了内存段(块)的个数 dwMCRNumber 和 吧 内存各个ARDS copy 到了缓冲区MemChkBuf中,我们这里的代码需要用这个个数 dwMCRNumber 和这个 存储有 各个 ARDS 数据的缓冲区MemChkBuf;
  • step2)通过双循环,读取每个ARDS的各个成员的值并打印,外循环个数为内存段(块)个数,内循环个数=5(因为ARDS有5个成员), 并将缓冲区中每个 ARDS 暂存在 ARDS结构中,以便下面代码取变量值;
  • step3)继续说循环,内循环结束后,比较dwType(内存块类型),判断该内存段是否可用,不可用,进入下一次外循环;若可用,继续判断dwBaseAddrLow(基地址的低32位) + dwLengthLow(长度的低32位) 是否大于最大内存地址dwMemSize, 总之dwMemSize 取 它们和的最大值;外循环ending
  • step4)最后打印出 最大内存地址 dwMemSize;

计算机器内存数量+引入和显示ARDS成员相关推荐

  1. 计算机器和智能-阿兰图灵(转帖)

    转自:http://duanple.blog.163.com/blog/static/7097176720111019571206/ 英文版本可以在这里找到:http://www.loebner.ne ...

  2. [转]如何正确查看Linux机器内存使用情况

    原文链接 如何正确查看Linux机器内存使用情况 背景 只要工作上涉及到Linux机器,基本上都会有这样一个需求,查看内存使用情况,但是怎么看才正确呢?之前使用的是top命令,一直存在一个误区. 为什 ...

  3. 计算mysql内存使用

    计算mysql内存使用 mysqlused mem =key_buffer_size + query_cache_size +innodb_buffer_pool_size + innodb_addi ...

  4. Flutter实战视频-移动电商-59.购物车_计算商品价格和数量

    59.购物车_计算商品价格和数量 本节课主要是加上自动计算的功能 provide/cart.dart 在provide的类里面增加两个变量 cart_bottom.dart 三个组件因为我们都需要套一 ...

  5. 吐槽今年一级计算机,吐槽大会#辽宁省考#当一个没有情感的计算机器

    成功上岸 #辽宁省考#[2019年辽宁省公务员招录考试正式拉开序幕]今天上午九点,辽宁省公务员考试正式拉开了序幕.这次考试全省共计招考5535个岗位,招考人数7209人,报名人数突破15万人,是辽宁省 ...

  6. 图灵 | 计算机器与智能

    ["计算机器与智能"选自<Mind>,no.2236(1950.10),P433-460.牛津大学出版社允许重印.刘西瑞.王汉琦 翻译] 1. 模仿游戏 我建议来考虑这 ...

  7. 记一次机器内存过高引起的线上故障

    文章目录 1.案发经过 2. 故障分析 2.1 为什么cShareAct接口一直超时? 2.2 为什么cShare接口调用量突增? 2.3 cpu升高的原因分析 2.4 机器负载高的原因 2.5 Ja ...

  8. 卷积神经网络参数量和计算量内存计算

    卷积神经网络参数量和计算量内存计算 参数量 计算量 内存 参数量 每一次卷积的参数量和特征图的大小无关,仅和卷积核的大小,偏置及BN有关. 1.每个卷积层的参数量,+1表示偏置: Co x (Kw x ...

  9. linux+查内存数量,检查 Linux 中内存使用情况的 8 条命令 | Linux 中国

    作为一名 Linux 管理员,知道如何获取当前可用的和已经使用的资源情况,比如内存.CPU.磁盘等,是相当重要的. -- Magesh Maruthamuthu Linux 并不像 Windows,你 ...

最新文章

  1. Dell 戴尔预装Windows8改成Windows7
  2. 20145307《信息安全系统设计基础》期中总结
  3. 使用@required注解完成依赖检查
  4. 学习MSCKF笔记——前端、图像金字塔光流、Two Point Ransac
  5. book mac pro怎么重装系统_Macbook Pro怎么重装系统
  6. python面向对象(2)——继承(4)
  7. AGC002F - Leftmost Ball(dp,组合计数)
  8. 前端js获取图片大小 扩展名_前端 JS 获取 Image 图像 宽高 尺寸
  9. 392. 判断子序列(javascript)
  10. c++字符串加密_【网络爬虫教学】快速定位拼多多加密算法入口(四)
  11. 【图像处理】基于matlab直方图医学图像处理【含Matlab源码 458期】
  12. android定位坑简书,android webview 定位问题
  13. Java实现下载图片
  14. Spring Cloud微服务实战_PDF电子书下载 高清 带索引书签目录_翟永超(著)
  15. [Win32] 打字游戏MFC版
  16. .net下如何压缩图片大小,超简单
  17. python中矩阵怎么表示_python中的列矩阵表示
  18. 个人力扣刷题笔记 LCP 03. 机器人大冒险
  19. Android应用: 3D旋转球
  20. 设计一款照片一键加水印的小工具

热门文章

  1. P1247 取火柴游戏
  2. 洛谷P1650:田忌赛马(贪心)
  3. YBTOJ洛谷P3231:消毒(二分图匹配)
  4. YBTOJ:前缀匹配(AC自动机)
  5. Ybtoj-排列计数【矩阵乘法,分块幂】
  6. 欢乐纪中A组周六赛【2019.6.1】
  7. P1983-车站分级【图论,记忆化dfs,构图】
  8. 洛谷UVA1328,POJ1961-Period【KMP,字符串】
  9. 各种有用的东西留言板
  10. 【DP】合唱队形(jzoj 1122)