CÁC CHỨC NĂNG VỀ FILE VÀ THƯ MỤC CỦA HỆ ĐIỀU HÀNH DOS
CHÖÔNG 16 CÁC FILE CHƯƠNG TRÌNH CỦA DOS
Khi thực hiện các chương trình, hệ điều hành nạp các file chương trình vào bộ nhớ và chuyển quyền cho chúng. Mỗi hệ điều hành sẽ quy định một số dạng thức riêng (format) về cách mô tả và tổ chức bên trong của file chương trình. Hệ điều hành DOS có hai dạng thức cho file chương trình là COM và EXE.
16.1FILE DẠNG COM
Khi DOS thực hiện một file chương trình dạng COM, nó sẽ qua các bước sau:
Thiết lập một environment segment.
Tạo một PSP.
Đọc toàn bộ file chương trình vào ngay sau PSP (offset 100h) Gán các thanh ghi segment bằng với địa chỉ của PSP.
Cho SP=offset cuối của segment SS rồi push 0 thực hiện lệnh JMP PSP:0100h Như vậy file chương trình dạng COM có các đặc điểm sau :
Kích thước file phải nhỏ hơn 65536 - 100h - 2 Bắt đầu tại offset 0100h
Tất cả chương trình trong một segment
File chương trình và chương trình khi thực hiện hoàn toàn giống nhau Các chương trình dạng COM thông thường kết thúc bằng Int 020h 16.2FILE DẠNG EXE
Khác với file dạng COM, các file dạng EXE có một cấu trúc đầu file (Exe header) dùng để lưu giữ các mô tả về cách sắp xếp, vị trí bắt đầu của chương trình ...
Cấu trúc của một Exe header:
Offs Size Contents
==== ====
==================================================================
+0 2 |4Dh 5aH| Dấu hiệu nhận diện EXE file (‘MZ’ hoặc ‘ZM’) |---
+2 2 |PartPag| kích thước thực của load module ở trang cuối |---
+4 2 |PageCnt| số trang 512 bytes chứa load module và header |---
+6 2 |ReloCnt| số phần tử trong relocation table |---
+8 2 |HdrSize| kích thước header tính bằng paragraph (16 bytes) |---
+0aH 2 |MinMemKích thước bộ nhớ tối thiểu sau load module (paragraphs) |---
+0cH 2 |MaxMemKích thước bộ nhớ tối đa sau load module (paragraphs) |---
+0eH 2 |ReloSSVị trí tương đối của stack segment SS (paragraphs) |---
+10H 2 |ExeSPGiá trị khởi đầu của SP |---
+12H 2 |ChkSumtổng tất cả các word trong file nhân với -1 |---
+14H 2 |ExeIPGiá trị khởi đầu của IP |---
+16H 2 |ReloCSVị trí tương đối của code segment CS (paragraphs) |---
+18H 2 |TablOff| Vị trí của relocation table trong EXE file |---
+1aH 2 |Overlay| số phần tử overlay ---
1cH điểm kết thúc của cấu trúc EXE header --- - - |---
? 4*? |offset segment| |offset segment| Relocation table.
--- - - Ĩ---
? ? điền các giá trị 0 cho đầy paragraph cuối.
? ? điểm kết thúc của EXE header
Khi thực hiện một file chương trình dạng EXE, DOS sẽ qua các bước sau:
Đọc 1Ch bytes từ Exe Header ( offset 0 của EXE file ) Xác định kích thước bộ nhớ cần thiết cho Exe file LoadSize = PageCnt*512 - HdrSize*16 - PartPag
LoadSize + MinMem + 100h <= ExeMem <= LoadSize + MaxMem + 100h ( 100h = kích thước của PSP )
ExeMem được xác định tùy theo số lượng bộ nhớ còn lại của hệ thống.
ExeMem sẽ lấy giá trị lớn nhất có thể được trong khoảng đã nêu.
Thiết lập một environment segment.
Xin cấp phát một vùng nhớ với kích thước ExeMem.
Tạo một PSP.
Xác định Start—seg. (Thông thường Start—seg = PSP+10h).
Đọc load module vào bộ nhớ (bắt đầu từ Start—seg:0000) Load module bắt đầu từ offset HdrSize*16 trong EXE file Load module có kích thước bằng :
PageCnt*512 - HdrSize*16 - PartPag
Thực hiện định vị lại các giá trị segment trong load module ( Xem thí dụ ) Gán các giá trị khởi đầu cho các thanh ghi
DS = ES = PSP
SS = Start—seg + ReloSS, SP = ExeSP CS = Start—seg + ReloCS, IP = ExeIP (Thực hiện JMP CS—value:IP—value
hoặc PUSH CS—value ; PUSH IP—value ; RETF ) Đặc điểm của file chương trình dạng Exe là : Kích thước file chương trình không có giới hạn Số segment trong chương trình không giới hạn
Điểm khởi đầu, vị trí của STACK ... được quy định trong bản thân chương trình
File chương trình và chương trình khi thực hiện không hoàn toàn giống nhau : quá trình load đã sửa đổi các giá trị segment trong chương trình cho phù hợp với vị trí được nạp. Mặt khác khi thực hiện, không phải khi nào toàn bộ chương trình cũng được nạp lên.
Các chương trình dạng EXE thông thường kết thúc bằng Int 021h chức năng 4Ch Thí dụ định vị lại các giá trị segment của load module:
; DS:SI = ỴRelocation table
; CX = ReloCnt ; DX = Start—Seg
; Load module đã được đọc vào Start—Seg cld
LL1: lodsw ; offset of ReloItem mov di,ax
lodsw ; Relative Segment of ReloItem add ax,dx ; Adjust to Real Segment mov es,ax
add word ptr es:[di],dx ; Adjust ReloItem loop LL1
16.3PROGRAM SEGMENT PREFIX (PSP)
Các thông tin về chương trình đang thực hiện như tham số dòng lệnh, bộ nhớ thuộc về chương trình ... được lưu chứa trong một cấu trúc đặc biệt gọi là PSP.
Cấu trúc của PSP:
Offs Size
+0 2 |INT 20H| EXE programs may JMP or RET here (PSP:0) to exit |---
+2 2 |MemTopBiên trên vùng nhớ thuộc về chương trình (paragraph) |---|----
+4 1| (reserved) |---|---
+5 5 |CALL offset segment| FAR CALL to DOS function dispatcher ----|---|---
+6 (2)Availkích thước của Segment chương trình ---|---|---- (Trường hợp COM file)
+0aH 4 |offset segment| Terminate address. INT 22H |---|---
+0eH 4 |offset segment| Ctrl-Break handler address INT 23H |---|---
+12H 4 |offset segment| Critical Error handler addr INT 24H |--- - ---
+16H 16HDOS reserved area | |---|--- - ---
+2cH 2 |EnvSegĐịa chỉ của environment (segment) |--- - ---
+2eH 2eHDOS reserved area | |--- - ---
+5cH 10Hformatted parm area 1setup as an FCB for 1st cmd parameter |--- - ---
+6cH 14Hformatted parm area 2setup as an FCB for 2nd cmd parameter |---|--- - ---
+80H 1 |len| Số ký tự trong tham số dòng lệnh |--- - ---
+81H 7fHUnformatted Parm AreaTham số dòng lệnh --- - ---
+FFH Điểm kết thúc PSP
Trước khi chuyển quyền, DOS chỉ định PSP:080h là địa chỉ cho DTA mặc nhiên của chương trình.
16.4ENVIRONMENT
Environment là một vùng nhớ lưu chứa các chuỗi ASCIIZ liên tiếp nhau. Các chuỗi ấy có dạng thức : name=value. Với name là các “biến môi trường” của DOS như COMSPEC,PATH,PROMPT ... được thiết lập bởi lệnh SET.
Thí dụ về thông tin bên trong một environment: (biểu diễn bằng hợp ngữ) db ‘COMSPEC=c:\command.com’,0 ; Danh sách các biến môi db ‘PROMPT=$p$g’,0 ; trường của DOS
db ‘PATH=c:\;c:\dos;c:\utils’,0 ; db ‘TEMP=c:\windows\temp’,0 ; db 0 ; Kết thúc danh sách
dw 1 ; Số Exec—String tiếp theo ; Thông thường là 1
db ‘C:\UTILS\HDDIAG.EXE’,0 ; Tên của chương trình được
; thực hiện (bao gồm cả PATH) db 0
Chương 17
Cấu trúc device của MSDOS