Professional Documents
Culture Documents
Báo cáo BTL hệ điều hành
Báo cáo BTL hệ điều hành
Báo cáo BTL hệ điều hành
Đề tài
System call và virtual memory
Hà Nội, 06-2022
MỤC LỤC
Contents
Lời nói đầu....................................................................................................
I. System call...........................................................................................
1.1 Tổng quan................................................................................................
1.2Phương pháp giải quyết..........................................................................
1.3Cách triển khai mã nguồn......................................................................
2.Mô tả mã nguồn đã sửa đổi.......................................................................
2.1 Argument Passing...............................................................................
2.2. System call liên quan đến tiến trình.....................................................
2.3.System call liên quan đến tập tin...........................................................
3.KẾT QUẢ...................................................................................................
1
II. VIRTUAL MEMORY........................................................................
1.1. Tổng quan............................................................................................
Call PageFault Handler Function....................................................................20
Page fault handler..............................................................................................20
2.2. Memmory mapped file...............................................................................20
2
Lời nói đầu
3
BẢNG PHÂN CHIA CÔNG VIỆC
4
I.System call
1.1 Tổng quan
Trong máy tính, một system call là cách lập trình trong đó một
chương trình máy tính yêu cầu một dịch vụ từ nhân của hệ điều hành mà
nó được thực thi. Một system call là cách làm cho chương trình thực
hiện một tương tác với hệ điều hành. Một chương trình máy tính thực thi
một system call khi nó thực hiện một yêu cầu tới nhân hệ điều hành.
System call cung cấp các dịch vụ của hệ điều hành tới chương trình phía
người dùng thông qua Application Program Interface (API). Nó cung
cấp một giao diện giữa một process và hệ điều hành để cho phép các tiến
trình ở mức độ người dùng truy vấn các dịch vụ của hệ điều hành. Hầu
hết tất cả các chương trình mà cần tài nguyên cần phải sử dụng system
call.
Nhìn vào sơ đồ, các process thực thi bình thường trong user mode cho đến khi một
system call làm gián đoạn điều này. Sau đó system call được thực thi trên cơ sở ưu
tiên trong kernel mode. Sau khi thực thi system call trong kernel mode, nó sẽ trở lại
user mode và việc thực thi các process phía người dùng có thể được nối lại.
6
1.3Cách triển khai mã nguồn
Sau khi xác định toàn bộ chức năng của vấn đề được đặt ra, nhóm em
đã sắp xếp và sử dụng ngôn ngữ lập trình C để tạo thành một chương
trình hoàn chỉnh có thể đưa vào sử dụng.
Chương trình C hoàn chỉnh được biên dịch bằng “a test framework”
có sẵn do người ra đề tài cung cấp và được chạy thông qua Termial trên
hệ điều hành Ubuntu 20.04. Kết quả cuối cùng sẽ được hiển thị tại màn
hình giao diện Terminal.
2.Mô tả mã nguồn đã sửa đổi
2.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.
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!”.
7
2.2. System call liên quan đến tiến trình
Tại hàm syscall_hander(), một tham số được truyền vào. Ta đi struc intr_frame *f 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,
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.
8
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:
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
9
Chạy thử lại, ta nhận được kết quả
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.
3.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.
Thực hiện “make check” trong src/userprogram sau khi đã được thay đổi, kết quả thu
được như sau:
1
1
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.
'frame.h/c'
Cấu trúc dữ liệu của một khung nhân, đôi khi được gọi là khung vật lý hoặc khung trang,
là một vùng liên tục của bộ nhớ vật lý.
'swap.h/swap.c'
Dữ liệu nghiêm ngặt của một vùng hoán đổi. Khe trao đổi là một vùng liên tục, có kích
thước trang của không gian đĩa trong phân vùng hoán đổi.
2.Mô tả mã nguồn
2.1. Phân trang( paging)
Xử lý lỗi trang Pintos là một hàm page_fault () để xử lý khi xảy ra lỗi trang Đường dẫn:
pintos / src / userprog / exception.c
Quá trình xử lý page_fault của pintos hiện tại đang tạo ra "lỗi phân đoạn" vô điều kiện
nếu lỗi xảy ra sau khi cho phép hoặc xác minh địa chỉ và kết thúc :
1
3
Xóa quá trình xử lý liên quan đến Kill (-1)
Xác thực lỗi_addr
Call PageFault Handler Function
Ghi tệp vào bộ nhớ vật lý Đường dẫn: Pintos / src / vm / page.c
Kết quả
1
4
Memory mapped filed I/O:
Cho phép truy cập thuận tiện hơn vào các thiết bị I/O, nhiều kiến trúc máy tính
cung cấp I/O được ánh xạ bộ nhớ trong trường hợp này, các phạm vi địa chỉ bộ nhớ
được đặt sang một bên và được ánh xạ tới các thanh ghi thiết bị đọc và ghi vào các địa
chỉ bộ nhớ này khiến dữ liệu có thể được chuyển đến và từ các thanh ghi thiết bị
Kết quả
1
5
2.3. Swapping
Swapping giúp:
Lưu trữ các trang đã chọn trong khu vực hoán đổi khi chúng được đưa vào khu vực
dữ liệu hoặc ngăn xếp các trang trao đổi quy trình được tải lại vào bộ nhớ bằng
cách sửa đổi phân trang theo yêu cầu để vận hành cơ chế thay thế trang bằng thuật
toán dựa trên LRU
Khi truy xuất bộ nhớ người dùng, các mã nguồn ở phần nhânđược cài đặt phải có khả năng
xử lý lỗi trang hoặc ngăn chặn việc xảy ra lỗi trang. Có thể cài đặt phần này bằng cách
thực hiện một trong hai hướng chỉnh sửa mã nguồn sau: thay đổi các hàm ở các tập tin
hoặc chỉ thay userprog/pagedir.c và vaddr.h threads/ đổi hàm page_fault() trong
userprog/exception.c.
Kết quả:
2.4.Stack
Bên trong một system call hoặc khi có một lỗi trang xảy ra do chương trình của người dùng, có thể sử
dụng thuộc tính của esp cấu trúc (được truyền vào struct intr_frame syscall_handler() hoặc page_fault())
để lấy giá trị hiện tại của con trỏ stack. Khi cài đặt stack, có thể áp đặt một số giới hạn về kích thước của
stack như cách mà phần lớn các hệ điều hành hiện tại đang thực hiện. Một vài hệ điều hành cho phép
1
6
người dùng có thể điều chỉnh giá trị này, chẳng hạn như lệnh ulimit trên một số hệ thống Unix. Trên
nhiều hệ thống GNU/Linux, kích thước giới hạn mặc định là 8 MB. Trang đầu tiên của stack có thể được
cấp phát và khởi tạo thông qua tham số dòng lệnh tại thời điểm nạp, điều này sẽ giúp nó không cần phải
chờ khi có lỗi xảy ra. Tất cả các trang stack đều được xem là có thể thay thế. Khi một trang bị thay thế,
nó cần phải được lưu xuống vùng swap.
Kết quả:
1
7