III. Quản lý vùng nhớ và Tổ chức, thi hành File dới
DOS.
1. Sơ đồ vùng nhớ dới DOS.
Vùng RAM nằm trong quyền điều khiển của DOS đợc chia thành hai
phần chính:
- Phần hệ điều hành:
Bắt đầu từ địa chỉ thấp nhất 00000, nghĩa là nó bao gồm cả bảng
vector ngắt, hệ điều hành (bao gồm các file hệ thống IO.SYS,
MSDOS.SYS, các device driver đợc khai báo trong config.sys và phần th-
ờng trú của COMMAND.COM.
Phần vùng nhớ của hệ điều hành này có kích thớc thay đổi tuỳ theo
Version và tuỳ theo số lợng các Device Driver.
- Phần chơng trình tạm thời:
Phần nhớ này còn đợc gọi là vùng nhớ hoạt động, là vùng nhớ ngay
sau vùng hệ điều hành và đạt đến địa chỉ cao nhất có thể. Vùng nhớ này đ-
ợc tổ chức thành các khối tạo thành chuỗi. Các file đợc tải lên và thi hành
trong vùng nhớ này, cho nên vùng nhớ này chỉ mang tính tạm thời.
Sơ đồ sau tóm tắt cấu trúc vùng nhớ:
Địa chỉ Mô tả chức năng vùng nhớ
0000:000
0
Bảng vector ngắt: 256 * 4 byte.
0040:000
0
Vùng dữ liệu của ROM BIOS.
0050:000
0
Vùng dữ liệu của DOS.
xxxx:000
0
Đoạn mã BIOS ở mức thấp của DOS.
Vùng nhớ màn hình CGA.
C800:000
0
Bắt đầu từ đây là vùng nhớ ROM (ngoại trú và nội
trú)
2. Một số chức năng liên quan đến vùng nhớ của DOS.
a. Cấp phát vùng nhớ.
Vào:
AH = 48h
BX = Kích thớc vùng nhớ cần cấp phát (tính theo paragraph).
Gọi Int 21h
Ra:
Nếu CF = 1, thì AX chứa mã lỗi và BX là số vùng nhớ tối đa còn
lại còn dùng đợc. Ngợc lại, nếu CF = 0 thì việc cấp phát
thành công và AX chính là segment của vùng nhớ mà DOS
đã cấp phát theo yêu cầu.
b. Giải phóng vùng nhớ.
Chức năng này dùng để yêu cầu DOS giải phóng vùng nhớ đã cấp phát
trớc đây mà bây giờ không còn sử dụng đến chúng. Khi chấm dứt một ch-
ơng trình do DOS tải và thi hành, quyền điều khiển đợc trả lại cho DOS,
khi đó chính DOS cũng dùng chức năng này để giải phóng vùng nhớ trớc
đây đã cấp phát cho chơng trình.
Vào:
AH = 49h
ES = Segment của vùng nhớ cần giải phóng
Ra:
Nếu cờ CF = 1 là có lỗi, khi đó AX chứa mã lỗi.
c. Điều chỉnh kích thớc vùng nhớ.
Vào:
AH = 4Ah
đang đợc dùng cho chơng trình nào. Nếu giá trị là 0 thì cha có chơng trình
nào sử dụng, ngợc lại noc là giá trị PSP của chơng trình đã xin cấp phát
vùng nhớ này. Căn cứ vào giá trị trong PSP mà DOS biết đợc vùng nhớ nào
là của chơng trình vừa chấm dứt để giải phóng vùng nhớ đó.
- Size: Là kích thớc theo đoạn của khối vùng nhớ mà MCB quản lý.
Để xác định đợc MCB đầu tiên, dùng chức năng 52h của ngắt 21h.
Sau khi thực hiện chức năng này, ES:BX trỏ tới khối tham biến của DOS
mà trớc đó 2 byte (ở ES:[BX-2]) là giá trị segment của MCB đầu tiên. Các
MCB tiếp theo sẽ đợc tính bằng cách cộng kích thớc của khối MCB trớc nó
với 1.
Đoạn chơng trình sau minh họa cách duyệt qua các MCB:
mov ah,52h
int 21h
sub bx,2
mov ax,word ptr es:[bx]
mov es,ax ; es = đoạn của MCB đầu tiên
Next:
mov al,byte ptr es:[0] ; Lấy ID của MCB
cmp al,5Ah ; Là phần tử cuối?
je OK ; đúng, kết thúc
mov bx,word ptr es:[1] ; bx = PSP
mov ax,word ptr es:[3] ; ax = Size
call Print_MCB
mov dx,ax
mov ax,es
add ax,dx
inc ax
mov es,ax
jmp Next
OK: