III. Quản lý vùng nhớ vμ Tổ chức, thi hμnh File d−ới DOS.
4. Quản lý và tổ chức thi hành File d−ới DOS.
a. Phân loại File.
File là một cách tổ chức dữ liệu trên đĩa để DOS quản lý. Căn cứ vào mục đích và nội dung, File đ−ợc phân ra thành hai loại chính:
- File dữ liệu: Dùng để chứa thơng tin về một đối t−ợng. Dữ liệu có thể ở dạng Text hoặc dạng nhị phân. Để truy xuất các thơng tin nh− vậy cần có các ch−ơng trình thi hành đ−ợc truy xuất đến nó.
- File thi hành: Nội dung của nó là tập mã lệnh máy nhằm thi hành một nhiệm vụ nào đó. Khi thi hành, đánh tên ch−ơng trình tại dấu đợi lệnh của DOS, hoặc dùng chức năng 4Bh của Int 21h. File thi hành có đi .COM hoặc .EXE
b. Cách tổ chức thi hành File khả thi của DOS.
Để tổ chức thi hành một File khả thi, DOS tiến hành các b−ớc sau đây: - DOS tiến hành chọn một segment, địa chỉ segment này th−ờng là địa chỉ thấp nhất còn dùng đ−ợc. Segment đ−ợc chọn gọi là PSP (Program Segment Prefix), là cơ sở để tải ch−ơng trình vào.
- DOS tạo ra bản sao mơi tr−ờng của DOS cho ch−ơng trình đ−ợc nạp. - DOS điền vào PSP những nội dung cần thiết nh−: tổng số vùng nhớ cịn lại, địa chỉ Segment của mơi tr−ờng, 2 FCB, tham số dòng lệnh và DTA, nội dung hiện thời của các ngắt 22h, 23h, 24h.
- Tạo DTA ngầm định tại PSP:80h
- Đọc 1Ch byte đầu của file vào để xác định xem file thuộc loại COM/EXE. Dấu hiệu để nhận dạng file .EXE là giá trị của hai byte đầu tiên là 4D5Ah hay 5A4Dh. Tùy theo loại file, tổ chức thi hành file sẽ đ−ợc thực hiện t−ơng ứng.
c. PSP (Program Segment Prefix).
Nh− chúng ta đã nói ở trên, PSP là cấu trúc do DOS tạo ra tr−ớc khi tải file cần thi hành vào vùng nhớ.
Cấu trúc PSP gồm 256 byte (100h), mô tả về cấu trúc này nh− sau: Offse
t
Siz e
Item Nội dung
+0 2 Int 20h Ngắt chấm dứt ch−ơng trình
+2 2 MemTop Segment vùng nhớ kế còn dùng đ−ợc +4 1 Reseved Dành riêng, th−ờng là 0
offset seg
DOS
+0Ah 4 Địa chỉ kết thúc ch−ơng trình (Int 22h) +0Eh 4 Địa chỉ xử lý CtrlÄBreak (Int 23h)
+12h 4 Địa chỉ xử lý lỗi nghiêm trọng (Int 24h)
+16h 16h Reseved Vùng dành riêng cho DOS
+2Ch 2 Địa chỉ đoạn các xâu môi tr−ờng của DOS
+2Eh 2E h
Reseved Vùng dành riêng cho DOS +55h 7 FCB mở rộng 1
+5Ch 9 FCB 1
+65h 7 FCB mở rộng 2
+6Ch 20 FCB 2
+80h 1 Chiều dài tham số nhập từ dấu nhắc của DOS
+81h 127 Các tham số nhập từ dấu nhắc của DOS
+80h 128 Vùng DTA mặc định
d. Thi hành file .COM
Sau khi nhận diện file dạng .COM, file đ−ợc tải ngay vào sau PSP mà không cần định vị lại, do đó kích th−ớc của nó bị giới hạn trong một phân đoạn 64K. DOS tiến hành thi hành file .COM nh− sau:
- Tất cả các thanh ghi đoạn CS, DS, SS, ES đều trỏ tới PSP. - SP đ−ợc định vị để trỏ tới cuối segment PSP.
- Tất cả mọi vùng nhớ đều đ−ợc phân phối cho ch−ơng trình.
- Một giá trị 0 đ−ợc đẩy vào stack, điều này đảm bảo sự kết thúc chắc chắn của ch−ơng trình nếu cối ch−ơng trình là lênh RET thay cho lệnh Int 20h.
- Trao quyền điều khiển cho ch−ơng trình (CS:IP) ngay tại đầu vào PSP:100h.
e. Thi hành file EXE.
Khác với file .COM, file .EXE không bị giới hạn trong một phân đoạn mà có thể mở rộng trong nhiều phân đoạn. Vì vậy, khi đ−ợc nạp vào vùng nhớ, nó phải đ−ợc định vị lại (Reallocate) theo các tham số trong một cấu trúc đầu file đ−ợc gọi là Exe Header. Cấu trúc này nh− sau:
Offse t
Siz e
Item Nội dung
+0 2 4D5Ah Ký hiệu nhận dạng file .EXE +2 2 PartPag Chiều dài của phần trang cuối +4 2 PageCn
t
Số trang (512 byte/trang) kể cả Header +6 2 ReloCnt Số mục trong bảng tái định vị
+8 2 HdrSize Kích th−ớc của Header (theo paragraph)
+0Ah 2 MinMe m
Vùng nhớ tối thiểu cần trên ch−ơng trình (theo paragraph)
+0Ch 2 MaxMe m
Vùng nhớ tối đa cần trên ch−ơng trình (theo paragraph)
+0Eh 2 ReloSS Giá trị để khởi tạo SS
+10h 2 ExeSP Giá trị của thanh ghi SP khi bắt đầu. +12h 2 ChkSu
m
Offse t
Siz e
Item Nội dung
+14h 2 ExeIP Giá trị của thanh ghi IP khi bắt đầu. +16h 2 ReloCS Giá trị để khởi tạo CS
+18h 2 TablOff File-Offset của Item đầu tiên +1Ah 2 Overlay Số Overlay (0 cho module cơ sở)
Sau khi DOS đã xác định file cần thi hành là file dạng .EXE, nó sẽ tiến hành tiếp các b−ớc nh− sau:
- Căn cứ vào thông tin trên 1Ch byte đầu tiên, xác định module phải tải vào. Module là phần ch−ơng trình thực tế, khơng tính phần Exe Header, trong thực tế, phần này chính bằng kích th−ớc của file trừ đi kích th−ớc của Exe Header. Nh− vậy, điểm bắt đầu tải của module là ngay sau Exe Header (kích th−ớc Header * 10h), modul đ−ợc tải vào địa chỉ START_SEG: 0000, trong đó START_SEG = PSP + 10h.
- Đặt con trỏ file đến điểm vào của bảng tái định vị, ứng với mỗi mục (Item) của bảng này, tiến hành các b−ớc định vị lại nh− sau:
+ Đọc Item này vào 2 từ 16 bit (I_OFF và I_SEG)
+ Xác định phân đoạn RELO_SEG = START_SEG + I_SEG + Đọc giá trị tại RELO_SEG:I_OFF
+ Định vị lại bằng cách cộng giá trị vừa có đ−ợc với START_SEG + Trả lại giá trị đã đ−ợc định vị lại vào chỗ cũ RELO_SEG:I_OFF - Sau khi tái định vị xong, DOS phân phối vùng nhớ cho ch−ơng trình t−ơng ứng với vùng nhớ tối đa và tối thiểu trong Exe Header.
- Khởi tạo giá trị các thanh ghi: + DS và ES đ−ợc trỏ tới PSP + Khởi tạo Stack nh− sau:
SS = ReloSS + START_SEG SP = ExeSP
+ Đầu vào của ch−ơng trình: CS = START_SEG + ReloCS IP = ExeIP
- Trao quyền điều khiển cho file.