30天自制操作系统(Mac版)读书笔记(day9)

news2024/12/28 23:07:19

day7和day8都是鼠标和32位的操作,看起来都是理论,先略过。

检测内存块数量

  1. 使用中断去检测内存,把这个当成一个函数调用吧。这里面di寄存器给的地址就是结果存在的内存位置。
ComputeMemory:
     mov   ebx, 0
     mov   di, MemChkBuf
.loop:
     mov   eax, 0E820h
     mov   ecx, 20
     mov   edx, 0534D4150h
     int   15h
     jc    LABEL_MEM_CHK_FAIL
     add   di, 20   
     inc   dword [dwMCRNumber]
     cmp   ebx, 0
     jne   .loop
     jmp   LABEL_MEM_CHK_OK
LABEL_MEM_CHK_FAIL:
    mov    dword [dwMCRNumber], 0
  1. C语言当中,可以通过下面的函数去获取内存的块数。这个函数也给我们其实,C语言中的return x,中的x存储在eax中。这里也可以看出,x86cpu把内存分成了多个块。没个块对应不同的内存区间。
get_memory_block_count:
mov  eax, [dwMCRNumber]
ret
  1. c语言中可以直接现实,但是需要把int值转换一下。
char*  intToHexStr(unsigned int d) {
    static char str[11];
    str[0] = '0';
    str[1] = 'X';
    str[10] = 0;
    int i = 2;
    for(; i < 10; i++) {
        str[i] = '0';
    }
    int p = 9;
    while (p > 1 && d > 0) {
        int e = d % 16;
        d /= 16;
        if (e >= 10) {
           str[p] = 'A' + e - 10;
        } else {
            str[p] = '0' + e;
        }
      	p --; // 这里注意 原来的老师没有加
    } 
    return str;
}
  1. 调用就用以下代码调用
    int memCnt = get_memory_block_count();
    char* pStr = intToHexStr(memCnt);
    showString(vram, xsize, 0, 0, COL8_FFFFFF, pStr);
}
  1. 我这边显示有6个内存块。在makefile中修改qemu的内存参数,qemu-system-i386 -m 32M -drive file=myos.img,if=floppy把内存调大到4096M,内存块会增加到7,不知道为啥。
    在这里插入图片描述

内存检测具体信息

这里用c语言写的init_pic有点小问题,还是换回init8259A的汇编调用吧。

  1. 添加对int 15中断的内存地址获取。
   get_adr_buffer:
          mov  eax, MemChkBuf
          ret
  1. c语言中调用就使用一下函数
 struct AddrRangeDesc* memDesc = (struct AddrRangeDesc*)get_adr_buffer();
  1. 键盘时间判断一下回车对应的key值 0x1c
if (data == 0x1C) {
   showMemoryInfo( memDesc + count, vram, count, xsize, COL8_FFFFFF);
    count = (count+1);
    if (count > memCnt) {
       count = 0;
    }
}
  1. 运行一下发现,按一次回车,会读取一个内存块的内存信息。这里我总结了一下内存的排布信息。其中第四段最大的那个内存块,类型为1,表示可以占用。1EE0000换算成十进制是30M的内存。所以,下一步,我们就在这块内存当中,实现我们的内存分配算法
base:0~9fc00 length:9fc00  type:1
base:9fc00~A0000 length:400 type:2
base:f0000~100000 length:10000 type:2
base:100000~1fe0000 length:1EE0000 type:1
base:1fe0000~2000000 length:20000 type:2
base:FFFC0000~100000000 length:40000 type:2

内存分配算法

  1. 我觉得这块直接抄就行了,我们把它当成C单中的malloc和free算了,没必要知道其中的原理。代码在这里
  2. 这里吧mem_util.c的函数放在了另外一个文件里面,那么就牵扯到一个.o合并的问题。
