You are on page 1of 9

Hng dn thc hnh H iu hnh

Giao tip gia HH Nachos v chng trnh

GIAO TIP GIA HH NACHOS V CHNG TRNH


Mc tiu: Trnh by giao tip gia HH Nachos v chng trnh ngi dng Hng dn cch xy dng mt system call trn HH Nachos 1. M hnh giao tip chung gia HH v chng trnh ngi dng

2. Giao tip gia HH Nachos v chng trnh ngi dng Cng tng t nh m hnh giao tip chung gia HH v chng trnh ngi dng trn, tuy nhin Nachos l mt HH nh gn nhm mc ch phc v cho vic tm hiu v xy dng HH nn c mt s c im ring. Trong phn ny, s trnh by chi tit v cch thc giao tip gia HH Nachos v chng trnh ng dng t c c nhng nim v cch thc giao tip chung gia HH v chng trnh ngi dng Mt cu hi t ra l chng trnh ngi dng s c thc thi nh th no trn cc h iu hnh ? Ta s phn tch qu trnh thc thi ca mt chng trnh c vit trn h iu hnh Nachos tr li cu hi ny. T , c th thy c ton cnh cch giao tip ca h iu hnh Nachos vi chng trnh ngi dng. Xem xt chng trnh halt.c (trong th mc /code/test/) c vit chy trn h iu hnh Nachos. Chng trnh ny gi mt hm duy nht Halt() tt my o Nachos. Chng ta s phn tch qu trnh thc hin chng trnh ny:
#include "syscall.h" int main() { Halt(); /* not reached */ }

Khoa CNTT H Khoa Hc T Nhin

Hng dn thc hnh H iu hnh

Giao tip gia HH Nachos v chng trnh

Trc khi chng trnh ny c th thc thi c, n phi c bin dch. i vi Nachos, tt c cc chng trnh trong th mc /code/test/ u c bin dch khi bin dch Nachos, tuy nhin ta hon ton c th bin dch cc chng trnh ny m khng cn phi bin dch li Nachos nh sau:
% ../cross-compiler/decstation-ultrix/bin/gcc -I ../nachos/code/userprog -I../nachos/code/threads -o /test/halt ./test/halt.c

Qu trnh bin dch chng trnh ny gm 3 giai on nh sau: Chng trnh halt.c c bin dch bi cross-compiler gcc (c to ra trong bi Bin dch v Ci t Nachos) thnh tp tin halt.s l m hp ng chy trn kin trc MIPS Tp tin halt.s ny s c lin kt vi tp tin start.s to thnh tp tin halt.coff, l nh dng thc thi trn h iu hnh Linux cho kin trc my MIPS. (Lu , do Nachos c xy dng n gin nhm mc ch gip tm hiu nn ngi ta s dng tp tin start.s thay cho ton b th vin C trong m hnh chung trn.) Tp tin halt.coff c chuyn thnh tp tin halt.noff, l nh dng thc thi trn h iu hnh Nachos cho kin trc my MIPS, s dng tin ch coff2noff c cung cp sn trong th mc /code/bin/

Nh vy, sau khi bin dch thnh cng, ta c tp tin halt(.noff) l chng trnh thc thi trn Nachos. thc hin chng trnh halt ny, g lnh: % ./userprog/nachos rs 1023 x ./test/halt Khi thc thi mt chng trnh trn Nachos th chng trnh start lun c thc thi trc v qu trnh thc thi ca chng trnh halt s c thc hin nh hnh m t trong hnh sau:

Khoa CNTT H Khoa Hc T Nhin

Hng dn thc hnh H iu hnh

Giao tip gia HH Nachos v chng trnh

// halt.s

Khoa CNTT H Khoa Hc T Nhin

Hng dn thc hnh H iu hnh

Giao tip gia HH Nachos v chng trnh

Trap to Kernel mode User mode // mipssim.cc Kernel mode // exception.cc

// machine.cc

Trong v d halt th mt system call SC_Halt c xy dng trc v c gi thc hin khi chng trnh ngi dng gi hm Halt(). Nh vy, mun phc v ngi dng c th thc thi c cc cng vic khc nhau nh: to tp tin, to tin trnh, th ngi pht trin h iu hnh phi xy dng mt b system call phc v cc yu cu ny. Mt im lu , system call cng l mt hm x l nhng kernel mode khc vi mt hm ca chng trnh ngi dng user mode Khoa CNTT H Khoa Hc T Nhin
Schandle.cc

Hng dn thc hnh H iu hnh

Giao tip gia HH Nachos v chng trnh

v khng th truyn tham s trc tip cho system call. Nh vy nu mt hm trong chng trnh ngi dng yu cu truyn mt tham s th system call ny s nhn tham s ny nh th no? Trong v d tip theo, s hng dn cch to system call to tp tin SC_Create nhm phc v yu cu ca chng trnh ngi dng mun to mt tp tin v cch system call trong h iu hnh Nachos nhn tham s (trong v d ny l tn tp tin) Bc 1: Trong tp tin /code/userprog/syscall.h thm dng khai bo syscall mi ( c thc hin sn, nhng cn sa li kiu tr v ca hm Create t void thnh int) #define SC_Create 4 int Create(char *name); Bc 2: Trong tp tin /code/test/start.c v /code/test/start.s thm dng ( c thc hin sn): .globl Create .ent Create Create: addiu $2,$0,SC_Create syscall j $31 .end Create Bc 3: Trong tp tin code/userprog/exception.cc sa iu kin if thnh switch case nh sau:
// Input: reg4 -filename (string) // Output: reg2 -1: error and 0: success // Purpose: process the event SC_Create of System call // m system call s c a vo thanh ghi r2 (c th xem li phn x l cho // system call Halt trong tp tin start.s trn) // tham s th 1 s c a vo thanh ghi r4 // tham s th 2 s c a vo thanh ghi r5 // tham s th 3 s c a vo thanh ghi r6 // tham s th 4 s c a vo thanh ghi r7 // kt qu thc hin ca system call s c a vo thanh ghi r2 switch (which) { case NoException: return; case SyscallException: switch (type){ case SC_Halt: DEBUG(a, "\n Shutdown, initiated by user program."); printf ("\n\n Shutdown, initiated by user program."); interrupt->Halt(); break;

Khoa CNTT H Khoa Hc T Nhin

Hng dn thc hnh H iu hnh


