

















Preview text:
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 MÔN HỆ ĐIỀUHÀNH Đề tài:
TRIỂN KHAI SYSTEM CALL TRONG USER PROGRAM PINTOS Sinh viên thực hiện: Nguyễn Duy Tú lOMoAR cPSD| 59421307 Giảng viên hướng dẫn: TS. Phạm Văn Tiến Hà Nội, 12-2021 lOMoAR cPSD| 59421307 LỜ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 lOMoAR cPSD| 59421307 lOMoAR cPSD| 59421307 MỤ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 lOMoAR cPSD| 59421307 DANH 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 lOMoAR cPSD| 59421307
CHƯƠ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!”. lOMoAR cPSD| 59421307
Hì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. lOMoAR cPSD| 59421307
ta 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: lOMoAR cPSD| 59421307
trong đó 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: lOMoAR cPSD| 59421307
Hì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ề. - close(int fd) lOMoAR cPSD| 59421307
Thô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ớ.
- create(), remove()
Straightforward: filesys_create() và fi
lesys_remove() được ủy quyền thực thi.
- filesize(), tell(), seek()
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.
- read(fd, buffer, size)
Đầ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.
- write(fd, buffer, size)
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(). lOMoAR cPSD| 59421307 lOMoAR cPSD| 59421307
CHƯƠ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”. lOMoAR cPSD| 59421307
Kế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. lOMoAR cPSD| 59421307 KẾ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. lOMoAR cPSD| 59421307
TÀI LIỆU THAM KHẢO
[1] Pintos Projects: Project 2--User Programs (stanford.edu)
[2] Guide to x86 Assembly (virginia.edu)
[3] Executable and Linkable Format - Wikipedia
Hyperlink: juytu/NguyenDuyTu_2848_DoXuanVu_2892 (github.com) lOMoAR cPSD| 59421307
download by : skknchat@gmail.comDownloaded by Quoc Khai (quockhai36@gmail.com)