3.3.6克勤可检用内存

Rust Vec内存优化实战:with_capacity与shrink_to_fit高效使用指南 动态数组是编程中管理连续数据的基础数据结构,其核心原理是通过预分配内存空间来优化连续插入操作的性能,以空间换时间。这种内存管理策略在系统编程和高性能计算中尤为重要,能有效减少内存碎片和分配开销。在Rust语言中,Vec类型作为动态数组的实现,通过容量(capacity)与长度(len)的分离设计,为开发者提供了精细的内存控制能力。本文聚焦于Vec内存优化的两个关键技术:with_capacity用于创建时预分配,避免多次重新分配带来的性能抖动;shrink_to_fit则用于释放多余容量,在内存敏感场景下减 阅读详情

 在这一小节中,我开始不怎么了解DispMemSize的作用,后来本着要一定要吃透代码的信念。DispMemSize的作用一定要跟前面得到内存数的代码联系起来才可以体会里面用法。DispMemSize里面的子程序就不讨论了,因为跟理解OS没直接关系。前面得到内存数代码里面,比较容易忽视的是ES:DI,这个指向一个描述符的数据结构。这个结构体里面就是执行完得到内存数代码后,BIOS向里面填充系统映像信息。比如说:BaseAddrLow……。

     还有一个比较容易忽视的要点是:stosd的用法。虽然说是stosd的作用是完成位串的传送。但应该要注意的是在32位指针下源指针是DS:ESI,目的指针是ES:EDI

      在这小节的对于的代码 PMTEST7.ASM我老是显示不出RAM size的正确值,都是显示0。为什么呢?是值没有正确赋进去?我开始猜测,又反复读DispMemSize代码,发现里面有赋值语句(mov [dwMemSize],eax)。后面也有将值显示出去的语句。反复对照课本跟PMTEST7.ASM里面的对应代码。就是发现不了错误在那。vcp老是崩溃掉。后来,我就把一段一段的代码从PMTEST7.ASM里面复制到我的代码里面,一个个的测试。后来发现了错误在。

     mov ax, SelectorData
 mov ds, ax   ; 数据段选择子
 mov ax, SelectorData
 mov es, ax
 mov ax, SelectorVideo
 mov gs, ax   ; 视频段选择子

 mov ax, SelectorStack
 mov ss, ax   ; 堆栈段选择子

 mov esp, TopOfStack
  如果你是用原来的PMTEST2.ASM 这里es是没有赋值的。这就造成DispMemSize里面的 edi 没有正确只向 ARDStruct。从而使用stosd的时候,源不能传到目的里面。从而造成RAM size里面的值不能正确显示。

 

附代码:

 ; ==========================================
; pmtest2.asm
; 编译方法:nasm pmtest2.asm -o pmtest2.com
; ==========================================

%include "pm.inc" ; 常量, 宏, 以及一些说明

PageDirBase equ 200000h;
PageTblBase equ 201000h
org 0100h
 jmp LABEL_BEGIN

[SECTION .gdt]
; GDT
;                                         段基址,       段界限     , 属性
LABEL_GDT:  Descriptor        0,                 0, 0       ; 空描述符
LABEL_DESC_NORMAL: Descriptor        0,            0ffffh, DA_DRW  ; Normal 描述符
LABEL_DESC_CODE32: Descriptor        0,  SegCode32Len - 1, DA_C + DA_32 ; 非一致代码段, 32
LABEL_DESC_CODE16: Descriptor        0,            0ffffh, DA_C  ; 非一致代码段, 16
LABEL_DESC_DATA: Descriptor        0, DataLen - 1, DA_DRW  ; Data
LABEL_DESC_STACK: Descriptor        0,        TopOfStack, DA_DRWA + DA_32 ; Stack, 32 位
LABEL_DESC_VIDEO: Descriptor  0B8000h,            0ffffh, DA_DRW  ; 显存首地址


LABEL_DESC_PAGE_DIR: Descriptor PageDirBase, 4095, DA_DRW
LABEL_DESC_PAGE_TBL: Descriptor PageTblBase, 4096 * 8 -1, DA_DRW | DA_LIMIT_4K
; GDT 结束

GdtLen  equ $ - LABEL_GDT ; GDT长度
GdtPtr  dw GdtLen - 1 ; GDT界限
  dd 0  ; GDT基地址

; GDT 选择子
SelectorNormal  equ LABEL_DESC_NORMAL - LABEL_GDT
SelectorCode32  equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorCode16  equ LABEL_DESC_CODE16 - LABEL_GDT
SelectorData  equ LABEL_DESC_DATA  - LABEL_GDT
SelectorStack  equ LABEL_DESC_STACK - LABEL_GDT
SelectorVideo  equ LABEL_DESC_VIDEO - LABEL_GDT


SelectorPageDir equ LABEL_DESC_PAGE_DIR - LABEL_GDT
SelectorPageTbl equ LABEL_DESC_PAGE_TBL - LABEL_GDT
; END of [SECTION .gdt]

[SECTION .data1]  ; 数据段
ALIGN 32
[BITS 32]
LABEL_DATA:
SPValueInRealMode dw 0
; 字符串
PMMessage:  db "In Protect Mode now. ^-^", 0 ; 进入保护模式后显示此字符串
OffsetPMMessage  equ PMMessage - $$
StrTest:  db "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0
OffsetStrTest  equ StrTest - $$

; 实模式下使用这些符号
; 字符串
_szPMMessage:   db "In Protect Mode now. ^-^", 0Ah, 0Ah, 0 ; 进入保护模式后显示此字符串
_szMemChkTitle:   db "BaseAddrL BaseAddrH LengthLow LengthHigh   Type", 0Ah, 0 ; 进入保护模式后显示此字符串
_szRAMSize   db "RAM size:", 0
_szReturn   db 0Ah, 0
; 变量
_wSPValueInRealMode  dw 0
_dwMCRNumber:   dd 0 ; Memory Check Result
_dwDispPos:   dd (80 * 6 + 0) * 2 ; 屏幕第 6 行, 第 0 列。
_dwMemSize:   dd 0
_ARDStruct:   ; Address Range Descriptor Structure
 _dwBaseAddrLow:  dd 0
 _dwBaseAddrHigh: dd 0
 _dwLengthLow:  dd 0
 _dwLengthHigh:  dd 0
 _dwType:  dd 0

_MemChkBuf: times 256 db 0

; 保护模式下使用这些符号
szPMMessage  equ _szPMMessage - $$
szMemChkTitle  equ _szMemChkTitle - $$
szRAMSize  equ _szRAMSize - $$
szReturn  equ _szReturn - $$
dwDispPos  equ _dwDispPos - $$
dwMemSize  equ _dwMemSize - $$
dwMCRNumber  equ _dwMCRNumber - $$
ARDStruct  equ _ARDStruct - $$
 dwBaseAddrLow equ _dwBaseAddrLow - $$
 dwBaseAddrHigh equ _dwBaseAddrHigh - $$
 dwLengthLow equ _dwLengthLow - $$
 dwLengthHigh equ _dwLengthHigh - $$
 dwType  equ _dwType  - $$
MemChkBuf  equ _MemChkBuf - $$

DataLen   equ $ - LABEL_DATA
; END of [SECTION .data1]


; 全局堆栈段
[SECTION .gs]
ALIGN 32
[BITS 32]
LABEL_STACK:
 times 512 db 0

TopOfStack equ $ - LABEL_STACK - 1

; END of [SECTION .gs]


