【汇编练习】12-验证RAM和其他内存区域OS的接管情况


公粽号「专注Linux」,专注Linux内核开发

本期源码,欢迎star:
https://github.com/ZYKWLJ/assembly4-homework

验证ROM和普通内存区域(ds)与OS的关系

0.验证的目标

上点提到,ROM不被OS接管,而其余绝大多数内存都是被OS接管的。我们通过程序验证。

1.验证思路

首先,我们明确,使用汇编直接操作底层内存,是直接对应的物理内存,不是操作系统抽象的虚拟内存。

我们已经得知,0000:00000000:03FF**区间,属于**RAM**,并且查阅资料得知,在**0000:02000000:03FF之间,没有任何系统信息(例如中断程序地址入口),所以我们在0000:0200写入数据以实现向RAM写入数据。

同时,我们使用ds段来实现向操作系统接管的内存区域中写入数据。

我们知道,如果某块内存有操作系统接管,那么进程结束后,该块内存的内容会被OS擦除,直观来看就是乱码。

由此,我们可以通过启动一写一读两个进程查看写操作进程中写入的内存区域,在读进程中是否被擦除来判断该区域是不是被OS接管的依据。

2.核心步骤

同时启动两个进程,程序1向RAM和DS段写入数据;程序2仅仅查看这两个内存区域的数据是否存在。存在则不被OS接管,不存在则被OS接管。

3.理论结果

进程2中,查看RAM的数据依然存在,ds段中的数据 不存在(是乱码)。 从而验证了RAM中的数据不被操作系统接管,但是诸如ds等内存空间,会被操作系统接管。

4.实践

程序1:写入

;编写程序,验证内存元数据区(RAM)不会被操作系统接管,所以数据在不同的进程中一致;而诸如data区会随着进程消亡被操作系统擦除。
assume cs:codesg,ds:datasg

datasg segment
    db 'this is data zone, and it will not be erased by os.',0;数据区,另一个进程启动时,不写入数据,查看数据段是不是这个一样的数据就行了。
datasg ends

codesg segment
start_:
    ;一般来说,开始的1KB是RAM区,即0000:0000-0000:03FF的1024个字节单元
    mov ax, datasg
    mov ds, ax
    mov ax, 0000h
    mov es, ax
    mov di, 0200h
    mov byte ptr es:[di], 11h;不同进程启动,未执行时,查看0000:0020处是不是这个值。如果是,则说明元数据区没有被操作系统接管,不同进程间共享数据。
end_:
     mov ax, 4c00h 
     int 21h 
codesg ends
end start_

程序2:查看

;这个程序什么都不用做,仅仅验证12-0.asm中,data段和元数据段的区别,前者会被os覆盖,后者不会。
assume cs:codesg

codesg segment
start_:
    ;一般来说,开始的1KB是RAM区,即0000:0000-0000:03FF的1024个字节单元
    ;这个程序什么都不用做,仅仅查看ds段和0000:0200的RAM区间内容,验证12-0.asm中,data段和元数据段的区别,前者会被os覆盖,后者不会。
end_:
     mov ax, 4c00h 
     int 21h 
codesg ends
end start_ 
5.结果

进程1的操作,在元数据区0000:0200和data段写入数据

进程2的操作发现元数据区仍然是进程1设置的数据,但是data段已经被os擦除了

验证成功!



汇编语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值