Chapter 7: Boä Nhôù Thöïc<br />
<br />
<br />
<br />
<br />
<br />
Caùc kieåu ñòa chæ nhôù<br />
Chuyeån ñoåi ñòa chæ nhôù<br />
Overlay vaø swapping<br />
Vaán ñeà caáp phaùt boä nhôù lieân tuïc (contiguous memory<br />
allocation)<br />
<br />
<br />
<br />
Giaûi phaùp fixed partitioning<br />
Giaûi phaùp dynamic partitioning<br />
<br />
1<br />
<br />
Quaûn lyù boä nhôù<br />
<br />
<br />
<br />
<br />
Kernel chieám moät vuøng coá ñònh cuûa boä nhôù, vuøng coøn laïi<br />
daønh ñeå caáp phaùt cho caùc process<br />
Caáp phaùt vuøng nhôù cho caùc process sao cho heä thoáâng<br />
hoaït ñoäng hieäu quaû<br />
<br />
<br />
<br />
<br />
Vd: Naïp caøng nhieàu process vaøo boä nhôù caøng toát ñeå gia taêng<br />
möùc ñoä multiprogramming<br />
<br />
Quaûn lyù boä nhôù<br />
<br />
<br />
<br />
<br />
<br />
Caáp phaùt vuøng nhôù cho caùc process<br />
Baûo veä: kieåm tra truy xuaát boä nhôù coù hôïp leä khoâng<br />
Chia seû: cho pheùp caùc process chia seû vuøng nhôù chung<br />
Chuyeån ñoåi ñòa chæ luaän lyù sang ñòa chæ vaät lyù<br />
<br />
2<br />
<br />
Caùc kieåu ñòa chæ nhôù (1/2)<br />
<br />
<br />
<br />
<br />
<br />
<br />
Ñòa chæ vaät lyù -- physical (memory) address -- laø ñòa chæ<br />
maø CPU, hay MMU (neáu coù), göûi ñeán boä nhôù chính<br />
Ñòa chæ luaän lyù (logical address) laø ñòa chæ maø moät quaù<br />
trình sinh ra<br />
Caùc ñòa chæ sinh bôûi trình bieân dòch (compiler) laø<br />
töông ñoái hay khaû taùi ñònh vò (relocatable): compiler giaû thieát<br />
khoâng gian ñòa chæ cuûa ñôn vò bieân dòch (compilation unit) baét ñaàu<br />
töø ñòa chæ 0<br />
hoaëc<br />
tuyeät ñoái: keát quaû bieân dòch coù theå naïp ñöôïc ngay vaøo boä nhôù ñeå<br />
thöïc thi; ít ñöôïc duøng<br />
<br />
<br />
3<br />
<br />
1<br />
<br />
Caùc kieåu ñòa chæ nhôù (2/2)<br />
Khi moät leänh ñöôïc thöïc thi, caùc ñòa chæ luaän lyù phaûi ñöôïc<br />
chuyeån ñoåi thaønh ñòa chæ vaät lyù<br />
<br />
<br />
<br />
<br />
<br />
Söï chuyeån ñoåi naøy thöôøng coù söï hoã trôï cuûa phaàn cöùng ñeå ñaït<br />
hieäu naêng cao<br />
<br />
4<br />
<br />
Töø maõ nguoàn ñeán file thöïc thi ñöôïc<br />
Linker: keát hôïp caùc object module thaønh moät file thöïc thi ñöôïc<br />
<br />
<br />
<br />
<br />
<br />
<br />
taùi ñònh vò ñòa chæ töông ñoái vaø phaân giaûi caùc external reference<br />
keát hôïp caùc object module thaønh moät load module (file nhò phaân khaû thöïc<br />
thi)<br />
System<br />
static linking<br />
library<br />
<br />
dynamic linking<br />
<br />
System<br />
library<br />
5<br />
<br />
Thöïc hieän (static) linking<br />
Linker chuyeån ñoåi ñòa chæ töông ñoái sang ñòa chæ tuyeät ñoái<br />
<br />
<br />
0<br />
<br />
Module A<br />
CALL B<br />
<br />
length L<br />
<br />
relocatable<br />
object modules<br />
<br />
L - 1 Return<br />
0<br />
<br />
M-1<br />
0<br />
<br />
Module A<br />
JMP “L”<br />
<br />
L - 1 Return<br />
L Module B<br />
<br />
Module B<br />
CALL C<br />
<br />
0<br />
<br />
length M<br />
<br />
JMP “L+M”<br />
<br />
load module<br />
<br />
L M - 1 Return<br />
<br />
Return<br />
<br />
LM<br />
<br />
Module C<br />
<br />
Module C<br />
length N<br />
L M N - 1 Return<br />
<br />
N - 1 Return<br />
6<br />
<br />
2<br />
<br />
Chuyeån ñoåi ñòa chæ<br />
<br />
<br />
<br />
<br />
Chuyeån ñoåi ñòa chæ: quaù trình aùnh xaï moät ñòa chæ töø khoâng<br />
gian ñòa chæ naøy sang khoâng gian ñòa chæ khaùc<br />
Bieåu dieãn ñòa chæ nhôù<br />
<br />
<br />
<br />
<br />
<br />
Trong source code: symbolic (caùc bieán, haèng, pointer…)<br />
Thôøi ñieåm bieân dòch: thöôøng laø ñòa chæ töông ñoái<br />
Ví duï: a ôû vò trí 14 byte so vôùi vò trí baét ñaàu cuûa module<br />
Thôøi ñieåm linking/loading: coù theå laø ñòa chæ tuyeät ñoái<br />
<br />
2000<br />
<br />
0<br />
<br />
int i;<br />
goto p1;<br />
p1<br />
<br />
2250<br />
<br />
250<br />
<br />
symbolic address<br />
<br />
relative address<br />
physical memory<br />
7<br />
<br />
Sinh ñòa chæ tuyeät ñoái vaøo thôøi ñieåm bieân dòch<br />
Symbolic<br />
addresses<br />
PROGRAM<br />
<br />
Absolute<br />
addresses<br />
<br />
JUMP i<br />
<br />
i<br />
<br />
Physical memory<br />
addresses<br />
<br />
1024<br />
<br />
1024<br />
<br />
JUMP 1424<br />
<br />
JUMP 1424<br />
1424<br />
<br />
LOAD j<br />
DATA<br />
<br />
j<br />
<br />
1424<br />
LOAD 2224<br />
<br />
Compile<br />
<br />
LOAD 2224<br />
<br />
Load<br />
<br />
2224<br />
<br />
Source code<br />
<br />
Absolute load module<br />
<br />
2224<br />
<br />
Process image<br />
<br />
8<br />
<br />
Chuaån bò sinh ñòa chæ vaät lyù (1)<br />
<br />
<br />
Vaøo thôøi ñieåm bieân dòch<br />
<br />
<br />
<br />
<br />
<br />
<br />
Compiler sinh ñòa chæ tuyeät ñoái<br />
Caàn thoâng tin cho bieát load module seõ ñöôïc naïp ôû ñaâu<br />
Khoâng caàn linker<br />
Loader raát ñôn giaûn<br />
Hieám ñöôïc duøng (MSDOS .COM files)<br />
<br />
9<br />
<br />
3<br />
<br />
Chuaån bò sinh ñòa chæ vaät lyù (2)<br />
<br />
<br />
Vaøo thôøi ñieåm link-edit<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Compiler<br />
Sinh ñòa chæ töông ñoái (a.k.a. relocatable) cho moãi ñôn vò bieân<br />
dòch<br />
Tham chieáu ñeán ñòa chæ ngoaøi<br />
Linkage editor<br />
Chuyeån ñoåi ñòa chæ relocatable sang ñòa chæ tuyeät ñoái<br />
Phaân giaûi caùc tham chieáu ñeán ñòa chæ ngoaøi<br />
Caàn thoâng tin cho bieát linked program seõ ñöôïc naïp ôû ñaâu<br />
Loader vaãn coøn raát ñôn giaûn<br />
Yeâu caàu veà phaàn cöùng thaáp<br />
Moät chöông trình chæ coù theå ñöôïc naïp taïi nôi ñaõ ñöôïc ñaëc taû vaø<br />
khoâng theå dòch chuyeån sau khi ñöôïc naïp<br />
Khoâng coøn ñöôïc duøng nhieàu<br />
10<br />
<br />
Chuaån bò sinh ñòa chæ vaät lyù (3)<br />
<br />
<br />
Vaøo thôøi ñieåm naïp<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Töông töï thôøi ñieåm link-edit, nhöng khoâng giöõ coá ñònh ñòa chæ baét<br />
ñaàu<br />
Chöông trình coù theå ñöôïc naïp ôû baát cöù ñaâu<br />
Chöông trình coù theå dòch chuyeån nhöng khoâng taùch ñöôïc<br />
Chæ caàn phaàn cöùng ñôn giaûn: caùc thanh ghi base/limit<br />
Loader thieát laäp trò cho caùc thanh ghi base/limit<br />
Khoâng coøn ñöôïc duøng phoå bieán<br />
<br />
11<br />
<br />
Sinh ñòa chæ vaät lyù<br />
<br />
<br />
Vaøo thôøi ñieåm thöïc thi<br />
<br />
<br />
<br />
<br />
<br />
Ñòa chæ ñöôïc chuyeån ñoåi ñoäng trong khi thöïc thi<br />
Caàn coù phaàn cöùng ñeå chuyeån ñoåi ñòa chæ aûo sang ñòa chæ vaät lyù<br />
ñöôïc nhanh<br />
“Phaân trang” (“paging”)<br />
“Phaân ñoaïn” (“segmentation”)<br />
Raát phoå bieán hieän nay<br />
<br />
12<br />
<br />
4<br />
<br />
Söû duïng vuøng nhôù bôùt phí phaïm<br />
<br />
<br />
Caùc kyõ thuaät hoã trôï söû duïng vuøng nhôù bôùt phí phaïm:<br />
<br />
<br />
<br />
<br />
<br />
Dynamic linking<br />
Dynamic loading<br />
Overlay<br />
Swapping<br />
<br />
13<br />
<br />
Dynamic linking (1)<br />
Trong dynamic linking<br />
Vieäc link moät load module L ñeán moät module ngoaøi<br />
(external module) ñöôïc thöïc hieän sau khi ñaõ taïo xong L<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
MS Windows: module ngoaøi laø caùc file .dll<br />
Unix: module ngoaøi laø caùc file .so (shared library)<br />
<br />
Load module chöùa caùc stub tham chieáu (refer) ñeán caùc<br />
routine cuûa external module<br />
<br />
<br />
<br />
<br />
Khi process goïi routine laàn ñaàu, stub seõ naïp routine vaøo boä nhôù<br />
(neáu routine chöa ñöôïc naïp tröôùc ñoù), thay theá ñòa chæ mình baèng<br />
ñòa chæ routine, vaø goïi routine ñeå thöïc thi<br />
Caùc laàn goïi routine sau seõ xaûy ra bình thöôøng, khoâng toán<br />
overhead<br />
<br />
14<br />
<br />
Dynamic linking (2)<br />
<br />
<br />
Nhaéc laïi static linking<br />
<br />
0x08048000<br />
<br />
program<br />
<br />
main:<br />
...<br />
call printf<br />
<br />
printf:<br />
...<br />
ret<br />
<br />
copy từ libc<br />
<br />
15<br />
<br />
5<br />
<br />