[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
 mov ax, cs
 mov ds, ax
 mov es, ax
 mov ss, ax
 mov sp, 0100h

 mov [LABEL_GO_BACK_TO_REAL+3], ax
 mov [_wSPValueInRealMode], sp


 ;得到内存数
 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
LABEL_MEM_CHK_OK:

 ; 初始化 16 位代码段描述符
 mov ax, cs
 movzx eax, ax
 shl eax, 4
 add eax, LABEL_SEG_CODE16
 mov word [LABEL_DESC_CODE16 + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_CODE16 + 4], al
 mov byte [LABEL_DESC_CODE16 + 7], ah

 ; 初始化 32 位代码段描述符
 xor eax, eax
 mov ax, cs
 shl eax, 4
 add eax, LABEL_SEG_CODE32
 mov word [LABEL_DESC_CODE32 + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_CODE32 + 4], al
 mov byte [LABEL_DESC_CODE32 + 7], ah

 ; 初始化数据段描述符
 xor eax, eax
 mov ax, ds
 shl eax, 4
 add eax, LABEL_DATA
 mov word [LABEL_DESC_DATA + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_DATA + 4], al
 mov byte [LABEL_DESC_DATA + 7], ah

 ; 初始化堆栈段描述符
 xor eax, eax
 mov ax, ds
 shl eax, 4
 add eax, LABEL_STACK
 mov word [LABEL_DESC_STACK + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_STACK + 4], al
 mov byte [LABEL_DESC_STACK + 7], ah

 ; 为加载 GDTR 作准备
 xor eax, eax
 mov ax, ds
 shl eax, 4
 add eax, LABEL_GDT  ; eax <- gdt 基地址
 mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址

 ; 加载 GDTR
 lgdt [GdtPtr]

 ; 关中断
 cli

 ; 打开地址线A20
 in al, 92h
 or al, 00000010b
 out 92h, al

 ; 准备切换到保护模式
 mov eax, cr0
 or eax, 1
 mov cr0, eax

 ; 真正进入保护模式
 jmp dword SelectorCode32:0 ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0  处

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LABEL_REAL_ENTRY:  ; 从保护模式跳回到实模式就到了这里
 mov ax, cs
 mov ds, ax
 mov es, ax
 mov ss, ax

 mov sp, [_wSPValueInRealMode] ;改成_wSPValueInRealMode 原来是的是没有_w前缀的

 in al, 92h  ; ┓
 and al, 11111101b ; ┣ 关闭 A20 地址线
 out 92h, al  ; ┛

 sti   ; 开中断

 mov ax, 4c00h ; ┓
 int 21h  ; ┛回到 DOS
; END of [SECTION .s16]


[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS 32]

LABEL_SEG_CODE32:
 mov ax, SelectorData
 mov ds, ax   ; 数据段选择子
 ;想不到在选择子这里多了一个es赋值
 mov ax, SelectorData
 mov es, ax
 mov ax, SelectorVideo
 mov gs, ax   ; 视频段选择子

 mov ax, SelectorStack
 mov ss, ax   ; 堆栈段选择子

 mov esp, TopOfStack

 push szPMMessage
 call DispStr
 add esp, 4


 push szMemChkTitle
 call DispStr
 add esp, 4 
  
 
 call DispMemSize
 call SetupPaging   ;如果加了启动分页,就会导致vpc崩溃,但pmtest7.asm就不会,为什么呢?

 

 


 ; 到此停止
 jmp SelectorCode16:0

SetupPaging:
;************************
 xor edx, edx
 mov eax, [dwMemSize]
 mov ebx, 400000h   ; 400000h = 4M = 4096 * 1024, 一个页表对应的内存大小 有疑问,这个值具体如何得来
 div ebx
 mov ecx, eax
 test edx, edx
 jz  .no_remainder
 inc ecx
.no_remainder:
 push ecx
;********************
 mov ax, SelectorPageDir
 mov es, ax
; mov ecx, 1024
 xor edi, edi
 xor eax, eax
 mov eax, PageTblBase | PG_P | PG_USU | PG_RWW
.1:
 stosd
 add eax, 4096
 loop .1

 mov ax, SelectorPageTbl
 mov es, ax
;*******************************
 pop eax
 mov ebx, 1024
 mul ebx
 mov ecx, eax
;**********************
; mov ecx, 1024*1024
 xor edi, edi
 xor eax, eax
 mov eax, PG_P | PG_USU | PG_RWW
.2:
 stosd
 add eax, 4096
 loop .2

 mov eax, PageDirBase
 mov cr3, eax
 mov eax, cr0
 or  eax, 80000000h
 mov cr0, eax
 jmp short .3
.3:nop
 ret

;***********************************
;DispMemSize
;********************************
DispMemSize:
push esi
push edi
push ecx

 mov esi, MemChkBuf
 mov ecx, [dwMCRNumber]
.loop:
 mov edx, 5
 mov edi, ARDStruct
.1:
 push dword [esi]
 call DispInt

 pop eax
 stosd
 add esi, 4
 dec edx
 cmp edx, 0
 jnz .1
 call DispReturn
 cmp dword [dwType], 1 ;改test
 jne .2
 mov eax, [dwBaseAddrLow]
 add eax, [dwLengthLow]
 cmp eax, [dwMemSize]
 jb .2
 mov [dwMemSize], eax
.2:
 loop .loop

 call DispReturn
 push szRAMSize
 call DispStr
 add esp, 4


 push dword [dwMemSize]
 call DispInt
 add esp, 4

 pop ecx
 pop edi
 pop esi

 ret

%include "lib.inc"
SegCode32Len equ $ - LABEL_SEG_CODE32
; END of [SECTION .s32]


; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式
[SECTION .s16code]
ALIGN 32
[BITS 16]
LABEL_SEG_CODE16:
 ; 跳回实模式:
 mov ax, SelectorNormal
 mov ds, ax
 mov es, ax
 mov fs, ax
 mov gs, ax
 mov ss, ax

 mov eax, cr0
 and al, 11111110b
 mov cr0, eax

LABEL_GO_BACK_TO_REAL:
 jmp 0:LABEL_REAL_ENTRY ; 段地址会在程序开始处被设置成正确的值

Code16Len equ $ - LABEL_SEG_CODE16

; END of [SECTION .s16code]

国密套件ECC-SM2-SM4-CBC-SM3和ECDHE-SM2-WITH-SM4-SM3 双方交换各自的公钥,最后A计算点(x1,y1) = d1Q2,B计算点(x2,y2) = d2Q1,由于椭圆曲线上是可以满足乘法交换和结合律,所以 d1Q2 = d1d2G = d2d1G = d2Q1 ,因此双方的 x 坐标是一样的,所以它是共享密钥,也就是会话密钥。4、客户端和服务端分别使用工作密钥,计算主密钥,客户端随机数,服务端随机数,字符串常量"key expansion",经PRF计算生成工作密钥。工作密钥包括加密密钥和校验密钥,具体密钥长度由选择的密码算法决定。客户端支持的压缩算法列表。 阅读详情

相关推荐

域控制器开发避坑实录:从硬件设计到软件集成的5个关键挑战

本文深入剖析了域控制器开发中的5大关键挑战,从硬件选型到软件集成,涵盖智能驾驶芯片选择、实时性优化、AUTOSAR架构适配等核心问题。通过实战案例和数据对比,为工程师提供避坑指南,助力提升开发效率和系统可靠性。

weixin_29258297的博客 395

mov word [LABEL_DESC_CODE32 + 2], ax

填充描述符的段基地址的低16位 Descriptor结构的dw %1 & 0FFFFh LABEL_DESC_CODE32是整个结构的首地址,+2正好指向dw %1 & 0FFFFh域 word指内存操作数的大小是一个字,也就是两个字节

liu0808的专栏 794

脑影像分析软件推荐 | JuSpace

JuSpace是一种允许基于 MRI 测量与核成像衍生估计的跨模态关联的工具包,它涵盖各种神经递质系统,包括多巴胺能、血清素能、去甲肾上腺素能和 GABA(γ-氨基丁酸) 神经传递。JuSpace 由一组 Matlab 功能以及涵盖各种受体系统的 PET 受体图谱组成。

NHKJ_ZF的博客 1708

Linux操作系统, 构建自己的内核——5. 利用C语言绘制操作系统图像界面

课程链接: 利用C语言绘制操作系统图像界面 课程的目的是在屏幕上绘制一个图形界面,其实只需要往显存对应的缓冲区写入表示颜色的字符就行了。循环写入显然是一个不错的办法,用汇编写一个循环?一般人的汇编水平可能并不太够。所以作者提供的办法是先用c语言写,再反汇编成汇编代码。 1. kernel.asm %include "pm.inc" org 0x9000 VRAM_ADDRESS equ ...

copbint 1574

DS18B20温度传感器项目实战:从驱动编写到LCD显示,打造你的第一个温控系统

本文详细介绍了如何使用DS18B20温度传感器和LCD1602显示屏构建一个完整的温控系统。从硬件连接、OneWire协议实现到温度数据采集与LCD显示,全面解析了系统整合与工程化实现的关键步骤,帮助开发者快速掌握嵌入式温度监测系统的开发技巧。

weixin_42525328的博客 349

水电站数字孪生:水力发电在可视化领域的应用

为智慧水坝领域提供了 B/S 架构的基于 WebGL 的图形引擎,与 GIS、粒子仿真、虚拟现实、边缘计算等技术相结合,融合多元业务系统数据,形成数字孪生界面,助力水利水电工程进一步提升数字化水平,乃至为整个工业领域添砖加瓦。

二三维数据可视化/数字孪生 2255

(第三章 3)数据段/代码段描述符

一、宏定义和属性常量 (代码段/数据段描述符见P32;门描述符见P51) 下面是对代码段/数据段描述符的宏定义,目的是为了方便编写描述符。   ; 描述符 ; usage: Descriptor Base, Limit, Attr ; Base: dd --&gt;段基址4字节 ; Limit: dd (low 20 bits available) ...

chuanwang66的专栏 547

EMD (经验模态分解) 在 C++ 中的实现指南

EMD 是由 Norden E. Huang 等人在1998年提出的一种适用于非线性和非平稳信号的分析方法。对称性:IMF 的上下包络对称。零交叉点:IMF 的零交叉点数量与极值点数量相同或相差一个。本文详细介绍了如何在C++中实现EMD,包括理论背景、算法步骤、代码实现和优化等内容。通过丰富的代码示例和详细的解释,希望能够帮助读者掌握EMD的基本原理,并能够在实际项目中灵活应用。未来,随着信号处理技术的不断发展,EMD及其变种(如EEMD、CEEMDAN等)将继续在各个领域发挥重要作用。

qq_38334677的博客 1749

pmtest8.asm

有个bug 找了半天,以前的代码都是 LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C| DA_32; 现在的代码却是 LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_CR| DA_32; 非一致代码段 就因为这个原因导致程序出...

lhm的博客 712

企业财务共享服务中心业务蓝图规划方案【附全文阅读】

《企业财务共享服务中心业务蓝图规划方案》为集团企业提供财务共享中心建设全流程指导,涵盖战略定位、组织架构、业务流程、信息系统、运营管理和变革实施六大维度。方案明确共享中心"交易处理+战略支撑"双重职能,设计专业分组架构,筛选标准化高、价值明确的流程(如核算、资金结算等)纳入共享范围,构建业财一体化平台,并配套绩效与风险管控体系。结合项目型企业管理特点,分阶段推进实施,助力企业实现财务集中化与标准化转型。

cdfunlove的博客 994

YOLOv11官方代码库与预训练模型下载:介绍Ultralytics官方GitHub及模型权重(yolov11n.pt, yolov11s.pt等)

本文介绍了Ultralytics官方GitHub仓库和YOLOv11预训练模型。Ultralytics仓库是YOLO系列算法的官方实现,包含YOLOv11最新代码、预训练模型、文档和工具。仓库采用清晰的代码结构和活跃的更新策略,支持全流程开发。YOLOv11提供了5种不同规模的模型变体(YOLOv11n/s/m/l/x),在精度、速度和模型大小间权衡,适用于从移动设备到高精度检测等不同场景。各模型在COCO数据集上预训练,可直接使用或微调,满足多样化应用需求。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 5832

操作系统开发系列—2.进入32位保护模式

源码如下: ; ========================================== ; pm.asm ; 编译方法:nasm pm.asm -o pm.bin ; ========================================== %include "pm.inc" ; 常量, 宏, 以及一些说明 org 07c00h jmp LAB...

weixin_30907523的博客 234

推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐,业界广告推荐技术最新进展

推荐算法其实本质上是一种信息处理逻辑,当获取了用户与内容的信息之后,按照一定的逻辑处理信息后,产生推荐结果。热度排行榜就是最简单的一种推荐方法,它依赖的逻辑就是当一个内容被大多数用户喜欢,那大概率其他用户也会喜欢。但是基于粗放的推荐往往会不够精确,想要挖掘用户个性化的,小众化的兴趣,需要制定复杂的规则运算逻辑,并由机器完成。召回:当用户以及内容量比较大的时候,往往先通过召回策略,将百万量级的内容先缩小到百量级。

丨汀、的博客 7591

(第三章 11)克勤克俭用内存——DispStr函数显示字符串

DispStr调用方法: [SECTION .data1] [BITS 32] ... _szPMMessage: db "In Protect Mode now. ^-^",0Ah,0Ah,0 ;保护模式显示 szPMMessage equ _szPMMessage - $$ push szPMMessage call DispStr add esp, 4 ...

chuanwang66的专栏 1067

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【操作系统】Oranges学习笔记(二) 第三章3 页式存储

文章目录3.3 页式存储1. 分页机制概述2. PDE和PTE3. CR34. 编写代码启动分页机制5. 克勤克俭用内存(1) 取得内存信息(2) 计算PDE和PTE数量6. 进一步体会分页机制 3.3 页式存储 常见的几个问题: 什么是"段",什么是"页":段是信息的逻辑单位,它含有一组其意义相对完整的信息,分段的目的是为了更好地满足用户的需要;页是一块内存,是信息的物理单位,分页是出于系统管理的需要,提高内存的利用率。页的大小在不同的机器上都不同,这里只讨论页大小为 4KB 的情况; 逻辑地址、线性

memcpy0的博客 1592

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

页式存储-

页:就是一块内存,在80386中,页的大小是固定的4096字节 逻辑地址、线性地址、物理地址:在未打开分页机制时,线性地址等同于物理地址(逻辑地址通过分段机制直接转换成物理地址);当分页开启时,情况发生变化,分段机制将逻辑地址转换成线性地址,线性地址再通过分页机制转换成物理地址(分页机制类似于一个函数)。 为什么分页:分段管理机制已经提供了很好的保护机制,分页主要目的在于实现虚拟存储器,线性地址中任意一个页都能映射到物理地址中的任何一个页,这无疑使得内存管理变得相当灵活 编写代码启动分页机制 克勤.

AnitaSun的博客 1531

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

于渊-动手写操作系统3

我们之前已经通过boot.asm成功的把loader.bin加载内存0900h:0100处了,那么我们现在就要来写真正的loader.asm了。 loader.asm完成一下三件事: 第一件事与boot.asm一样,通过遍历根目录区条目找到我们后面自己写的操作系统内核,即我们的kernel 第二件事就是从实模式切换到保护模式 第三件事就是启动分页机制 第四件事就是把我们的kernel...

jj_chen_lian的专栏 259

你好,你好。

最近一直在看《Orange's一个操作系统的实现》第二版,这是一本很有意思的书,完全从实验的方法展示一个简单操作系统的启动、进程管理、内存管理等方面。随书光盘可以在这里下载 前天读到第三章《保护模式(Protect Mode)》的3.3节《页式存储》,在实验3.3.6小节《克勤克俭用内存》的程序的时候,遇到了问题。代码见这里 安装程序设计的流程,程序为一个COM,先获得内存的e820图,初始化

子扉居 737

软件测试文档3.0

软件测试文档 引言 1.1编写目的 为此次飞机大战软件提供完善的测试指导,组内人员能够根据测试计划宏观调配,合理做资源配置,测试人员能够了解整个项目测试情况以及测试阶段所要进行的工作内容,便于其他人员了解测试人员的工作内容,进行相关配合工作。 1.2项目背景 项目名称:飞机大战 项目的提出者:王依民 项目开发者:王依民、胡晓倩、殷悦、胡应财、李克勤 用户:游戏玩家...

weixin_30394633的博客 231

用gdb配合内核转储文件瞬间定位段错误

真心很有帮助 转自浅墨的博客:http://toqianmo.sinaapp.com/        前几天在写一个使用Huffman算法的文本压缩程序时被“段错误”折磨了好长时间。因为自己向来对内存的使用保持着“克勤克俭”的作风,所以总是被此类错误折磨的焦头难额。C语言的内存管理本来就是一个繁琐的工作,写代码时略有不慎便会出现诸如“段错误(吐核)”的运行时崩溃。    其实

Silence神乐 2397

于渊-动手写操作系统5

下面进行分页机制的实现,这里我们先来说说为什么要进行分页?我们看到分段机制已经提供了很好的保护机制,那为什么还要加上分页管理机制呢?其实它的主要目的在于实现虚拟存储器,线性地址中任意一个页都能映射到物理地址中的任何一个页,这无疑使得内存管理变得相当的灵活。 逻辑地址------采用分段机制-------线性地址-------采用分页机制---------物理地址 从上面看出如果有开启分页机...

jj_chen_lian的专栏 248

爬虫实战——何时使用多线程,何时使用多进程

线程是cpu调度的基本最小单位,cpu调动最小资源,通过线程执行资源,一个进程可以拿着资源开若干个线程,不同线程之间交替执行。运行中的程序,独立的运行程序,进程是资源的基本最小单位,有独立内存,是并行操作。线程是不能随便创建的,所以需要控制线程数量,线程池可以完成这项工作。继thread并重写Thread的run方法。多进程:多个任务相互独立,很少有交集。多线程:任务相对统一,互相特别相似。同时发生任务,并行。

wurobb的博客 206

面向大数据处理的数据流编程模型和工具综述

点击上方蓝字关注我们 面向大数据处理的数据流编程模型和工具综述邹骁锋,阳王东,容学成,李肯立,李克勤湖南大学信息科学与工程学院,湖南 长沙 410008论文引用格式:邹骁锋...

weixin_45585364的博客 2395

别再死记硬背!用STM32F407的DSP库玩转矩阵:浮点与定点Q格式的抉择指南

本文深入探讨了STM32F407的DSP库在矩阵运算中的应用,对比了浮点与定点Q格式的性能差异。通过实测数据和分析,帮助开发者在精度与效率之间做出明智选择,优化嵌入式信号处理应用的性能。

weixin_30861797的博客 499

软件测试计划文档

所以,对于战机攻速,敌机出现频率,各道具的效果等的控制为本游戏最重要的环节,需要开发者反复思考、反复揣摩、反复调试。为此次飞机大战软件提供完善的测试指导,组内人员能够根据测试计划宏观调配,合理做资源配置,测试人员能够了解整个项目测试情况以及测试阶段所要进行的工作内容,便于其他人员了解测试人员的工作内容,进行相关配合工作。(8)战机大招:游戏过程中会随机降落清屏道具,吃下红色降落伞道具获取清屏功能,道具数量会叠加,按下道具按钮每次消耗一个道具可发动大招,对屏幕中的敌机进行清屏。学完即可就业,别在盲目自学!

ada4656的博客 225

于渊-动手写操作系统4

操作系统版本五学习内容: 现在我们开始从实模式到保护模式的跳跃了。下面我们先来说说什么是保护模式。 之前我们的实模式的寄存器只有16位,那么它的寻址范围就是 段地址(16位)*16+偏移地址(16位),所以它的寻址能力是非常有限的,那么假如切换到保护模式去的话CPU就有巨大的寻址能力,那么有人就会问Intel为什么不设计32位的段寄存器呢,那是Intel想向下兼容以前那些采用16位寄存器设...

jj_chen_lian的专栏 272
上一篇: 第三章 2.3实验
下一篇: 在感动与创新中走进2009——开复新年寄语
醉醉酒
博客等级 码龄19年 9粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值