Thứ Sáu, 30 tháng 9, 2011

Đoạn FAT trong hình (c) ở trên cho biết các thông tin sau đây:

Như vậy, ngay sau khi quyền điều khiển được trả về cho boot sector thì hệ thống sẽ thực hiện lệnh nhảy (Jmp) ở đầu boot sector (offset 00), để nhảy đến thực hiện đoạn code bootstrap loader ở cuối boot sector (từ offset 3Ch đến offset 200h). Và bootstrap loader sẽ thực hiện nhiệm vụva mang trinhdo choi tinh ducam dao giaphau thuat tham my
     Dựa vào boot sector ta biết được nhiều thông tin về đĩa như: loại FAT, nhãn đĩa, số sector trên một cluster, số byte trên một sector, … Và từ đó ta cũng có thể tính được dung lượng của đĩa tính  theo byte:  Tổng số sector trên một tập đĩa * số byte trên một sector.   
Ví dụ: Để in ra loại FAT đang sử dụng trên đĩa mềm hoặc trên một volume trên đĩa cứng ta thực hiện như sau:
·        Đọc nội dung của boot sector lưu vào biến bootdat
·        In ra 8 kí tự bắt đầu tại offset 34h của bootdat
Mov                  cx, 8                     
              Mov             SI, 34h
     Mov             ah, 02                                       ; hàm 02h/21h in kí tự trong DL
        Loai_FAT:
              Mov             DL, byte PTR bootdat[SI]
              Int               21h
              Loop            Loai_FAT

Ø    File Allocation Table (FAT): Nội dung của một file cần lưu trữ trên đĩa được chia thành các phần có kích thước bằng nhau và bằng kích thước của một cluster, được gọi là các block file. Các block file của các file được lưu trữ tại các cluster xác định trên đĩa, các cluster chứa nội dung của một file có thể không nằm kề nhau. Để theo dõi danh sách các cluster đang chứa nội dung của một file của tất cả các file đang lưu trữ trên đĩa hệ điều hành DOS dùng bảng FAT, hay còn gọi là bảng định vị file. Bảng FAT còn dùng để ghi nhận trạng thái của các cluster trên đĩa: còn trống, đã cấp phát cho các file, bị bad không thể sử dụng hay dành riêng cho hệ điều hành. Trong quá trình khởi động máy tính hệ điều hành nạp bảng FAT vào bộ nhớ để chuẩn bị cho việc đọc/ghi các file sau này.

