LỜI NÓI ĐẦUBài báo cáo được thực hiện trong quá trình tìm hiểu, học tập và triển khai bài tập lớn về Pintos của môn Hệ điều hành.. Hiển thị chuỗi “system call!”.1.2 Syscall liên quan đến
Trang 1TRƯỜ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 MÔN HỆ ĐIỀUHÀNH
Đề tài:
TRIỂN KHAI SYSTEM CALL TRONG USER
PROGRAM PINTOS
Trang 2Giảng viên hướng dẫn:
TS Phạm Văn Tiến
Hà Nội, 12-2021
download by : skknchat@gmail.com
Trang 3LỜI NÓI ĐẦU
Bài báo cáo được thực hiện trong quá trình tìm hiểu, học tập và triển khai bài tập lớn
về Pintos của môn Hệ điều hành Cảm ơn thầy Phạm Văn Tiến đã giúp đỡ, hướng dẫn chúng em để có thể hoàn thành bài tập lớn lần này
Trang 5MỤC LỤC
DANH MỤC HÌNH VẼ i
CHƯƠNG 1 SYSTEM CALL 1
1.1 Argument Passing 1
1.2 Syscall liên quan đến quản lý tiến trình 2
1.3 Syscall liên quan đến tập tin 5
CHƯƠNG 2 KẾT QUẢ 7
KẾT LUẬN 9
TÀI LIỆU THAM KHẢO 10
Trang 6DANH MỤC HÌNH VẼ
Hình 1 Chương trình echo.c 1
Hình 2 Kết quả trả về syscall number 2
Hình 3 Gỡ lỗi sử dụng hàm printf() 2
Hình 4 Hiển thị chuỗi “system call!” 2
Hình 5 Syscall number 3
Hình 6 Hiển thị syscall number của SYSWRITE và SYSEXIT 5
Hình 7 Gỡ lỗi với printf trong syscall_hander 5
Hình 8 Kết quả so sánh với mã nguồn ban đầu 7
Hình 9 Kết quả “make check” 7
i
download by : skknchat@gmail.com
Trang 7CHƯƠNG 1 SYSTEM CALL
Tổng quan về Pintos, cách triển khai về System call em đã đề cập trong báo cáo chung Ở chương này, em tập chung triển khai chi tiết vào trong mã nguồn
1.1 Argument Passing
Hiện tại, mã nguồn Pintos, hàm process_execute() không hỗ trợ truyền tham số vào tiến trình mới Vì vậy em thực hiện thêm phân tích cú pháp của tên file truyền vào và cấu trúc lại Stack
Sau đó gọi nó trong hàm process_execute() và chạy lệnh pintos -q run ‘echo x’ với echo là 1 chương trình để in tham số ra màn hình
Hình 1 Chương trình echo.c
Như vậy, sau khi chạy thì hệ điều hành đã thực hiện đến hàm syscall_hander() nằm trong src/userprog/syscall.c và in ra màn hình chuỗi “system call!”
Trang 8Hình 2 Hiển thị chuỗi “system call!”.
1.2 Syscall liên quan đến quản lý tiến trình
Tại hàm syscall_hander(), một tham số struc intr_frame *f được truyền vào Ta đi
tìm hiểu đó là gì, tìm tới src/threads/interrupt.h Nhận thấy nếu intr_frame trỏ đến esp,
Hình 3 Gỡ lỗi sử dụng hàm printf().
Hình 4 Kết quả trả về syscall number.
2
download by : skknchat@gmail.com
Trang 9ta sẽ nhận được một system call number Ta gỡ lỗi bằng printf() để xem system call number mà hệ thống đang gọi tới là bao nhiêu
Vậy số 9 là gì, ta quan sát trong src/lib/syscall-nr.h Số 9 là SYS_WRITE và echo.c
là một chương trình sử dụng để in ra và do đó hệ thống đã gọi SYS_WRITE Ta sẽ sử dụng các số còn lại để tương ứng với syscall tiếp theo
Hình 5 Syscall number.
Tiếp theo, ta triển khai các trường hợp mà hệ thống có thể gọi tới syscall Thực hiện thay đổi trong src/userprog/syscall.c Ta cần cộng thêm một số hợp lý cho tham số để
có thể trỏ tới đúng syscall number trong Stack
Trước tiên thực hiện với SYS_EXIT và SYS_WRITE:
Trang 10trong đó hàm exit() được viết là:
Với SYS_WRITE
Trong đó hàm write() được viết là:
Thêm một dùng printf() trong hàm syscall_hander() để quan sát được những gì bên
trên ta vừa thay đổi:
4
download by : skknchat@gmail.com
Trang 11Hình 6 Gỡ lỗi với printf trong syscall_hander.
Chạy thử lại, em nhận được kết quả:
Hình 7 Hiển thị syscall number của SYSWRITE và SYSEXIT.
Còn đối với SYS_HALT, đơn giản ta chỉ cần gọi hàm shut_power_off() Như vậy ta
đã sửa đổi và triển khai các syscall liên quan đến quản lý tiến trình
1.3 Syscall liên quan đến tập tin
Để thực hiện các lệnh syscall liên quan đến tệp, cấu trúc dữ liệu cho phép quản lý các tệp được khai báo trong src/threads/thread.h
- open(const char *file)
Một đối tượng file_desc mới được tạo ra Tại thời điểm này, vùng bộ nhớ được phân bổ cho page của user program
Return its fd
Mở tệp thông qua filesys_open(), trong trường hợp mở không thành công, tài nguyên được giải phóng và -1 được trả về
Trang 12Thông qua fd được đưa ra như một đối số, entry file desc được tìm thấy trong file desc table
Đóng tệp đã mở file_close(), xóa tệp khỏi danh sách và giải phóng bộ nhớ
Straightforward: filesys_create() và filesys_remove() được ủy quyền
thực thi
Vì fd được nhận như một đối số, entry file desc cũng được tìm trong danh sách và object file được truy xuất Nó được xử lý bằng cách sử dụng API file system
Nếu một fd không chính xác được cung cấp, một lỗi có thể được tạo ra
và chương trình kết thúc Nó được xử lý để trả về -1 thay cho kết quả
mà không có kết thúc
Đầu tiên, nó được kiểm tra xem buffer trong user memory có đúng hay không
Khi fd = 0, bộ đệm được lấp đầy bởi các size byte thông qua
input_getc() Tại thời điểm này, sử dụng put_user() để kích hoạt kết
thúc với lỗi segfault.
Tương tự, kiểm tra xem buffer có chính xác hay không
Nếu fd = 1, hàm putbuf() được sử dụng để xuất nội dung buffer ra bàn
điều khiển
Nếu không, tìm table file desc và object file bằng fd, và ghi nội dung
của buffer vào file thông qua hàm file_write().
6
download by : skknchat@gmail.com
Trang 14CHƯƠNG 2 KẾT QUẢ
Sau khi triển khai các syscall bên trên, em thực hiện kiểm tra những gì mình đã thay đổi so với mã nguồn ban đầu mà Pintos cung cấp
Hình 8 Kết quả so sánh với mã nguồn ban đầu.
Thực hiện “make check” trong src/userprogram sau khi đã được thay đổi, kết quả thu được như sau:
Hình 9 Kết quả “make check”.
8
download by : skknchat@gmail.com
Trang 15Kết quả thu được, các test case cho halt, exec, wait của syscall quản lý tiến trình và create, remove, open, filesize, read, write, seek, tell, close của syscall quản lý tập tin
cơ bản đều PASS Những trường hợp FAIL còn lại, em sẽ tiếp tục khắc phục
Trang 16KẾT LUẬN
Qua bài tập lớn Hệ điều hành Pintos, em đã được tìm hiểu và học hỏi nhiều kiến thức, kỹ năng liên quan đến hệ điều hành Từ đó, bản thân em cảm thấy mình trau dồi được thêm nhiều kiến thức bổ ích cũng như rèn luyện kĩ năng cần thiết khác trong học tập và cả trong làm việc nhóm
Em xin chân thành cảm ơn thầy Phạm Văn Tiến đã hướng dẫn em có thể hoàn thành
đè tài
10
download by : skknchat@gmail.com
Trang 17TÀI LIỆU THAM KHẢO
Hyperlink: juytu/NguyenDuyTu_2848_DoXuanVu_2892 (github.com)