III.5.a. Program Segment Prefix (PSP):
MS_DOS dựng hàm EXEC để nạp cỏc chương trỡnh EXE và COM vào bộ nhớ. EXEC phải chuẩn bị một vựng nhớ mà chương trỡnh sẽ nạp vào, và đặt vào đầu vựng nhớ này một cấu trỳc dữ liệu được gọi là khối tiền tố chương trỡnh PSP. Chương trỡnh sẽ được nạp vào ngay sau PSP, sau đú hệ điều hành sẽ khởi tạo cỏc thành ghi Segment và Stack để chương trỡnh bắt đầu hoạt động. Khi chương trỡnh kết thỳc thỡ hệ điều hành giải phúng cả khối nhớ cấp cho chương trỡnh và khối nhớ
dựng làm PSP cho chương trỡnh.
Code 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.
PSP cho biết địa chỉ đoạn của ụ nhớ cuối cựng dành cho chương trỡnh, địa chỉ đoạn của khối biến mụi trường, độ dài của dũng lệnh, cỏc tham số dũng lệnh, vv.
Cỏc bạn cú thể tỡm hiểu rừ hơn về cấu trỳc của một PSP ở một tài liệu khỏc viết về hệ điều hành MS_DOS.
III.5.b. Chương trỡnh COM và EXE:
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. 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.
Memory Control Block1 Được quản lý bởi MCB1 Memory Control Block2 Được quản lý bởi MCB2 MCB3 (MCB cuối cựng) Được quản lý bởi MCB3
Hỡnh 3.16: Quản lý bộ nhớ bằng MCB của DOS
Kết thỳc M 0000:0000 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
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.
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ớ.
III.5. Sự phõn trang/đoạn trong hệ điều hành Windown NT
Windows NT được thiết kế để cài đặt trờn nhiều họ processor khỏc nhau, đặc biệt là trờn cỏc processor Intel 486. Trờn cỏc hệ thống PC IBM và tương thớch sử dụng Intel 486, Windows chấp nhận kớch thước của một page là 4KB, đõy là cơ sở để
thực hiện chiến lược bộ nhớ ảo của Windows NT.
III.5.a. Segmentation:
Khi sự phõn đoạn được sử dụng, mỗi địa chỉ ảo (trong cỏc tài liệu 80386 được gọi là địa chỉ logic) bao gồm 16 bớt segment và 32 bớt offset. Hai bớt đầu tiờn của segment được sử dụng trong chiến lược bảo vệ bộ nhớ, 14 bớt cũn lại dựng để chỉ đến một segment cụ thể. Do đú với bộ nhớ khụng được phõn đoạn, bộ nhớ ảo của chương trỡnh người sử dụng là 232 = 4GB. Với bộ nhớ được phõn đoạn, tổng khụng
gian bộ nhớ ảo được nhỡn bởi chương trỡnh người sử dụng là 246 = 64TB. Khụng gian địa chỉ vật lý 32 bớt cho kớch thước tối đa là 4GB. Lượng bộ nhớ ảo thực tế cú thể lớn hơn 64TB: Đối với 80386 địa chỉ ảo phụ thuộc vào processor đang sử dụng.
Một nửa khụng gian địa chỉ ảo (8K segment x 4GB) là khụng gian chung, được chia sẻ cho tất cả cỏc tiến trỡnh, phần cũn lại là địa chỉ cục bộ và dành riờng cho
mỗi tiến trỡnh.
Gắn liền với mỗi đoạn là 2 dạng thức của sự bảo vệ: mức đặc quyền (privilege level) và thuộc tớnh truy cập (access attribue). Cú 4 mức đặc quyền, từ được bảo vệ cao nhất đến được bảo vệ thấp nhất: level 0, level 1, level 2, level 3. Mức đặc quyền cú thể được gắn với segment dữ liệu hoặc với program segment. Một chương trỡnh thực hiện chỉ cú thể truy cập dữ liệu trong segment khi mức đặc
quyền của nú thấp hơn hoặc bằng mức đặc quyền gắn với segment dữ liệu. Phần cứng khụng bắt buộc sử dụng cấp đặc quyền nào, việc này do cỏc nhà thiết kế hệ điều hành quyết định. Thuộc tớnh truy cập của một segment dữ liệu chỉ ra cú hay
khụng sự cho phộp truy cập read/write hoặc read-only. Đối với cỏc segment program, thuộc tớnh truy cập chỉ ra cú hay khụng truy cập read/excute hoặc read-
only.
Chiến lược chuyển đổi địa chỉ cho sự phõn đoạn gồm ỏnh xạ một địa chỉ ảo thành địa chỉ tuyến tớnh và địa chỉ tuyến tớnh thành địa chỉ thực. Dạng thức của địa
chỉ ảo trong NT được mụ tả trong hỡnh sau:
47 35 34 33 31 0
Segment number TI RP
L Offset
a. Địa chỉ ảo
31 21 12 0
Directory Page Offset