Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
487,15 KB
Nội dung
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ - VIỄN THÔNG BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH Đề tài: Project 1: Alarm clock Project 2: System Calls Sinh viên thực : : : Giảng viên hướng dẫn : PHẠM NGỌC LÂM Nguyễn Đình Hùng 20182555 Nguyễn Anh Đức 20182433 Phạm Huy Hoàng 20182545 TS Phạm Văn Tiến 2018262 Hà Nội, 12-2021 LỜI NÓI ĐẦU Hiện nay, khoa học kĩ thuật giới ngày phát triển mạnh mẽ Khoa học kĩ thuật đóng vai trị khơng thể thiếu đời sống đại ngày diện sản phẩm, vật dụng mà sử dụng hàng ngày Vì việc học tập đạo tạo, kế thừa phát triển thành tựu khoa học cho hệ ngày vô quan trọng đặc biệt hệ sinh viên Việc tiếp cận cần phải tiếp cận mặt lí thuyết lẫn thực hành, việc học tập đào tạo đạt hiệu tốt nhất, đáp ứng cho xã hội nguồn nhân lực khoa học kĩ thuật chất lượng cao Trong trình học tập học phần Hệ điều hành thầy Phạm Văn Tiến giảng dạy chúng em hướng dẫn, trợ giáo để hoàn thành việc thực hành dự án khóa học hệ điều hành Pintos Sau trải qua khoảng thời gian, nhóm chúng em hồn thành việc lập trình để hiểu hệ điều hành Pintos, giải vấn đề hệ điều hành Trong báo cáo này, nhóm chúng em trình bày cụ thể làm tuần vừa qua thông qua chương sau: Chương 1: Giới thiệu hệ điều hành Pintos Chương 2: Alarm Clock Chương 3: System Calls Chương 4: Kết luận Nhóm xin chân thành cảm ơn TS Phạm Văn Tiến tận tâm hướng dẫn chúng em trình tìm hiểu hoàn thiện báo cáo này! M Ụ C LỤ C DANH MỤC HÌNH VẼ i BẢNG PHÂN CÔNG CÔNG VIỆC ii CHƯƠNG GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS 1.1 Tổng quan Pintos .3 1.2 Cây thư mục nguồn 1.3 Tổng quan Threads CHƯƠNG ALARM CLOCK 2.1 Vấn đề Alarm Clock 2.2 Mô tả mục tiêu 2.3 Phương pháp giải 2.4 Triển khai mã nguồn 2.5 Mô tả mã nguồn sửa đổi, bổ sung .8 2.6 Kết CHƯƠNG SYSTEM CALLS .10 3.1 Đặt vấn đề 10 3.2 Mô tả mục tiêu .11 3.3 Yêu cầu triển khai 12 3.4 Triển khai mã nguồn 15 3.5 Sửa đổi mã nguồn bổ sung 16 3.6 Kết 19 CHƯƠNG KẾT LUẬN 20 TÀI LIỆU THAM KHẢO 21 DANH MỤC HÌNH VẼ Hình Sơ đồ FSM threads Hình Sơ đồ hàm chuyển trạng thái threads Hình Mơ tả chức hàm thread_yield() Hình Cơ chế sleep and wake up Hình Kết sau make check test alarm-clock Hình Sơ đồ tương tác chương trình người dùng OS .10 Hình Cấu trúc thành phần layout Virtual Memory 11 Hình Sơ đồ xử lí gọi hệ thống 12 Hình Sơ đồ luồng điều khiển 14 Hình 10 Kết sau make check test system calls 19 i Các vấn đề Alarm Clock Nguyễn Đình - Triển khai and wake up - Bổ sung hàm - Sửa mã nguồ thử nghiệm cu pass hết) - Phân tích chỉnh sửa mã n kiểm thử h quan đến t process: halt, e wait(đã pass h System Calls BẢNG PHÂN CÔNG CÔNG VIỆC ii CHƯƠNG GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS Chương giới thiệu tổng quan hệ điều hành Pintos tổng quan thư mục nguồn hệ điều hành Pintos 1.1 Tổng quan Pintos Pintos khung hệ điều hành đơn giản cho kiến trúc 80x86 Nó hỗ trợ kernel threads, loading running user programs file system, thực tất điều cách đơn giản Các chế cịn có nhiều vấn đề cần khắc phục để hệ điều hành chạy cách tối ưu Stanford đưa Project dựa hệ điều hành Pintos: Project 1: Threads – Luồng Project 2: User Programs – Chương trình người dùng Project 3: Virtual Memory – Bộ nhớ ảo Project 4: File Systems – Hệ thống file Ngoài Stanford đưa CS140 Problem Set 0: Synchronization – Đồng hóa để sinh viên làm quen với mã nguồn Pintos Khi người dùng triển khai thành công (PASS TEST) nội dung đề này, hệ điều hành Pintos hoạt động hiệu quả, hiệu suất cao, tiết kiêm tài nguyên nhớ, lượng thời gian máy tính Trong báo cáo sử dụng QEMU trình mơ 1.2 Cây thư mục nguồn Quan sát vào bên mã nguồn Đây cấu trúc thư mục “…/pintos-anonmaster/src” “threads/” Mã nguồn sở kernel, mà bạn thay đổi từ Project “userprog/” Mã nguồn cho trình tải chương trình người dùng, mà bạn sửa đổi từ Project “vm/” Một thư mục gần trống rỗng Bạn triển khai nhớ ảo Project “filesys/” Mã nguồn cho hệ thống tệp Bạn sử dụng tệp bắt đầu với Project 2, bạn khơng sửa đổi Project “devices/” Mã nguồn cho giao tiếp thiết bị I/O: bàn phím, đếm thời gian, đĩa, … Bạn sửa đổi việc triển khai hẹn Project “lib/” Đây tập thư viện C chuẩn, biên dịch vào kernel chương trình người dùng chạy nó, Project Tiêu đề thư mục đưa vào #include “lib/kernel/” Các phần thư viện C có kernel Pintos Bao gồm số kiểu liệu: bitmap, linked list, hash table “lib/user/” Các phần thư viện C có chương trình người dùng “tests/” Các test cho dự án Bạn sửa đổi mã giúp bạn kiểm tra nội dung mình, chúng tơi thay mã gốc trước test thử nghiệm “examples/” Ví dụ cho chương trình người dùng sử dụng Project “misc/” “utils/” Những files hữu ích bạn định thử làm việc với Pintos máy tính riêng Nếu khơng bỏ qua chúng 1.3 Tổng quan Threads Các trạng thái tiến trình mơ tả hình Hình Sơ đồ FSM threads Trong Pintos, trạng thái luồng khai báo cấu trúc “enum thread_status” THREAD_RUNNING: Luồng chiếm CPU làm việc CPU THREAD_READY: Luồng sẵn sàng làm việc chưa đưa vào CPU, đặt hàng đợi ready queue chờ đến lượt THREAD_BLOCKED: Luồng chờ kiện xảy tiếp tục làm việc Khi luồng đưa vào trạng thái THREAD_BLOCKED để nhường CPU cho luồng khác ready queue làm việc THREAD_DYING: Luồng thực xong việc TERMINATED Nó tiêu hủy Các hàm chuyển đổi trạng thái luồng mô tả hình Chúng khởi tạo “src/threads/thread.c” Hình Sơ đồ hàm chuyển trạng thái threads Cấu trúc luồng khai báo “threads/thread.h”: tid_t_tid: Thread identifier enum thread_status status: Thread state char name[16]: Name (for debugging purpose) uint8_t *stack: Saved stack pointer int priority: Priority (from to 63) int base_priority: Base priority for priority donation struct list_elem allelem: List element for all threads list struct list_elem elem: List element unit32_t *pagedir: Page directory usigned magic: Detects stack overflow Hình Mơ tả chức hàm thread_yield() Do sử dụng vòng lặp while() nên luồng vào hàng đợi ready_list liên tục đến vòng lặp kết thúc Việc gây ảnh hưởng đến hiệu hệ điều hành 2.2 Mô tả mục tiêu Thực lại timer_sleep(), đặt “devices/timer.c” Mặc dù hoạt động “busy wait”, tức quay vịng lặp để kiểm tra thời gian gọi thread_yield() đủ thời gian trôi qua Yêu cầu thực lại để tránh “busy waiting” 2.3 Phương pháp giải Đối với luồng Pintos, luồng chuyển sang trạng thái sleep khơng có nhu cầu sử dụng CPU đánh thức sau khoảng thời gian Cụ thể, luồng có thời gian gian wakeup_ticks để ngủ trước đánh thức Đầu tiên, luồng khởi tạo wakeup_ticks, sau thêm vào hàng đợi sleeping_list xếp theo thứ tự tăng dần thời gian ngủ Khi luồng đưa sang trạng thái THREAD_BLOCKED Sau khoảng thời gian wakeup_ticks, luồng remove khỏi sleeping_list, chuyển sang trạng thái THREAD_READY đẩy vào cuối hàng đợi ready_list để chờ làm việc với CPU Dưới sơ đồ mô tả chế sleep wake up luồng Hình Cơ chế sleep and wake up 2.4 Triển khai mã nguồn Các hàm cần triển khai cho trình sửa đổi mã nguồn nằm file thread.c, thread.h thư mục “src/threads/” “src/devices/timer.c” thread_block(): Cho luồng ngủ (trạng thái THREAD_BLOCKED) Nó khơng schedule() đánh thức thread_unblock() thread_unblock(): Đưa luồng trạng thái THREAD_BLOCKED sang trạng thái ready-to-run (trạng thái THREAD_READY) thread_tick(): Được gọi timer_interrupt timer_tick Hàm chạy exteral_interrupt_context timer_interrupt(): Bộ xử lý ngắt hẹn timer_sleep(): Ngủ khoảng thời gian TICKS timer_ticks Ngắt phải bật Dựa vào hàm trên, ta thấy hàm timer_interrupt() gọi đến hàm thread_ticks() Mỗi ngắt xảy ra, hệ điều hành dừng việc làm để gọi hàm xử lý ngắt Hàm thread_ticks() gọi sau tick kiểm tra luồng chạy vượt time slice chưa (time slice khai báo ticks), hết thời gian gọi hàm intr_yield_on_return() để thực context switch, sau gọi hàm thread_unblock() đánh thức luồng ngủ Việc đưa luồng vào trạng thái ngủ thực hàm timer_sleep() mô tả mục 2.4 2.5 Mô tả mã nguồn sửa đổi, bổ sung Các biến thêm vào cấu trúc thread threads/thread.h: int64_t sleeping_ticks: Thời gian ngủ đánh thức luồng Các hàm thêm vào threads/thread.c: thread_wakeup(): Đánh thức threads không bận thread_sleep(): Đặt chế độ ngủ để tránh việc busy waiting thread_insert_sleep_list(): đẩy vào cuối hàng đợi ready_list để chờ làm việc với CPU Các biến hàm thêm vào threads/thread.c: static struct list sleeping_list: Danh sách chờ luồng timer_sleep Các hàm chỉnh sửa theo giải pháp trên: threads/thread.c: thread_init(), thread_tick() threads/timer.c: timer_sleep() 2.6 Kết Kết sau kiểm tra lệnh make check pass 5/5 test case alarm clock 10 Hình Kết sau make check test alarm-clock CHƯƠNG SYSTEM CALLS Chương mô tả mục tiêu, phương pháp, triển khai mã nguồn, mô tả mã nguồn sửa đổi, bổ sung giải vấn đề System Calls Project Pintos 3.1 Đặt vấn đề Khi làm việc Pintos với phần hệ thống mà cho phép chạy chương trình người dùng, ta nhận thấy mã nguồn hệ thống hỗ tải chạy chương trình người dùng lại thực tương tác thiết lập vào I/O Do cần thơng qua các gọi hệ thống (System Calls) ta kích hoạt chương trình tương tác với hệ điều hành 11 Hình Sơ đồ tương tác chương trình người dùng OS Để cài đặt system call, trước hết cần tìm hiểu thao tác đọc ghi cách an tồn liệu có khơng gian nhớ ảo tiến trình cấp độ người dùng Các tham số system call nằm stack tiến trình người dùng, bên trỏ stack Hình Cấu trúc thành phần layout Virtual Memory Chú ý rằng, trỏ stack không hợp lệ chương trình gọi system call, nhân hệ điều hành bị crash Một số tham số system call trỏ đến buffer bên không gian địa tiến trình 12 người dùng, buffer không hợp lệ lúc nên cần phải cẩn thận thực thao tác với chúng Cần phải xử lý trường hợp system call không thực thi trọn vẹn lỗi truy cập nhớ không hợp lệ Các lỗi bao gồm trỏ null, trỏ không hợp lệ (trỏ đến vùng nhớ chưa ánh xạ) trỏ vùng nhớ nhân hệ điều hành Đặc biệt, xảy trường hợp vùng nhớ byte chứa byte nhớ hợp lệ byte nhớ không hợp lệ, vùng nhớ nằm biên bảng phân trang Khi xảy trường hợp này, cần phải chấm dứt (terminate) tiến trình người dùng 3.2 Mơ tả mục tiêu Ban đầu, lời gọi hệ thống hệ điều hành Pintos chưa xây dựng sẵn Mục tiêu sau sửa đổi lại gọi chức hệ thống để cung cấp phục vụ cho người sử dụng Pintos như: Các lời gọi hệ thống liên quan đến tiến trình (process): halt, exit, exec, wait Các lời gọi hệ thống liên quan đến tệp tin (file): create, remove, open, filesize, read, write, seek, tell, close Giao diện tạo để cung cấp dịch vụ hệ điều hành, cho phép chế độ người dùng sử dụng tính kernel 3.3 Yêu cầu triển khai Mã nguồn Pintos có sẵn trình xử lí gọi hệ thống (system calls handler) dạng ngắt 0x30 nằm userprog/syscall.c Khi gọi gọi hệ thống trình xử lí sử dụng số gọi hệ thống (system call number) Sau kiểm tra tính hợp lệ trỏ danh sách tham số đầu vào, trỏ chỏ tới vùng người dùng hợp lệ Theo quy ước gọi, system call gọi bới giá trị byte trỏ trỏ esp Nó lấy cách tham chiếu đến đến giá trị stack user (địa esp + 4, esp + 8,…) Cuối trình xử lí gọi hệ thống chép đối số user stack vào kernel lưu kết lệnh gọi hệ thống ghi EAX Các gọi hệ thống định nghĩa src/lib/syscall_nr.h 13 Hình Sơ đồ xử lí gọi hệ thống Theo yêu cầu vấn đề System Calls (project Pintos) đề , ta cần phải xây dựng lệnh system calls cho hệ thống với yêu cầu cụ thể cho lệnh gọi sau : System Call: void halt (void): Lệnh system call để kết thúc Pintos System Call: void exit (int status): Chấm dứt chương trình người dùng tại, trả lại trạng cho kernel Nếu có tiến trình cha (parent process) chờ trả trạng thái, trạng thái cho biết thành cơng cịn giá trị khác khơng cho biết có lỗi System Call: pid_t exec (const char * cmd_line): Tạo tiến trình (child process) thực thi chương trình tương ứng với cmd_line Chuyền vào giá trị đối số nhận kết trả pid (process's program id ).Kết trả phải pid -1, khơng pid khơng hợp lệ, ngun nhân chương trình khơng thể tải khơng chạy lí Khi ấy, tiến trình cha khơng thể trả từ trình thực thi tiến trình chưa thực thi xong System call: int wait (pid_t pid): Chờ tiến trình xử lí pid trả trạng thái pid đến exit Nếu pid chưa kết thúc, cần đợi kết thúc thơi Sau đó, trả trạng thái mà pid hồn thành để Nếu pid khơng gọi exit () để thốt, bị kernel kết thúc (có thể ngoại lệ xảy ra), wait (pid) trả -1 Một tiến trình cha gọi đợi tiến trình kết thúc trả trạng thái exit tiến trình biết tiến trình bị kết thúc kernel wait () thất bại trả -1 nếu: 14 + pid không tham chiếu trực tiếp tới tiến trình chuỗi gọi + Tiến trình cần gọi wait vốn gọi wait() thành công pid Lưu ý: Tất tài nguyên tiến trình, bao gồm struct thread , phải giải phóng cho dù tiến trình cha có đợi hay khơng việc tiến trình trước hay sau tiến trình cha Hình Sơ đồ luồng điều khiển System Call: bool create (const char * file, unsigned initial_size): Tạo file với đối số đầu vào tên file kích thước khởi tạo ban đầu ( đơn vị byte) Kết trả true thành công, trả false thất bại Việc tạo file không theo kèm ln việc mở file Mở file tạo thao tác riêng biệt yêu cầu lệnh gọi hệ thống mở System call: bool remove (const char * file): Thực xoá file ,đối số đầu vào tên file cần xoá Kết trả sau gọi hàm true thành công, trả false thất bại Một file bị xóa mở hay đóng việc xóa file mở khơng đóng file Xem xóa file mở để biết chi tiết System call: int open (const char * file): Thực mở file Trả giá trị nguyên không âm gọi "file descriptor" (fd) trả -1 mở file (Các fd đánh số thể cho điều khiển: fd (STDIN_FILENO) đầu vào tiêu chuẩn, fd (STDOUT_FILENO) đầu tiêu chuẩn Lệnh gọi hệ thống mở file không trả fd hay fd Mỗi tiến trình 15 có fd độc lập Các tiến trình khơng kế thừa fd từ tiến trình cha Khi file mở nhiều lần, dù mở tiến trình hay nhiều tiến trình lần mở trả fd Có thể có nhiều fd khác cho file giúp việc gọi lệnh đóng file độc lập tách biệt mà file mở nhiều tiến trình) System call: int filesize (int fd): Trả kích thước file tính theo byte Đối số đầu vào filesize() fd file cần tính kích thước System call: int read (int fd, void * buffer, unsigned size): Đọc byte kích thước từ file mở ( dựa vào fd để xác định file mở cần đọc) vào đệm Trả số bytes thực đọc (0 cuối file) -1 file đọc Với fd =0 thực đọc kí tự từ bàn phím System call: int write (int fd, const void * buffer, unsigned size): Ghi kích thước bytes từ đệm buffer vào file mở Trả số bytes ghi (có thể nhỏ kích thước có số byte khơng ghi được) Nếu ghi vào phần cuối file làm mở rộng kích thước file (trước sửa đổi mã nguồn, việc mở rộng file hệ thống file (file system) mã nguồn gốc không thực được) Nhiệm vụ lệnh write ghi nhiều bytes tốt vào cuối file trả số lượng byte thực tế ghi trả không ghi byte Với fd =1 ghi liệu console , cần đảm bảo kích thước ghi không lớn vài trăm byte Nếu đệm lớn thực chia nhỏ, khơng, dịng văn xuất từ tiến trình khác bị xen kẽ console, gây nhầm lẫn cho người đọc gây lỗi thực lệnh System call: void seek (int fd, unsigned position): Lệnh gọi tìm kiếm seek, đối số đầu vào fd file vị trí cần tìm kiếm file Thực cách thay đổi byte đọc ghi file mở thành vị trí xác định byte Vị trí tính vị trí bắt đầu file Nếu vị trí tìm kiếm cần tìm nằm ngồi liệu cuối file thu bytes, ta hiểu vị trí cuối file Việc ghi sau gây mở rộng file, khoảng trằng cuối file lấp đầy số ( Tại project ta khơng thay đổi file Pintos file có độ dài cố định, muốn sau project hồn thành thực ) System call: unsigned tell (int fd): Trả vị trí byte đọc ghi file mở, vị trí trả tính theo bytes (tính từ đầu file 0) System call: void close (int fd): Đóng file fd Việc kết thúc tiến trình đóng tất fd mở 16 3.4 Triển khai mã nguồn Các hàm biến triển khai file: threads/thread.c thread.h userprog/process.c userprog/syscall.c syscall.h 3.5 Sửa đổi mã nguồn bổ sung Các biến hàm thêm vào threads/thread.h: struct thread *parent: Mơ tả tiến trình cha struct list fd_list: Mô tả danh sách file thuộc thread struct list child_status: Danh sách trạng thái tiến trình con, để tiến trình cha nhận trạng thái quy trình sau quy trình kết thúc struct child_process_status *relay_status: Biểu thị trạng thái tiến trình chuyển tiếp đến tiến trình cha struct semaphore sema: Tiến trình đợi semaphore struct child_process_status: Danh sách trạng thái tiến trình gồm thành phần sau: -int ret_status: Biến trả trạng thái tiến trình -int tid: Biến id tiến trình -bool finish: Kiểm tra tiến trình chạy xong chưa -bool iswaited: Trả true process parent chờ đợi tiến trình cách gọi system call wait() -int loaded: Biến xem tiến trình tải thành cơng hay chưa -struct list_elem elem: Danh sách thành phần thread child Các hàm chỉnh sửa threads/thread.c: Hàm tid_t thread_create(): thêm trạng thái tiến trình process_child void thread_unblock(): thêm chức trả tên tiến trình khởi chạy void thread_exit(): thêm chức xóa thread đặt trạng thái thành kết thúc lên lịch cho tiến trình khác static void init_thread(): thêm chức khởi tạo semaphore, khởi tạo file khởi tạo danh sách trạng thái process_child Chỉnh sửa khung hàm cấp sẵn: userprog/process.c: 17 process_execute(): Tiến trình cha đợi biết tiến trình tạo thành công file nhị phân tải thành công Sau khởi tạo Samaphore đầu tiên, gọi sema_down để đợi tải file thành cơng tiến trình start_process(): Mục đích thread tải tiến trình người dùng khởi động nó, tải eip esp user process, esp ngăn xếp Sau tải xong process child trình tải khơng thành cơng đánh thức process parent sau process parent lấy thơng tin việc liệu process child có tải thành cơng hay khơng process_wait(): Lệnh gọi hệ thống wait(pid) tìm pid tiến trình tiến trình đợi kết thúc Các quy trình luồng (tiến trình) lưu trữ danh sách gọi danh sách con, cách duyệt qua danh sách Các biến hàm thêm vào userprog/syscall.c: struct lock file_lock: Xác định khóa tệp để hạn chế nhiều thread sửa đổi tệp lúc typedef int pid_t: Xác định số để nhận dạng thread int fd_num: Xác định mô tả tệp với số nguyên không âm struct_fd: Xác định cấu trúc để biểu diễn cho file Các hàm thêm vào userprog/syscall.c: find_fd_by_num(): hàm để thuận lợi cho việc kiểm tra sau hệ thống gọi hàm bool char pointer_valid()/bool pointer_valid(): hai hàm giúp kiểm tra giá trị trỏ truyền vào lời gọi hệ thống có chức khác nên giá trị trỏ truyền vào khác void close_all_fd(): hàm đóng tất tệp chạy syscall_init(): hàm để chọn chức xử lý ngắt vào ghi syscall_handle(): hàm cho phép gọi lời gọi hệ thống thông qua trỏ intr_frame *f trỏ đến số nguyên tương ứng với lời gọi hệ thống Các hàm syscall_halt(), syscall_exit(), syscall_exec(), syscall_wait(), syscall()_create(), syscall_remove(), syscall_open(), syscall_filesize(), syscall_read(), syscall_write(), syscall_seek(), syscall_tell(), syscall_close(): dùng trỏ intr_frame *f để xác định gọi system call kiểm tra giá trị trỏ f tuyền vào có hợp lệ khơng thơng qua hàm bool char pointer_valid()/bool pointer_valid() void halt (void): Sử dụng hàm shutdown_power_off(void) kết thúc pintos 18 void exit (int status): Thốt tiến trình ta cần sử dụng hàm void thread_exit(void) pid_t exec (const char * cmd_line): Tạo tiến trình con, khơng thể quay lại tiến trình tạo (hoặc không tạo thành công ) Tạo thành cơng tiến trình hồn thành file thực thi sẵn sàng chạy Vậy cần return process_execute(cmd_line) int wait (pid_t pid): (): Lệnh gọi hệ thống wait(pid) tìm pid tiến trình tiến trình đợi kết thúc Các quy trình luồng (tiến trình) lưu trữ danh sách gọi danh sách con, cách duyệt qua danh sách bool create (const char * file, unsigned initial_size): Tạo file với kích thước initial_size , sử dụng hàm: bool filesys_create(const char *name, off_t initial_size), trả giá trị true thành công false thất bại bool remove (const char * file): Xoá file ,ta sử dụng hàm :bool filesys_remove(const char *name), kết trả true thành công false thất bại Sau thực gọi lệnh file bị xố dù mở hay đóng int open (const char * file): Thực mở file tương ứng với đường dẫn tới file ,trả fd Ta sử dụng hàm : struct file *filesys_open(const char *name) int filesize (int fd): Trả kích thước (tính theo byte) file cần tính tính kích thước, sử dụng hàm : off_t file_length(struct file *file) int read (int fd, void * buffer, unsigned size): Đọc byte kích thước từ file fd mở vào đệm Trả số bytes thực đọc (0 cuối file) file đọc Nếu fd =0 đọc từ bàn phím hàm unit8_t input_getc(void), cịn đọc từ file sử dụng hàm : off_t file_read(struct file *file, void *buffer, off_t size) int write (int fd, const void * buffer, unsigned size): Sử dụng hàm để thực nhiệm vụ ghi: void put_buf(const char *buffer, size_t n) off_t file_write(struct file *file, const void *buffer, off_t size) 19 Ghi kích thước bytes từ đệm buffer vào file fd mở trả số bytes ghi Nếu fd = ghi console dùng hàm putbuf() ,còn ghi file ta sử dụng hàm file_write() void seek (int fd, unsigned position): Thực cách thay đổi byte đọc ghi file mở thành vị trí xác định byte Tại dùng hàm :void file_seek(struct file *file, off_t new_pos) unsigned tell (int fd): Sử dụng hàm ;off_t file_tell(struct file *file) để trả vị trí byte đọc ghi file fd mở void close (int fd): Đóng file fd chọn cách sử dụng hàm void file_close(struct file *file) 3.6 Kết Sau kiểm tra lệnh make check pass: Hình 10 Kết sau make check test system calls 20 CHƯƠNG KẾT LUẬN Sau tìm hiểu đưa giải pháp, vấn đề “Alarm Clock” Project Pintos giải Vòng lặp “busy waiting” thay chế sleeping and wake up Trong Project 2, nhóm em thực hàm lời gọi hệ thống mà Pintos chưa hỗ trợ Về vấn đề System Calls nhóm em hồn thành chạy thử nghiệm thành cơng Sau kết thúc mơn học, có nhiều thời gian hơn, chúng em có gắng dùng kiến thức tính luỹ từ mơn học để hồn thành project lại dự án Pintos Chúng em xin chân thành cảm ơn thầy Phạm Văn Tiến hướng dẫn chúng em để hoàn thành dự án 21 TÀI LIỆU THAM KHẢO https://web.stanford.edu/~ouster/cgi-bin/cs140-spring20/pintos/pintos_2.html#SEC15 https://www.scs.stanford.edu/21wi-cs140/pintos/pintos_2.html Hyperlink project: https://github.com/DinhHung2555-AnhDuc2433-HuyHoang2545/pintos-project1 https://github.com/DinhHung2555-AnhDuc2433-HuyHoang2545/pintos- project_2 22 ... GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS 1. 1 Tổng quan Pintos .3 1. 2 Cây thư mục nguồn 1. 3 Tổng quan Threads CHƯƠNG ALARM CLOCK 2 .1 Vấn đề Alarm Clock ... hồn thành việc lập trình để hiểu hệ điều hành Pintos, giải vấn đề hệ điều hành Trong báo cáo này, nhóm chúng em trình bày cụ thể làm tuần vừa qua thông qua chương sau: Chương 1: Giới thiệu hệ điều. .. wait(đã pass h System Calls BẢNG PHÂN CÔNG CÔNG VIỆC ii CHƯƠNG GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS Chương giới thiệu tổng quan hệ điều hành Pintos tổng quan thư mục nguồn hệ điều hành Pintos 1. 1 Tổng quan