Thực hành Hệ điều hành - Bài thực hành: Giao tiếp giữa HĐH Nachos và chương trình

Cũng tương tự như mô hình giao tiếp chung giữa HĐH và chương trình
người dùng ở trên, tuy nhiên Nachos là một HĐH nhỏ gọn nhằm mục đích phục
vụ cho việc tìm hiểu và xây dựng HĐH nên có một số đặc điểm riêng. Trong phần
này, sẽ trình bày chi tiết về cách thức giao tiếp giữa HĐH Nachos và chương trình
ứng dụng để từ đó có được những ý niệm về cách thức giao tiếp chung giữa HĐH
và chương trình người dùng
Một câu hỏi đặt ra là chương trình người dùng sẽ được thực thi như thế nào
trên các hệ điều hành ? 
pdf 9 trang xuanthi 30/12/2022 2560
Bạn đang xem tài liệu "Thực hành Hệ điều hành - Bài thực hành: Giao tiếp giữa HĐH Nachos và chương trình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfthuc_hanh_he_dieu_hanh_bai_thuc_hanh_giao_tiep_giua_hdh_nach.pdf

Nội dung text: Thực hành Hệ điều hành - Bài thực hành: Giao tiếp giữa HĐH Nachos và chương trình

  1. Hướng dẫn thực hành Hệ điều hành Giao tiếp giữa HĐH Nachos và chương trình Trước khi chương trình này có thể thực thi được, nó phải được biên dịch. Đối với Nachos, tất cả các chương trình trong thư mục /code/test/ đều được biên dịch khi biên dịch Nachos, tuy nhiên ta hoàn toàn có thể biên dịch các chương trình này mà không cần phải biên dịch lại Nachos như sau: % /cross-compiler/decstation-ultrix/bin/gcc -I /nachos/code/userprog -I /nachos/code/threads -o /test/halt ./test/halt.c Quá trình biên dịch chương trình này gồm 3 giai đoạn như sau: − Chương trình halt.c được biên dịch bởi cross-compiler gcc (được tạo ra trong bài “Biên dịch và Cài đặt Nachos”) thành tập tin halt.s là mã hợp ngữ chạy trên kiến trúc MIPS − Tập tin halt.s này sẽ được liên kết với tập tin start.s để tạo thành tập tin halt.coff, là định dạng thực thi trên hệ điều hành Linux cho kiến trúc máy MIPS. (Lưu ý, do Nachos được xây dựng đơn giản nhằm mục đích giúp tìm hiểu nên người ta sử dụng tập tin start.s thay cho toàn bộ thư viện C trong mô hình chung ở trên.) − Tập tin halt.coff được chuyển thành tập tin halt.noff, là định dạng thực thi trên hệ điều hành Nachos cho kiến trúc máy MIPS, sử dụng tiện ích “coff2noff” được cung cấp sẵn trong thư mục /code/bin/ Như vậy, sau khi biên dịch thành công, ta có tập tin halt(.noff) là chương trình thực thi trên Nachos. Để thực hiện chương trình halt này, gõ lệnh: % ./userprog/nachos –rs 1023 –x ./test/halt Khi thực thi một chương trình trên Nachos thì chương trình start luôn được thực thi trước và quá trình thực thi của chương trình halt sẽ được thực hiện như hình mô tả trong hình sau: Khoa CNTT – ĐH Khoa Học Tự Nhiên 2
  2. Hướng dẫn thực hành Hệ điều hành Giao tiếp giữa HĐH Nachos và chương trình Trap to Kernel mode User mode Kernel mode // mipssim.cc // exception.cc // machine.cc Trong ví dụ halt thì một system call SC_Halt được xây dựng trước và được gọi thực hiện khi chương trình người dùng gọi hàm Halt(). Như vậy, muốn phục vụ người dùng có thể thực thi được các công việc khác nhau như: tạo tập tin, tạo tiến trình, thì người phát triển hệ điều hành phải xây dựng một bộ system call đủ để phục vụ các yêu cầu này. Một điểm lưu ý, system call cũng là một hàm xử lý nhưng ở kernel mode khác với một hàm của chương trình người dùng ở user mode Khoa CNTT – ĐH Khoa Học Tự Nhiên 4 Schandle.cc
  3. Hướng dẫn thực hành Hệ điều hành Giao tiếp giữa HĐH Nachos và chương trình case SC_Create: { int virtAddr; char* filename; DEBUG(‘a’,"\n SC_Create call "); DEBUG(‘a’,"\n Reading virtual address of filename"); // Lấy tham số tên tập 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ề lỗi cho chương // trình người dùng delete filename; return; } DEBUG(‘a’,"\n Finish reading filename."); //DEBUG(‘a’,"\n File name : '" Create(filename,0)) { printf("\n Error create file '%s'",filename); machine->WriteRegister(2,-1); delete filename; return; } machine->WriteRegister(2,0); // trả về cho chương trình // người dùng thành công delete filename; break; } default: printf("\n Unexpected user mode exception (%d %d)", which, type); interrupt->Halt(); } } Khoa CNTT – ĐH Khoa Học Tự Nhiên 6
  4. Hướng dẫn thực hành Hệ điều hành Giao tiếp giữa HĐH Nachos và chương trình Bước 4: Viết chương trình ở mức người dùng để kiểm tra – createfile.c #include "syscall.h" #include "copyright.h" #define maxlen 32 int main() { int len; char filename[maxlen +1]; /*Create a file*/ if (Create(“text.txt”) = = -1) { // xuất thông báo lỗi tạo tập tin } else { // xuất thông báo tạo tập tin thành công } Halt(); } Bước 5: Thêm đoạn vào Makefile trong /code/test/ Thêm createfile vào dòng all: all: halt shell matmult sort createfile Thêm đoạn sau phía 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 Bước 6: Biên dịch lại Nachos Bước 7: Thực thi chương trình createfile. Nếu chương trình không báo lỗi “Not enough memory in system” hoặc “Error create file ” thì xem như thành công Như vậy, ta đã hoàn thành việc tạo system call tạo tập tin để phục vụ cho lời gọi hàm Create trong chương trình người dùng. Tuy nhiên, trong chương trình người dùng, để thể hiện kết quả tạo tập tin rõ ràng hơn, cần thực hiện xuất các thông báo tương ứng như sau: Khoa CNTT – ĐH Khoa Học Tự Nhiên 8