May 4, 2013

Lập trình quản lý file trong nachos

Hướng dẫn quản lí tập tin trong nachos

Bài viết đang được hoàn thiện


Đề bài cho đồ án này: Link đây

Các bước để tạo system call đã được đề cập tại : đây . Các bạn có thể tham khảo để nhớ lại

Bước 1. Cấu hình cho bài tập

Đầu tiên ta tìm hiểu sơ về các lớp trong nachos liên quan đến quản lý file.

  • FileSystem. Địa chỉ: filesys/filesys.h. Lớp này để quản lý các hệ thống file. Trong lớp này có các phương thức hỗ trợ việc quản lý bao gồm: tạo, xóa, mở 1 file dựa vào tên file đó
  • OpenFile. Địa chỉ:filesys/openfile.h. Lớp này dùng để thực thi các phép toán (operator) trên 1 file, bao gồm đọc, ghi, lấy độ dài Phương thức Close 1 file chính là destructor của nó luôn.

Hiểu được cái đề.

  • Đề yêu cầu cùng 1 lúc quản lý được 10 file. Tức là đâu đó trong hệ thống phải có 1 cái mảng kiểu OpenFile chứa 10 phần tử. Dĩ nhiên nó không nằm trong exception method, vì nằm ở đó mảng này sẽ bị xóa và khởi tạo lại mỗi lần gọi. Chính xác hơn, ta sẽ đặt nó ở lớp FileSystem ở dạng public (cho dễ cài đặt, để private phải cài thêm cái getter/setter khá khó chịu). Mỗi giá trị của OpenFileID chính là chỉ mục (index) của biến đó trong mảng ta tạo ở trên. Ví dụ mảng đó là openf thì khi mở file openf[3] giá trị trả về của hàm OpenFile sẽ là 3. Và dĩ nhiên, stdinstdoout chính là openf[0]openf[1]
  • 2 bé stdinstdoout được tạo và mở ngay trong constructor của FileSystem, nhờ đó nó luôn luôn tồn tại và không mất đi. Và khi viết systemcall ta chỉ cần kiểm tra index == 0 || index == 1 (chính là cái OpenFileID) là xong
  • Các thao tác đọc, viết, đóng đã có sẵn rồi, ta chỉ cần thêm phương thức Seek vào OpenFile class. Phương thức này được cài đặt bằng lệnh LSeek. Nếu chú ý các phương thức đọc và viết đã được cài sẵn thì có thể dễ dàng cài đặt phương thức này.
  • Về vấn đề console, khi người dùng yêu cầu các file stdinstdout thì ta xử lý riêng rẽ ( 1 lệnh if thôi). Để kiểm tra xem user có gọi 2 file đó không thì chỉ cần check OpenFileID

Cài đặt

  • Lưu ý: trong FileSystem và OpenFile có 2 version riêng cho mỗi lớp, để đảm bảo an toàn, ta cũng cài đặt cả 2 version đó những thay đổi khi làm
  • Project đã chạy được: Link đây

4 comments:

  1. Cảm ơn bài viết của anh rất nhiều!

    ReplyDelete
  2. Chào anh , a có thể nói rõ về đoạn code trong filesys.h và filesys.cc , openfile.cc, openfile.h không anh ,chỗ mà stdin, stdout anh dùng trong filesys.h là 2 ,3 nhưng .cc là 2 ,2 , còn trong openfile.h anh quy định type 2 stdout, type 3 là stdin trái vs filesys.h là sao em k hỉu, mong anh giải đáp

    ReplyDelete
  3. Chào bạn, thực sự là qua 1 năm rồi nên mình cũng không nhớ hồi đó mình viết gì nữa.

    ReplyDelete
  4. This comment has been removed by the author.

    ReplyDelete