当前位置: 首页 > news >正文

一级域名和二级域名做两个网站qq推广链接生成

一级域名和二级域名做两个网站,qq推广链接生成,做效果图比较好的模型网站有哪些,电脑网站怎么做的前情提要 上一章中我们进入了保护模式,并且跳转到了32位模式下执行。这一章较为简单,我们来获取物理内存的实际容量。 一、获得内存容量的方式 在Linux中有多种方法获取内存容量,如果一种方法失败,就会试用其他方法。其本质上是…

前情提要

上一章中我们进入了保护模式,并且跳转到了32位模式下执行。这一章较为简单,我们来获取物理内存的实际容量。

一、获得内存容量的方式

在Linux中有多种方法获取内存容量,如果一种方法失败,就会试用其他方法。其本质上是通过调用BIOS中断0x15实现的。分别是三个子功能,子功能号要放在寄存器EAX或AX中。

EAX=0xE820:遍历主机上全部内存。最大支持2^64Byte

AX=0xE801:分别检测低15MB和16MB~4GB的内存,最大支持2^32Byte。

AH=0x88:最多检测出64MB内存,实际内存超过此容量也按照64MB返回。

若三种方法都失败了只能将机器挂起,停止运行。

二、利用子功能号0xE820

BIOS中断 0x15的子功能0xE820能够获取系统的内存布局,由于系统内存各部分的类型属性不同,BIOS就按照类型属性来划分这片系统内存,所以这种查询呈迭代式,每次BIOS只返回一种类型的内存信息,直到将所有内存类型返回完毕。

内存信息的内容是用地址范围描述符来描述的,用于存储这种描述符的结构称之为地址范围描述符(Address Range Descriptor Structure,ARDS),格式见下表

image-20240312204933393

其中Type为1则表示这段内存可以被操作系统使用,Type为2则表示这段内存不能给操作系统使用(因为这个地址可能是硬件端口,系统ROM,某种设备的内存映射到了这部分什么的),其他的都未定义。

正常情况下,不会出现较大的内存区域不可用的情况,除非安装的物理内存极其小。这意味着,在所有返回的ARDS结构里,此值最大的内存块一定是操作系统可使用的部分,即主板上配置的物理内存容量。

此中断子功能参数见下表

请添加图片描述

三、利用子功能号0xE801

此方法虽然简单,但功能也不强大,最大只能识别4GB内存,不过这对咱们32位地址总线足够了。稍微有点不便的是此方法检测到的内存是分别存放到两组寄存器中的。低于15MB的内存以1KB为单位大小来记录,单位数量在寄存器AX和CX中记录,其中AX和CX的值是一样的。16MB~4GB是以64KB为单位大小来记录的,单位数量在寄存器BX和DX中记录,其中BX和DX的值是一样的。

image-20240312211154917

为什么区分16MB以上即以下呢?其实这只是为了兼容,80286拥有24位地址线,其寻址空间是16MB。当时有一些ISA设备要用到地址15MB以上的内存作为缓冲区,也就是此缓冲区为1MB大小,所以硬件系统就把这部分内存保留下来,操作系统不可以用此段内存空间。现在这些设备我们几乎不会接触到,但是这个问题还是保留下来了。我们当然在实际操作时要无视这个空间。

四、利用子功能号0x88

该方法使用最简单,但功能也最简单,简单到只能识别最大64MB的内存。即使内存容量大于64MB,也只会显示63MB。此中断只会显示1MB之上的内存,不包括这1MB。

image-20240312211611141

五、检测代码

将程序修改为

