Trong phần này chỳng ta xem xột đến sự hoạt động của hai loại file chương trỡnh EXE và COM. Cỏc chương trỡnh dạng COM cú kớch thước giới hạn trong 64 KB, trong khi đú kớch thước của chương trỡnh dạng EXE cú thể lớn ngang bằng kớch thước của RAM. Hệ điều hành cú thể nạp một chương trỡnh dạng EXE cú kớch thước lớn hơn vào RAM nếu chương trỡnh được thiết kế với cấu trỳc thớch hợp (cấu trỳc động chẳng hạn).
Đối với cỏc chương trỡnh dạng COM, cả ba đoạn của chương trỡnh là code, data và stack đều chứa trong cựng một đoạn 64 KB. Chương trỡnh COM trờn RAM là hỡnh ảnh chớnh xỏc của nú trờn đĩa. Do đú ngay sau khi chương trỡnh COM được nạp vào bộ nhớ RAM thỡ tất cả cỏc thanh ghi đoạn đều chứa cựng một giỏ trị, đú chớnh là địa chỉ đoạn của một đoạn nhớ (64 KB) chứa cỏc đoạn của chương trỡnh, trong quỏ trỡnh hoạt động của chương trỡnh giỏ trị cỏc thanh ghi đoạn khụng thay đổi, ngoại trừ thành ghi đoạn ES cú thể thay đổi. Đối với cỏc chương trỡnh dạng EXE ba đoạn của chương trỡnh là code,
data và stack cú thể được nạp vào ba đoạn bộ nhớ khỏc nhau, và cú thể một đoạn của chương trỡnh, tuỳ theo kớch thước của nú, mà nú cú thể được nạp vào nhiều hơn một đoạn bộ nhớ. Do đú ngay sau khi chương trỡnh được nạp vào bộ nhớ cỏc thanh ghi đoạn đều được khởi tạo bằng cỏc giỏ trị khỏc nhau (cú thể DS = ES), đú chớnh là địa chỉ đoạn của cỏc đoạn bộ nhớ chứa cỏc đoạn chương trỡnh tương ứng. Trong quỏ trỡnh hoạt động của chương trỡnh cú thể giỏ trị của thanh ghi CS bị thay đổi. Chương trỡnh dạng EXE trờn bộ nhớ RAM khụng phải là hỡnh ảnh trung thực của nú ở trờn đĩa mà nú được mó hoỏ theo một cỏch nào đú. Hỡnh 3.15 sau đõy minh họa cho điều này.
Một chương trỡnh dạng COM khụng thể vượt quỏ giới hạn 64 Kb kể cả 256 byte PSP và 1 word khởi tạo stack. Mặt dự vậy nhưng khi nạp một chương trỡnh COM vào bộ nhớ DOS vẫn dành hết bộ nhớ cũn lại cho chương trỡnh, điều này gõy lóng phớ bộ nhớ, do đú chương trỡnh COM khụng thể gọi một chương trỡnh khỏc thụng qua hàm EXEC, nếu trước đú chương trỡnh khụng giải phúng khối nhớ thừa mà hệ điều hành đó cấp cho chương trỡnh. Vỡ chương chương trỡnh COM được nạp ngay sau PSP của nú trong bộ nhớ nờn ngay sau khi điều khiển được chuyển cho chương trỡnh COM thỡ cỏc thanh ghi đoạn đều hướng tới đầu PSP, thanh ghi con trỏ lệnh (IP) nhận giỏ trị offset 100h và thanh ghi con trỏ stack (SP) nhận giỏ trị offset FFFEh (vỡ stack ở vựng cao của đoạn 64 Kb và luụn được khởi tạo bởi một phần tử 2 byte). DOS khụng nạp chương trỡnh COM vào một địa chỉ xỏc định trước và khụng cho phộp thực hiện một lời gọi xa (FAR) trong chương trỡnh.
Chương trỡnh dạng EXE khụng bị giới hạn kớch thước một segment (64 Kb) mà nú cú thể vượt quỏ giới hạn của 3 segment, nhờ đú mà người lập trỡnh cú thể thiết kế được cỏc chương trỡnh với nhiều chức năng hơn. Tuy nhiờn điều này làm cho cấu trỳc của chương trỡnh sẽ phức tạp hơn, nú phải chứa nhiều thụng tin liờn quan đến chương trỡnh hơn, cỏc thụng tin này là cần thiết để hệ điều hành nạp chương trỡnh vào bộ nhớ và điều khiển việc thực hiện của chương trỡnh. Cỏc chương trỡnh EXE khụng được nạp vào cỏc đoạn bộ nhớ xỏc định trước mà cú thể được nạp vào một vị trớ bất kỳ (cú địa chỉ là bội nguyờn của 16). Trong chương trỡnh dạng EXE cú thể gọi một chương trỡnh khỏc thụng qua hàm EXEC và cú thể thực hiện cỏc lời gọi xa để gọi một chương trỡnh con ở đoạn nhớ khỏc.
Chương III: Quản lý Bộ nhớ 127
CodePSP PSP SS CS DS ES 100h Code PSP Stack 100h COM EXE
Hỡnh 3.15: Cỏc thanh ghi con trỏ đoạn ngay sau khi khởi tạo chương trỡnh: chương trỡnh EXE so với chương trỡnh COM.
Trong giai đoạn biờn dịch và liờn kết chương trỡnh, chương trỡnh liờn kết LINK đặt vào đầu cỏc file chương trỡnh EXE một cấu trỳc dữ liệu đặc biệt được gọi là Header của chương trỡnh. Header chứa nhiều thụng tin liờn quan đến chương trỡnh như kớch thước header, kớch thước chương trỡnh, giỏ trị khởi tạo của IP và SP, địa chỉ bắt đầu của đoạn code trong file EXE, … và đặc biệt là địa chỉ tương đối của cỏc đoạn. Địa chỉ đoạn thực tế trong bộ nhớ RAM nhận được bằng cỏch cộng địa chỉ tương đối này với địa chỉ của đoạn mà chương trỡnh được nạp vào (địa chỉ đoạn bắt đầu). Địa chỉ đoạn bắt đầu thường là địa chỉ đoạn của PSP cộng với 10h.
Khi hệ điều hành nạp một chương trỡnh EXE vào bộ nhớ nú biết được địa chỉ cỏc ụ nhớ chứa cỏc địa chỉ đoạn cần thay đổi cho phự hợp, hệ điều hành viết lại cỏc giỏ trị này bằng cỏch cộng cỏc giỏ trị trong đú với địa chỉ đoạn bắt đầu. Thao tỏc này cú thể làm chậm tốc độ nạp cỏc chương trỡnh EXE. Sau khi cỏc địa chỉ đoạn được sửa thành cỏc địa chỉ cú hiệu lực thỡ hệ điều hành cố định cỏc thanh ghi đoạn DS và ES theo đầu của PSP (DS = ES = PSP). Do đú chương trỡnh EXE cú thể truy cập dễ dàng đến cỏc thụng tin trong PSP.
Cỏc bạn cú thể tỡm hiểu rừ hơn về cấu trỳc và lợi ớch của header ở một tài liệu khỏc viết về cỏc file EXE trong hệ điều hành MS_DOS.
III.5.c. Memory Control Block (MCB):
Hệ điều hành MS_DOS là hệ điều hành đơn nhiệm đa chương, nờn nú cho phộp nạp nhiều hơn một chương trỡnh vào bộ nhớ chớnh (RAM), mặc dự tại một thời điểm nhất định chỉ cú duy nhất một chương trỡnh thực hiện.
Theo MS_DOS thỡ khụng gian bộ nhớ chớnh được chia thành 2 phần: phần thấp nhất (640B đầu tiờn) được gọi là vựng bọ nhớ quy ước (conventional area). Phần cũn lại được gọi là vựng nhớ trờn (upper area). Cỏc chương trỡnh của người sử dụng phải nạp vào vựng nhớ quy ước để hoạt động. Vựng nhớ quy ước được chia thành hai phần: phần thấp nhất chứa cỏc thành phần chớnh của hệ điều hành như là bảng vector ngắt, io.sys, msdos.sys, cỏc chương trỡnh điều khiển thiết bị, phần thường trực của command.com, vv. Phần cũn lại của vựng quy ước được gọi là vựng TPA (Transient Program Area), tất cả cỏc chương trỡnh của người sử dụng phải được chạy tại đõy. Như vậy, khụng phụ thuộc vào kớch thước của bộ nhớ chớnh, MS_DOS chỉ dành chưa đầy 640KB cho cỏc chương trỡnh của người sử dụng và cỏc khối tham số mụi trường tương ứng. Vựng nhớ trờn được chia thành nhiều vựng nhỏ khỏc nhau như là video RAM, ROM BIOS, cỏc điều khiển I/O, vv.
Để quản lý cỏc khối nhớ đó được chia trờn vựng nhớ cũng như cỏc chương trỡnh đó được nạp vào vựng TPA hệ điều hành MS_DOS sử dụng cỏc khối điều khiển bộ nhớ MCB. Mỗi MCB dài 16 byte (1 paragraphe), quản lý một vựng nhớ nằm ngay sau nú. Khi cú một chương trỡnh cần được nạp vào bộ nhớ, tựy theo yờu cầu bộ nhớ của chương trỡnh mà DOS cung cấp cho chương trỡnh một vựng nhớ, vựng nhớ này sẽ được quản lý bởi một MCB đứng ngay trước nú. Hỡnh 3.16 sau đõy minh họa cho điều này.
Memory Control Block1 Được quản lý bởi MCB1
Memory ControlBlock2
Được quản lý bởi MCB2
MCB3 (MCB cuối cựng) Được quản lý bởi MCB3
0000:0000Bắt đầu Bắt đầu vựng TPA Kết thỳc vựng TPA H i u h nh ệđ ề à Hệ điều hành Liờn kết giữa cỏc MCB
Cấu trỳc của một MCB đựoc mụ tả ở hỡnh dưới. Trong đú:
• Trường ID: định danh MCB, ID = ‘Z’: đõy là MCB cuối cựng, ID = ‘M’: chưa phải là MCB cuối cựng.
• Trường địa chỉ PSP: đõy là địa chỉ đoạn của PSP tương ứng của chương trỡnh. Nếu vựng nhớ được cấp là khối mụi trường của một chương trỡnh thỡ trường này chỉ ra địa chỉ PSP của chớnh chương trỡnh. Ngược lại nếu vựng nhớ được cấp là một PSP thỡ trong đa số trường hợp trường này chỉ ra chớnh vựng nhớ của chương trỡnh.
1byte 2 byte 2 byte 11 byte
ID Địa chỉ PSP Số lượng byte Hỡnh 3.17: Cấu trỳc của một MCB
• Trường số lượng byte: trường này chỉ ra số lượng byte của vựng nhớ được cấp (tớnh theo đơn vị paragraphe), tức là nú cho biết khoảng cỏch từ một MCB thấp đến MCB kế tiếp cao hơn. Nhờ vậy mà cỏc MCB trờn bộ nhớ được kết nối như một danh sỏch liờn kết.
Để nạp một chương trỡnh vào bộ nhớ DOS cấp cho chương trỡnh hai vựng nhớ, vựng thứ nhất đủ để chứa khối tham số mụi trường của chương trỡnh, vựng thứ hai đủ để chứa chớnh chương trỡnh và PSP tương ứng của nú. Việc xỏc định kớch thước của chương trỡnh dạng COM sẽ rất khú vỡ chương trỡnh dạng COM được lưu trữ trờn đĩa là hoàn toàn giống như nú ở trờn bộ nhớ, ngoài ra khụng cú thờm bất cứ thong tin nào. Đối với cỏc chương trỡnh dạng EXE thỡ dễ hơn vỡ kớch thước của chương trỡnh EXE được ghi trong Header, header đứng trước mọi chương trỡnh EXE và được tạo ra trong qỳa trỡnh bờn dịch chương trỡnh. Thụng thường khi nạp một chương trỡnh dạng COM vào bộ nhớ DOS sẽ cấp cho chương trỡnh toàn bộ khụng gian nhớ cũn lại của bộ nhớ.