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

网站开发用什么代码vi企业形象设计公司

网站开发用什么代码,vi企业形象设计公司,如何进入网站开发后台,工信部 网站 备案前情提要 上一章中我们进入了保护模式#xff0c;并且跳转到了32位模式下执行。这一章较为简单#xff0c;我们来获取物理内存的实际容量。 一、获得内存容量的方式 在Linux中有多种方法获取内存容量#xff0c;如果一种方法失败#xff0c;就会试用其他方法。其本质上是…前情提要 上一章中我们进入了保护模式并且跳转到了32位模式下执行。这一章较为简单我们来获取物理内存的实际容量。 一、获得内存容量的方式 在Linux中有多种方法获取内存容量如果一种方法失败就会试用其他方法。其本质上是通过调用BIOS中断0x15实现的。分别是三个子功能子功能号要放在寄存器EAX或AX中。 EAX0xE820遍历主机上全部内存。最大支持2^64Byte AX0xE801分别检测低15MB和16MB4GB的内存最大支持2^32Byte。 AH0x88最多检测出64MB内存实际内存超过此容量也按照64MB返回。 若三种方法都失败了只能将机器挂起停止运行。 二、利用子功能号0xE820 BIOS中断 0x15的子功能0xE820能够获取系统的内存布局由于系统内存各部分的类型属性不同BIOS就按照类型属性来划分这片系统内存所以这种查询呈迭代式每次BIOS只返回一种类型的内存信息直到将所有内存类型返回完毕。 内存信息的内容是用地址范围描述符来描述的用于存储这种描述符的结构称之为地址范围描述符Address Range Descriptor StructureARDS格式见下表 其中Type为1则表示这段内存可以被操作系统使用Type为2则表示这段内存不能给操作系统使用因为这个地址可能是硬件端口系统ROM某种设备的内存映射到了这部分什么的其他的都未定义。 正常情况下不会出现较大的内存区域不可用的情况除非安装的物理内存极其小。这意味着在所有返回的ARDS结构里此值最大的内存块一定是操作系统可使用的部分即主板上配置的物理内存容量。 此中断子功能参数见下表 三、利用子功能号0xE801 此方法虽然简单但功能也不强大最大只能识别4GB内存不过这对咱们32位地址总线足够了。稍微有点不便的是此方法检测到的内存是分别存放到两组寄存器中的。低于15MB的内存以1KB为单位大小来记录单位数量在寄存器AX和CX中记录其中AX和CX的值是一样的。16MB4GB是以64KB为单位大小来记录的单位数量在寄存器BX和DX中记录其中BX和DX的值是一样的。 为什么区分16MB以上即以下呢其实这只是为了兼容80286拥有24位地址线其寻址空间是16MB。当时有一些ISA设备要用到地址15MB以上的内存作为缓冲区也就是此缓冲区为1MB大小所以硬件系统就把这部分内存保留下来操作系统不可以用此段内存空间。现在这些设备我们几乎不会接触到但是这个问题还是保留下来了。我们当然在实际操作时要无视这个空间。 四、利用子功能号0x88 该方法使用最简单但功能也最简单简单到只能识别最大64MB的内存。即使内存容量大于64MB也只会显示63MB。此中断只会显示1MB之上的内存不包括这1MB。 五、检测代码 将程序修改为 ; os/src/boot/loader.s %include boot.inc section loader vstartLOADER_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)/4k0x7dd DESC_VIDEO_HIGH4 ; 此时dpl为0GDT_SIZE equ $ - GDT_BASE GDT_LIMIT equ GDT_SIZE - 1 times 60 dq 0 ; 此处预留60个描述符的slot SELECTOR_CODE equ (0x00013) TI_GDT RPL0 ; 第一个选择子 SELECTOR_DATA equ (0x00023) TI_GDT RPL0 ; 第二个选择子 SELECTOR_VIDEO equ (0x00033) 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],Lmov byte [gs:161],0x0Fmov byte [gs:162],Omov byte [gs:163],0x0Fmov byte [gs:164],Amov byte [gs:165],0x0F mov byte [gs:166],Dmov byte [gs:167],0x0Fmov byte [gs:168],Emov byte [gs:169],0x0Fmov byte [gs:170],Rmov 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, [ebx8] ;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], Mmov byte [gs:321],0x0Fmov byte [gs:322], Amov byte [gs:323],0x0Fmov byte [gs:324], Imov byte [gs:325],0x0Fmov byte [gs:326], Nmov byte [gs:327],0x0Fjmp $可以看到仿真结果 可以看到检测到的内存就是32MB 结束语 这节我们讲述了如何检测物理内存的大小下节课我们对内存进行处理内存现在是一个线性的空间谁想去哪儿就去哪儿这并不利于我们管理而且会导致内存的碎皮化问题下节我们讲内存的分段与分页。 ps上节说不知道为啥程序不运行了最后发现是loader导入时导入的扇区数太少了这节也是不知道为啥不执行了后面发现是dd指令在将准备好的程序放入硬盘时只放了1024字节但是程序有一千一百多字节所以没放下。。。。
http://www.hkea.cn/news/14277409/

相关文章:

  • 济南网站建设成之运维开网店被运营公司骗了怎么办
  • 做游戏网站需要哪些许可句容建设网站
  • 网站改备案吗flash网站教程
  • 邢台网站制作盐田高端网站建设
  • 百度网站收录查询昆山网站网站建设
  • 河源做网站的客户海南 网站开发
  • 莱州网站建设有限公司网络信用贷款哪个好
  • 重庆建网站的公司集中在哪里长春城乡建设部网站首页
  • 网站响应度微信管理系统下载
  • 在ps中如何做网站框架微信小程序开发教程书
  • 济南免费网站建设网页设计实训总结800字
  • 北京国贸网站建设海南手机网站建设公司哪家好
  • 成都企业网站建设费用深圳营销型网站建设服务商
  • 成都企业建设网站湖北专业网站建设检修
  • 网站建设公司的服务器ui网页设计课程总结
  • 商业网站建设视频教程一个县城广告公司利润
  • 申请号的网站网站设计怎么弄
  • 高校门户网站的建设如何在网站插做视频
  • 网站开发环境怎么写聊城开发网站建设
  • 网站设计步骤是什么昆山网站建设及推广
  • 开题报告电子商务网站建设长沙企业网站制作
  • 公司做网站之前要准备什么软件优化营商环境
  • 昌平网站开发多少钱晋中建设集团网站
  • 高清设计网站推荐网页设计作业 介绍家乡
  • 网站开发与设计实验报告总结游戏推广员好做吗
  • 微信小程序网站制作茂名企业自助建站系统
  • 做网站 宁波装修案例分析
  • 网站建设的总结与评价网站的排版问题
  • wordpress子目录站点选择主题手机触屏网站幻灯片
  • 中国全球门户网站wordpress关联博客