case SC_Create: { int virtAddr; char* filename;

Giao tip gia HH Nachos v chng trnh

DEBUG(a,"\n SC_Create call ..."); DEBUG(a,"\n Reading virtual address of filename"); // Ly tham s tn tp tin t thanh ghi r4 virtAddr = machine->ReadRegister(4); DEBUG (a,"\n Reading filename."); // MaxFileLength l = 32 filename = User2System(virtAddr,MaxFileLength+1); if (filename == NULL) { printf("\n Not enough memory in system"); DEBUG(a,"\n Not enough memory in system"); machine->WriteRegister(2,-1); // tr v li cho chng // trnh ngi dng delete filename; return; } DEBUG(a,"\n Finish reading filename."); //DEBUG(a,"\n File name : '"<<filename<<"'"); // Create file with size = 0 // Dng i tng fileSystem ca lp OpenFile to file, // vic to file ny l s dng cc th tc to file ca h iu // hnh Linux, chng ta khng qun ly trc tip cc block trn // a cng cp pht cho file, vic qun ly cc block ca file // trn a l mt n khc if (!fileSystem->Create(filename,0)) { printf("\n Error create file '%s'",filename); machine->WriteRegister(2,-1); delete filename; return; } machine->WriteRegister(2,0); // tr v cho chng trnh // ngi dng thnh cng delete filename; break; } default: printf("\n Unexpected user mode exception (%d %d)", which, type); interrupt->Halt(); } }

Khoa CNTT H Khoa Hc T Nhin

Hng dn thc hnh H iu hnh

Giao tip gia HH Nachos v chng trnh

Trong phn x l cho system call to tp tin c s dng hm User2System c vit nh sau:
// Input: - User space address (int) // - Limit of buffer (int) // Output:- Buffer (char*) // Purpose: Copy buffer from User memory space to System memory space char* User2System(int virtAddr,int limit) { int i;// index int oneChar; char* kernelBuf = NULL; kernelBuf = new char[limit +1];//need for terminal string if (kernelBuf == NULL) return kernelBuf; memset(kernelBuf,0,limit+1); //printf("\n Filename u2s:"); for (i = 0 ; i < limit ;i++) { machine->ReadMem(virtAddr+i,1,&oneChar); kernelBuf[i] = (char)oneChar; //printf("%c",kernelBuf[i]); if (oneChar == 0) break; } return kernelBuf; }

Ngc li ta c hm System2User nh sau:


// Input: - User space address (int) // - Limit of buffer (int) // - Buffer (char[]) // Output:- Number of bytes copied (int) // Purpose: Copy buffer from System memory space to User memory space int System2User(int virtAddr,int len,char* buffer) { if (len < 0) return -1; if (len == 0)return len; int i = 0; int oneChar = 0 ; do{ oneChar= (int) buffer[i]; machine->WriteMem(virtAddr+i,1,oneChar); i ++; }while(i < len && oneChar != 0); return i; }

Khoa CNTT H Khoa Hc T Nhin

Hng dn thc hnh H iu hnh


#include "syscall.h" #include "copyright.h" #define maxlen 32

Giao tip gia HH Nachos v chng trnh

Bc 4: Vit chng trnh mc ngi dng kim tra createfile.c

int main() { int len; char filename[maxlen +1]; /*Create a file*/ if (Create(text.txt) = = -1) { // xut thng bo li to tp tin } else { // xut thng bo to tp tin thnh cng } Halt(); }

Bc 5: Thm on vo Makefile trong /code/test/ Thm createfile vo dng all:


all: halt shell matmult sort createfile

Thm on sau pha sau matmult:


createfile.o: createfile.c $(CC) $(CFLAGS) -c createfile.c createfile: createfile.o start.o $(LD) $(LDFLAGS) start.o createfile.o -o createfile.coff ../bin/coff2noff createfile.coff createfile

Bc 6: Bin dch li Nachos Bc 7: Thc thi chng trnh createfile. Nu chng trnh khng bo li Not enough memory in system hoc Error create file th xem nh thnh cng Nh vy, ta hon thnh vic to system call to tp tin phc v cho li gi hm Create trong chng trnh ngi dng. Tuy nhin, trong chng trnh ngi dng, th hin kt qu to tp tin r rng hn, cn thc hin xut cc thng bo tng ng nh sau:

Khoa CNTT H Khoa Hc T Nhin

Hng dn thc hnh H iu hnh


#include "syscall.h" #include "copyright.h" #define maxlen 32 int main() { int len; char filename[maxlen +1];

Giao tip gia HH Nachos v chng trnh

/*Create a file*/ if (Create(text.txt) = = -1) { print("\nCreate file ~"); print(filename); print(" fail."); } else { print("\nCreate file ~"); print(filename); print(" success.~"); } Halt(); } Tuy nhin, hin ti HH Nachos cha h tr hm print xut 1 chui ra mn hnh. Do ta cn xy dng thm 1 system call phc v cho vic xut 1 chui k t trong chng trnh ngi dng. Qu trnh xy dng system call ny cng tng t qu trnh xy dng system call to tp tin. Nhim v tip theo Tm hiu ngha cc lnh x l ca system call to tp tin Tm hiu cc thnh phn c bn v qun l tp tin, qun l tin trnh, qun l b nh m HH Nachos h tr sn Xy dng system call h tr vic xut 1 chui ra mn hnh Xy dng cc systam call cn li qun l tp tin: m tp tin (open), c tp tin (read), ghi tp tin (write), ng tp tin (close), nh v (seek).

Khoa CNTT H Khoa Hc T Nhin

You might also like