i386-elf-gcc -m32 -fno-asynchronous-unwind-tables -s -c -o mem_util.o mem_util.c 
i386-elf-ld -m elf_i386 -r write_vga.o mem_util.o -o ckernel.o
objconv -fnasm ckernel.o write_vga.asm
  1. main函数中调用一下total函数看一下对不对,这里面跟MyOperatingSystem的作者给出的起始地址不太一样,按他的解释应该是 0x100000后面加上32k的结构体。也就是0x108000开始,但是整个长度就要相应的减去32k,其实应该是1EE0000-0x8000=0x1fd8000,我这里给的内存还是32M,MyOperatingSystem的作者用的是1024m。但是应该无所谓的,因为我们这个系统看起来也用不了那么多的内存。
    memman_init(memman);
    memman_free(memman, 0x00108000, 0x1fd8000);
    int memtotal = memman_total(memman) / (1024*1024);
    char* pMemTotal = intToHexStr(memtotal); 
    showString(vram, xsize, 0, 0,COL8_FFFFFF, "total mem is: ");
    showString(vram, xsize, 17*8, 0, COL8_FFFFFF, pMemTotal);
    showString(vram, xsize, 28*8, 0, COL8_FFFFFF, " MB");
  1. 跑起来,给出的结果是31M内存,差不多,可以继续往前了。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux安装vnc服务

1、 如操作系统是最小化安装&#xff0c;那么需要安装GNOME桌面&#xff0c;安装参考&#xff1a;https://blog.csdn.net/carefree2005/article/details/119417234 2、 安装vnc-server yum -y install tigervnc-server3、 复制配置文件模板&#xff0c;将无关的内容清除 cat…

图灵 | 计算机器与智能

【“计算机器与智能”选自《Mind》&#xff0c;no.2236&#xff08;1950.10&#xff09;&#xff0c;P433-460。牛津大学出版社允许重印。刘西瑞、王汉琦 翻译】1. 模仿游戏我建议来考虑这个问题 &#xff1a;“机器能够思维吗&#xff1f;” 这可以从定义 “机 器” 和 “思维…

Docker数据目录迁移

背景在CentOS中安装了Docker&#xff0c;默认Docker Root目录是/var/lib/docker。但是该目录磁盘空间很有限&#xff0c;后期很容易导致系统盘满了&#xff0c;所以考虑迁移到更大磁盘目录下&#xff0c;比如下面的/fsc目录下。解决在Docker官方文档https://docs.docker.com/co…

excel查找定位:INDEX函数——精确制导导弹

一、认识INDEX函数Index函数&#xff1a;在给定的单元格区域中&#xff0c;返回特定行列交叉处单元格的值或引用。函数结构&#xff1a;index&#xff08;单元格区域,行号,列号&#xff09;区域&#xff0c;行号&#xff0c;列号&#xff0c;很像通过坐标瞄准打靶呀。就像下面动…

高阶数据结构之AVL树

文章目录回顾二叉搜索树AVL树在AVL树中插入新节点AVL树中的各种旋转右单旋左单旋左右双旋右左双旋验证是否是AVL树验证是否是二叉搜索树验证是否是平衡树总结AVL树回顾二叉搜索树 二叉搜索树的一些特点回顾&#xff1a; &#xff08;1)每一个节点左树上所有节点的值都是…

vue多实例的骚操作,主要用于解决组件全局弹窗面板的问题。。。

1.问题背景 主要是自己写了一个组件库&#xff0c;其中涉及到弹出面板的组件遇到兼容性问题。 举个例子&#xff0c; 日期选择组件例如 DaterPicker组件 大概的代码如下&#xff08;省略了细节实现&#xff09; <template> <label>日期</label> <input …

一文详解PHP用流方式实现下载文件(附代码示例)

一淘模板给大家带来了关于PHP的相关知识&#xff0c;其中主要介绍了在PHP中怎么使用流方式来实现下载文件的&#xff0c;下面一起来看一下&#xff0c;希望对大家有帮助。 PHP 中使用流方式下载文件 在 PHP 中&#xff0c;可以使用 fopen() 函数打开一个远程文件&#xff0c;并…

Unity使用本地UPM包的实现方式

实现1&#xff1a;项目根路径实现优点&#xff1a;1.不必有额外操作2.本地包随项目版控&#xff0c;不会丢失包产生错误3.按需升级包缺点&#xff1a;1.包的修改随项目版控&#xff0c;增加日志冗余2.不利于包全局管理建议使用场景多人合作&#xff0c;开发底子较弱的团队。实现…

今年春节,全国物流很稳!

我叫张雄伟&#xff0c;是腾讯安全的一位交付工程师。我和团队的主要工作&#xff0c;是物流行业重点客户的安全防御项目管理工作。近两年&#xff0c;我们开始向顺丰、极兔等多家大型物流公司提供安全产品与服务。在双十一、618等全民购物节、春节等电商旺季&#xff0c;我们和…

百华鞋业开工大吉|起航新征程,扬帆再出发