Khi cần ghi nội dung của một file vào đĩa hoặc khi cần đọc nội dung của một file trên đĩa hệ điều hành phải dựa vào bảng FAT, nếu bảng FAT bị hỏng thì hệ điều hành không thể ghi/đọc các file trên đĩa. Do đó, hệ điều hành DOS tạo ra hai bảng FAT hoàn toàn giống nhau là FAT1 và FAT2, DOS sử dụng FAT1 và dự phòng FAT2, nếu FAT1 bị hỏng thì DOS sẽ sử dụng FAT2 để khôi phục lại FAT1. Điều không đúng với hệ thống file FAT32, FAT32 vẫn tạo ra 2 FAT như của DOS, nhưng nếu FAT1 bị hỏng thì hệ điều hành sẽ chuyển sang sử dụng FAT2, sau đó mới khôi phục FAT1, và ngược lại.
Hệ điều hành DOS tổ chức cấp phát động các cluster cho các file trên đĩa, sau mỗi thao tác cấp phát/ thu hồi cluster thì hệ điều hành phải cập nhật lại nội dung cho cả FAT1 và FAT2. Có thể hệ điều hành chỉ thực hiện cấp phát động cluster cho các file dữ liệu (có kích thước thay đổi), còn đối với các file chương trình, file thư viện, file liên kết động, … (có kích thước không thay đổi) thì hệ điều hành sẽ thực hiện cấp tĩnh cluster cho nó.  
Bảng FAT bao gồm nhiều phần tử (điểm nhập/ mục vào), các phần tử được đánh địa chỉ bắt đầu từ 0 để phân biệt, địa chỉ cluster cũng có thể gọi là số hiệu của cluster. Giá trị dữ liệu tại một phần tử trong bảng FAT cho biết trạng thái của một cluster tương ứng trên vùng dữ liệu. Ví dụ, phần tử thứ 7 trong bảng FAT chứa giá trị 000h, giá trị này cho biết cluster thứ 7 trên vùng dữ liệu còn trống, có thể dùng để cấp phát cho một file. Phần tử thứ 5 trong bảng FAT chứa giá trị FF7h, giá trị này cho biết cluster thứ 5 trên vùng dữ liệu bị bad, không thể cấp phát được, …
Hệ điều hành DOS có thể định dạng hệ thống file theo một trong 2 loại FAT là FAT12 và FAT16. Mỗi phần tử trong FAT12 rộng 12 bít(1.5 byte), mỗi phần tử trong FAT16 rộng 16 bít(2 byte). Các đĩa hiện nay thường được DOS định dạng theo hệ thống file với FAT16. Sau đây là danh sách các giá trị dữ liệu được chứa tại các phần tử trong bảng FAT (số trong ngoặc dùng trong FAT16) và ý nghĩa của nó.
·        000h (0000h): cluster tương ứng còn để trống.
·        FF7h (FFF7h):         cluster tương ứng bị bad. Trong quá trình định dạng đĩa hệ điều hành đánh dấu loại bỏ các cluster bị bad bằng cách ghi giá trị này voà phần tử tương ứng trong bảng FAT.  
·        FF0h (FFF0h) - FF6h (FFF6h): cluster tương ứng dành riêng cho hệ điều hành.
·        FF8h (FFF8h) - FFFh (FFFFh): cluster tương ứng là cluster cuối cùng trong dãy các cluster chứa nội dung của một file.
·        002h (0002h) – FFEh (FFFEh): đây là số hiệu của cluster trong bảng FAT, nó cho biết cluster tiếp theo trong dãy các cluster chứa nội dung của một file.
Trong bảng FAT, hai phần tử đầu tiên (00 và 01) không dùng cho việc theo dõi trạng thái cluster và ghi nhận bảng đồ cấp phát file, mà nó được sử dụng để chứa một giá trị nhận biết khuôn dạng đĩa, được gọi là byte định danh (byte ID) của đĩa, đây là byte đầu tiên của bảng FAT. Đối với đĩa cứng thì byte ID = F8h.
Như vậy để đọc được nội dung của một file trên đĩa thì trước hết hệ điều hành phải tìm được dãy các cluster chứa nội dung của một file. Nhưng bảng FAT chỉ cho biết số hiệu các cluster từ cluster thứ hai đến cluster cuối cùng trong dãy nói trên. Cluster đầu tiên trong dãy các cluster chứa nội dung của một file trên đĩa được tìm thấy trong bảng thư mục gốc.
Để thấy được cách mà hệ điều hành DOS dùng bảng FAT để quản lý việc lưu trữ các file trên đĩa cũng như theo dõi trạng thái các cluster trên vùng dữ liệu, ta xem hình minh hoạ sau đây.















Hình (a) ở trên cho thấy: có hai file, FileA và FileB, FileA có kích thước vừa đủ 4 cluster và được chia thành 4 block,  FileB có kích thước nhỏ hơn 4 cluster cũng được chia thành 4 block, trong đó block B4 mặc dù chưa đủ một cluster nhưng vẫn được chứa vào một cluster. Tức là, hệ điều hành cũng phải dùng đủ 8 cluster để lưu trữ nội dung của hai file FileA va FileB vào đĩa (hình b).
Đoạn FAT trong hình (c) ở trên cho biết các thông tin sau  
·        Các cluster còn trống, chưa cấp phát: cluster 2, cluster 3, cluster 5, cluster 8. 
·        FileA được lưu tại các cluster: 4, 10, 7, 14 (chứa block cuối cùng)
·        FileB được lưu tại các cluster: 6, 9, 12, 15 (chứa block cuối cùng)

Không có nhận xét nào:

Đăng nhận xét