; os/src/boot/loader.s
%include "boot.inc" 
section loader vstart=LOADER_BASE_ADDR ; 程序开始的地址jmp loader_startLOADER_STACK_TOP equ LOADER_BASE_ADDR ; 栈顶地址;构建gdt及其内部的描述符
GDT_BASE:  dd    0x00000000 dd    0x00000000CODE_DESC: dd    0x0000FFFF dd    DESC_CODE_HIGH4DATA_STACK_DESC:  dd    0x0000FFFFdd    DESC_DATA_HIGH4VIDEO_DESC: dd    0x80000007	       ; limit=(0xbffff-0xb8000)/4k=0x7dd    DESC_VIDEO_HIGH4     ; 此时dpl为0GDT_SIZE   equ   $ - GDT_BASE
GDT_LIMIT  equ   GDT_SIZE -	1 
times 60 dq 0					 ; 此处预留60个描述符的slot
SELECTOR_CODE  equ (0x0001<<3) + TI_GDT + RPL0   ; 第一个选择子
SELECTOR_DATA  equ (0x0002<<3) + TI_GDT + RPL0	 ; 第二个选择子
SELECTOR_VIDEO equ (0x0003<<3) + TI_GDT + RPL0	 ; 第三个选择子; 以下是定义gdt的指针,前2字节是gdt界限,后4字节是gdt起始地址
gdt_ptr  dw  GDT_LIMIT dd  GDT_BASEtotal_mem_bytes dd 0		; 保存内存容量,以字节为单位
ards_buf times 244 db 0     ; 人工对齐:total_mem_bytes4字节+gdt_ptr6字节+ards_buf244字节+ards_nr2,共256字节
ards_nr dw 0		        ; 用于记录ards结构体数量loader_start:mov byte [gs:160],'L'mov byte [gs:161],0x0Fmov byte [gs:162],'O'mov byte [gs:163],0x0Fmov byte [gs:164],'A'mov byte [gs:165],0x0F   mov byte [gs:166],'D'mov byte [gs:167],0x0Fmov byte [gs:168],'E'mov byte [gs:169],0x0Fmov byte [gs:170],'R'mov byte [gs:171],0x0F; 获取内存容量,int 15, ax = E820h
.get_total_mem_bytes:xor ebx, ebx              ;第一次调用时,ebx值要为0mov edx, 0x534d4150	      ;edx只赋值一次,循环体中不会改变mov di, ards_buf	      ;ards结构缓冲区
.e820_mem_get_loop:	          ;循环获取每个ARDS内存范围描述结构mov eax, 0x0000e820	      ;执行int 0x15后,eax值变为0x534d4150,所以每次执行int前都要更新为子功能号。mov ecx, 20		          ;ARDS地址范围描述符结构大小是20字节int 0x15jc .failed_so_try_e801    ;若cf位为1则有错误发生,尝试0xe801子功能add di, cx		          ;使di增加20字节指向缓冲区中新的ARDS结构位置inc word [ards_nr]	      ;记录ARDS数量cmp ebx, 0		          ;若ebx为0且cf不为1,这说明ards全部返回,当前已是最后一个jnz .e820_mem_get_loop;在所有ards结构中,找出(base_add_low + length_low)的最大值,即内存的容量。mov cx, [ards_nr]	      ;遍历每一个ARDS结构体,循环次数是ARDS的数量mov ebx, ards_buf xor edx, edx		      ;edx为最大的内存容量,在此先清0
.find_max_mem_area:	          ;无须判断type是否为1,最大的内存块一定是可被使用mov eax, [ebx]	          ;base_add_lowadd eax, [ebx+8]	      ;length_lowadd ebx, 20		          ;指向缓冲区中下一个ARDS结构cmp edx, eax		      ;冒泡排序,找出最大,edx寄存器始终是最大的内存容量jge .next_ardsmov edx, eax		      ;edx为总内存大小
.next_ards:loop .find_max_mem_areajmp .mem_get_ok; 获取内存容量,int 15, ax = E801h
.failed_so_try_e801:mov ax,0xe801int 0x15jc .failed_so_try88       ;若当前e801方法失败,就尝试0x88方法; 先算出低15M的内存,ax和cx中是以KB为单位的内存数量,将其转换为以byte为单位mov cx,0x400	          ;cx和ax值一样,cx用做乘数mul cx shl edx,16and eax,0x0000FFFFor edx,eaxadd edx, 0x100000         ;ax只是15MB,故要加1MBmov esi,edx	              ;先把低15MB的内存容量存入esi寄存器备份; 再将16MB以上的内存转换为byte为单位,寄存器bx和dx中是以64KB为单位的内存数量xor eax,eaxmov ax,bx		mov ecx, 0x10000	      ;0x10000十进制为64KBmul ecx		              ;32位乘法,默认的被乘数是eax,积为64位,高32位存入edx,低32位存入eax.add esi,eax		          ;由于此方法只能测出4G以内的内存,故32位eax足够了,edx肯定为0,只加eax便可mov edx,esi		          ;edx为总内存大小jmp .mem_get_ok; 获取内存容量,int 15, ah = 0x88
.failed_so_try88: ;int 15后,ax存入的是以kb为单位的内存容量mov ah, 0x88int 0x15jc  .error_hltand eax,0x0000FFFF;16位乘法,被乘数是ax,积为32位.积的高16位在dx中,积的低16位在ax中mov cx, 0x400      ;0x400等于1024,将ax中的内存容量换为以byte为单位mul cxshl edx, 16	       ;把dx移到高16位or  edx, eax	   ;把积的低16位组合到edx,为32位的积add edx,0x100000   ;0x88子功能只会返回1MB以上的内存,故实际内存大小要加上1MBjmp .mem_get_ok;将内存换为byte单位后存入total_mem_bytes处。
.mem_get_ok:mov [total_mem_bytes], edx	 ; 打开A20地址线
.open_A20:in   al,0x92or   al,0000_0010Bout  0x92,al; 加载gdt描述符
.load_gdt:lgdt [gdt_ptr]; 修改cr0标志寄存器的PE位
.change_cr0_PE:mov  eax, cr0or   eax, 0x00000001mov  cr0, eax.jmp_bit_32jmp  SELECTOR_CODE:p_mode_start ; 刷新流水线,避免分支预测的影响; 远跳将导致之前做的预测失效,从而起到了刷新的作用。.error_hlt:		      ;出错则挂起hlt; 下面就是保护模式下的程序了
[bits 32]
p_mode_start:mov ax, SELECTOR_DATAmov ds, axmov es, axmov ss, axmov esp,LOADER_STACK_TOPmov ax, SELECTOR_VIDEOmov gs, axmov byte [gs:320], 'M'mov byte [gs:321],0x0Fmov byte [gs:322], 'A'mov byte [gs:323],0x0Fmov byte [gs:324], 'I'mov byte [gs:325],0x0Fmov byte [gs:326], 'N'mov byte [gs:327],0x0Fjmp $