爆竹声声迎鸿运&#xff0c;开工大吉启新程。2023年农历正月初六&#xff0c;山东百华鞋业有限公司迎来节后开工吉日。百华的家人们迅速集结工作岗位&#xff0c;以饱满的精神状态&#xff0c;按下工作复位键&#xff0c;俯身蹬地冲起跑&#xff0c;努力奋斗再出发&#xff01;…

史上最全测试开发工具推荐(含自动化、性能、稳定性、抓包)

一、UI自动化测试工具 1. uiautomator2 介绍: openatx开源的ui自动化工具&#xff0c;支持android和ios。主要面向的编程语言是python&#xff0c;api设计简洁易用&#xff0c;在开源社区也是很受欢迎。 原理图&#xff1a; 安装&#xff1a; pip install --upgrade --pre…

【C语言】-扫雷-简单版

前言&#xff1a;感谢各位朋友的捧场&#xff0c;这里给大家分享的是扫雷游戏的简单实现 &#xff08;PS&#xff1a;这里简单是指只实现了游戏的基础功能和主要流程&#xff0c;由于当前本人技术知识尚薄弱&#xff0c;相关的优化会通过后续的学习进行更新&#xff09; 《扫雷…

session,cookie和token的区别

session&#xff0c;cookie和token究竟是什么简述cookie&#xff0c;session&#xff0c;token作为面试必问题&#xff0c;很多同学能答个大概&#xff0c;但是又迷糊不清&#xff0c;希望本篇文章对大家有所帮助http是一个无状态协议什么是无状态呢&#xff1f;就是说这一次请…

【Java Swing】Java组件及事件处理

图形用户接口1、Swing概述2、Swing顶级容器3、布局管理器4、事件处理5、Swing常用组件1、Swing概述 Swing是一种轻量级的组件&#xff0c;它由Java语言开发&#xff0c;可以通过使用简洁的代码、灵活的功能和模块化的组件来创建优雅的用户界面Swing组建的继承关系 2、Swing顶…

企业为何都用电子招投标 现代电子招投标系统介绍

在以前的传统招投标工作中&#xff0c;主要采用人工、书面文件的模式操作&#xff0c;往往产品没有得到很好地分类&#xff0c;导致整个招投标流程变得漫长且复杂。在传统招投标过程中通常需要三个月或更长时间&#xff0c;这对于买方或供应商企业而言是非常浪费时间的。如果还…

LIO-SAM代码解析——imageProjection.cpp

目录imageProjection.cpp1. ImageProjection类1.1. imuHandler1.2. odometryHandler1.3. cloudHandler⭐1.3.1. cachePointCloud&#xff1a; 点云消息缓存与检查1.3.2. deskewInfo() &#xff1a; 获得运动补偿信息1.3.2.1. imuDeskewInfo() &#xff1a; imu的补偿信息1.3.2.…

TOOM系统加强网络舆情监控的建议,如何加强网络舆情的引导和管控

网络舆情监控是指在互联网上通过技术手段&#xff0c;对网络上的舆情信息进行收集、整理、分析、评估和处理&#xff0c;以有效地识别、预测、处理网络舆情问题。网络舆情监控工作的目的是促进舆情健康&#xff0c;防止舆情危机。接下来简单了解TOOM系统加强网络舆情监控的建议…

Python基本语法与变量类型

一、Python基本语法 1、Python注释 Python 支持两种类型的注释&#xff0c;分别是单行注释和多行注释。 &#xff08;1&#xff09;单行注释 单行注释指的是从井号#开始&#xff0c;直到这行结束为止的所有内容都是注释。 # 注释内容&#xff08;2&#xff09;多行注释 Pyt…

ccflow-代码

报表设计目录概述需求&#xff1a;设计思路实现思路分析报表设计&#xff0c;流程运维系统&#xff08;三元log&#xff09;数据源管理和维护是否:debug状态. 0 表示不是, 1 是&#xff0c;如果系统发布后&#xff0c;请将此修改成0&#xff0c;以提高执行效率。在流程运行结束…

Python语言开发学习之使用Python预测天气

什么是wttr&#xff1f; 使用Python预测天气的第一步&#xff0c;我们要了解wttr是什么。wttr.in是一个面向控制台的天气预报服务&#xff0c;它支持各种信息表示方法&#xff0c;如面向终端的ANSI序列(用于控制台HTTP客户端(curl、httpie或wget))、HTML(用于web浏览器)或PNG(…