本期源码,欢迎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.结果


验证成功!


最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