可以看到仿真结果

image-20240312221237373

可以看到,检测到的内存就是32MB

结束语

这节我们讲述了如何检测物理内存的大小,下节课我们对内存进行处理,内存现在是一个线性的空间,谁想去哪儿就去哪儿,这并不利于我们管理,而且会导致内存的碎皮化问题,下节我们讲内存的分段与分页。

ps:上节说不知道为啥程序不运行了,最后发现是loader导入时导入的扇区数太少了,这节也是不知道为啥不执行了,后面发现是dd指令在将准备好的程序放入硬盘时只放了1024字节,但是程序有一千一百多字节,所以没放下。。。。

http://www.hengruixuexiao.com/news/11907.html

相关文章:

  • 自己做个网站多少钱seo网站营销推广公司
  • wordpress css 图片路径百度seo排名优化助手
  • 鄂尔多斯市城乡建设委员会网站百度上海分公司
  • 天津网站建设外包线上培训机构有哪些
  • 繁体商城网站模板2345网址导航手机版
  • 如何做微信官方网站公司网站费用
  • 网页怎么做才美观河南自助建站seo公司
  • 高端网站建站 北京黄冈黄页88网黄冈房产估价
  • 怎么下载文章到wordpressseo海外
  • 网站解析怎么设置seo网课培训
  • mui做网站软件开发网
  • 建设一个电子商务网站买卖链接网站
  • 做贷款行业哪些网站能发布广告app注册推广平台
  • 猪八戒网站做推广靠谱吗怎么买到精准客户的电话
  • 网站建设的工作流程佛山seo培训
  • 免费建立个人网站的视频建站流程
  • 网站建设规划书毕业论文6000字百度快速seo优化
  • 网站建设买服务器价格查询网域名查询
  • 网站做跳转怎么做凡科网
  • 网站可信认证必须做吗seo优化排名价格
  • 广州网站建设哪家强微信营销软件免费版
  • 企业网站产品优化怎么做免费做网页的网站
  • 无代码网站开发平台有哪些2023年8月新冠疫情
  • 上海商城网站建设公司谷歌google 官网下载
  • 盐城优化办seo服务工程
  • 金溪网站建设百度信息流怎么投放
  • 客服系统官方网站在广州做seo找哪家公司
  • 蛋糕网站建设方案2024年疫情还会封控吗
  • 什么网站可以做头像最好用的系统优化软件
  • 2023中国互联网公司排行榜谷歌优化师