Tải bản đầy đủ (.docx) (18 trang)

Báo cáo bài tập lớn hệ điều hành đề tài system call và virtual memory

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (899.92 KB, 18 trang )

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

System call và virtual memory
Giáo viên hướng dẫn: TS. Phạm Văn Tiến
Sinh viên thực hiện:
Tên
Nguyễn Thành Trung
Phạm Đức Thắng

Hà Nội, 06-2022

TIEU LUAN MOI download : moi nhat


ContentsMỤCLỤC
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

TIEU LUAN MOI download : moi nhat


II. VIRTUAL MEMORY ........................................................................
1.1. Tổng quan ............................................................................................
Call PageFault Handler Function....................................................................20
Page fault handler............................................................................................. 20
2.2. Memmory mapped file...............................................................................20

2

TIEU LUAN MOI download : moi nhat


Lời nói đầu
Hệ điều hành (Operating System - OS) là phần mềm hệ thống
quản lý phần cứng máy tính, tài nguyên phần mềm và cung cấp các dịch
vụ chung cho các chương trình máy tính.
Hệ điều hành đóng vai trị trung gian trong việc giao tiếp giữa
người sử dụng và phần cứng máy tính, cung cấp một mơi trường cho
phép người sử dụng phát triển và thực hiện các ứng dụng của họ một
cách dễ dàng. Hệ điều hành chia sẻ thời gian lập lịch cho các tác vụ để
sử dụng hệ thống một cách hiệu quả và cũng có thể bao gồm phần mềm
kế toán để phân bổ chi phí thời gian xử lý, lưu trữ dung lượng lớn, in ấn
và các tài nguyên khác.
Hệ điều hành trước đây và sau này sẽ ln ln giữu vai trị qua
trọng của thời đại công nghệ. Được sự hướng dẫn của thầy Phạm Văn
Tiến, nhóm em đã tìm hiểu về hệ điều hành pintos và chọn đề tài System

call và Virtual memory để làm đề tài nghiên cứu cho bài tập lớn. Chúng
em xin chân thành cảm ơn sự hướng dẫn, chỉ dạy tận tình của thầy đã
giúp chúng em hồn thành bài tập lớn lần này.

3

TIEU LUAN MOI download : moi nhat


BẢNG PHÂN CHIA CÔNG VIỆC
Phạm Đức Thắng
System call
Virtual
Memory

4

TIEU LUAN MOI download : moi nhat


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 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.

1.2Phương pháp giải quyết
Pintos chỉ hỗ trợ duy nhất một system call là exit. Yêu cầu được đặt ra ở phần
này là cài đặt thêm các system call sau: halt,
exec, wait và practice. Mỗi syscall được khai báo và cài đặt trong thư mục
5

TIEU LUAN MOI download : moi nhat


thư viện cấp độ người dùng, cụ thể là tập tin lib/user/syscall.c. Tập tin này
chứa các thông tin về tham số của từng system call và cách chuyển xử lý về
chế độ kernel. Các hàm xử lý system call của kernel cần phải được cài đặt
trong tập tin userprog/syscall.c.
Chức năng cụ thể của từng system call cần được cài đặt
như sau:
-

halt: Tắt (dừng) hệ thống.

-


exec: Tạo một chương trình mới bằng process_execute()

-

(Pintos khơng hỗ trợ fork. Về bản chất thì exec của Pintos tương

-

tự như fork của Linux).

-

wait: Chờ một tiến trình con thốt.

practice: Thêm 1 vào tham số đầu tiên, sau đó trả về kết quả.
System call này được sử dụng cho mục đích thử nghiệm giống như
tên gọi của nó.
Để cài đặt các system call, trước hết cần tìm hiểu thao tác đọc và ghi một
cách an tồn các dữ liệu đang có trong khơng gian bộ nhớ ảo của các tiến
trình cấp độ người dùng. Các tham số của system call nằm trong stack của
tiến trình người dùng, ngay bên trên con trỏ stack. Chú ý rằng, nếu con trỏ
stack khơng hợp lệ khi một chương trình gọi một system call, nhân của hệ
điều hành sẽ không thể bị crash. Một số tham số của system call là con trỏ
chỉ đến buffer bên trong không gian địa chỉ của tiến trình người dùng, những
buffer này có thể không hợp lệ bất cứ lúc nào nên cần phải cẩn thận khi làm.
-

6

TIEU LUAN MOI download : moi nhat



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 hồn chỉnh có thể đưa vào sử dụng.
Chương trình C hồ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

TIEU LUAN MOI download : moi nhat


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

TIEU LUAN MOI download : moi nhat


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

TIEU LUAN MOI download : moi nhat


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.


2.3.System call liên quan đến tập tin
Yêu cầu ở phần này là cài đặt thêm các system call cần cho việc sử dụng tập tin, cụ thể
là các thao tác: create, remove, open, filesize, read, write, seek, tell và close. Hiện tại
1
0

TIEU LUAN MOI download : moi nhat


Pintos đã có sẵn một hệ thống quản lý tập tin đơn giản. Lưu ý rằng, khi cài đặt, chỉ cần
gọi các hàm thích hợp có sẵn trong thư viện tập tin hệ thống, không cần phải tự cài đặt
bất cứ thao tác với tập tin nào khác. Hệ thống tập tin của Pintos khơng phả safe. Do đó, i
là threadkhi cài đặt các system call trên, cần đảm bảo là chúng sẽ không được gọi nhiều
hàm xử lý tập tin cùng lúc. Đến ội d n ung thực hành 3, một số hàm đồng bộ phức tạp
hơn sẽ được thêm vào hệ thống tập tin của Pintos, nhưng ở phần này, chỉ cần sử dụng
một biến lock toàn cục để đảm bảo thread safety. Lưu ý là không được chỉnh sửa thư
mục /filesys trong phần này. 32 Một điểm nữa cần lưu ý là khi một tiến trình đang chạy,
cần phải đảm bảo rằng khơng có bất kỳ đối tượng nào khác có thể chỉnh sửa tập tin thực
thi (đang lưu trên đĩa) của nó. Hai hàm file_deny_write() và file_allow_write() có thể
được sử dụng để thực hiện điều này. Chú ý: Mã nguồn đã thực hiện ở ội dung thực hành
2 sẽ n được tiếp tục sử dụng để cài đặt và mở rộng ở ội dung thự n h 3. Do hàm đó, kết
quả kiểm thử hoạt động của các chức năng ở n ội dung thực hành 3 sẽ phụ thuộc vào
việc các system call được cài đặt như thế nào ở bài này.

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

TIEU LUAN MOI download : moi nhat


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.

VIRTUAL MEMORY
1.1. Tổng quan
AI.

Bộ nhớ ảo trong Pintos được chia thành 2 vùng: user virtual memory (bộ nhớ ảo của
người dùng) và kernel virtual memory (bộ nhớ ảo của kernel). Bộ nhớ của ảo người
dùng bắt đầu từ địa chỉ ảo 0 đến địa chỉ PHYS_BASE được định nghĩa trong
threads/vaddr.h và có giá trị mặc định là 0xc0000000 (3 GB). Bộ nhớ ảo của kernel
chiếm phần khơng gian cịn lại của bộ nhớ ảo, từ địa chỉ PHYS_BASE cho đến 4 GB.
Bộ nhớ ảo của người dùng được xác định theo từng tiến trình. Khi nhân hệ điều hành
thực hiện việc chuyển từ tiến trình này sang tiến trình khác, nó đồng thời cũng chuyển
đổi không gian bộ nhớ ảo bằng cách thay đổi cấu trúc bảng trang của bộ xử lý (hàm
pagedir_activate() trong userprog/pagedir.c). Ngược lại, bộ nhớ ảo kernel có tính tồn
cục. Nó cũng được ánh xạ theo cách thức tương tự, khơng có sự phân biệt giữa tiến trình
người dùng hoặc tiến trình hệ thống. Trong Pintos, bộ nhớ ảo kernel được ánh xạ 1 1 với
bộ nhớ vật lý, bắt đầu từ - địa chỉ PHYS_BASE. Điều này có nghĩa là địa chỉ ảo
PHYS_BASE sẽ truy cập vào địa chỉ vật lý 0, địa chỉ ảo PHYS_BASE + 0x1234 sẽ truy
cập vào địa chỉ vật lý 0x1234 và cứ như vậy cho đến hết bộ nhớ vật lý. Lưu ý rằng, một
chương trình người dùng chỉ có thể truy cập vào bộ nhớ ảo của người dùng. Bất kỳ

một truy cập nào vào bộ nhớ ảo của kernel đều sẽ gây ra một lỗi trang và phải được xử
1
2

TIEU LUAN MOI download : moi nhat


lý bởi hàm page_fault() trong userprog/exception.c đồng thời tiến trình sẽ phải kết thúc.
Tiến trình hoặc tiểu trình tạo ra bởi nhân hệ điều hành có thể truy cập cả hai bộ nhớ ảo.
Tuy nhiên, nếu có bất kỳ sự truy cập vào một vùng nhớ chưa được ánh xạ từ các đối
tượng này thì cũng sẽ phát sinh một lỗi trang, tương tự như với chương trình người
dùng.

1.2. Phương pháp triển khai mã nguồn
Ta sẽ làm việc trong thư mục vm cho dự án này. Thư mục vm chỉ chứa các tệp Makefiles.
Thay đổi duy nhất từ userprog là Makefile mới này bật cài đặt -DVM. Tất cả mã ta viết sẽ
nằm trong các tệp mới hoặc trong các tệp được giới thiệu trong các dự án trước đó.

’device/block.h/c’
Cung cấp quyền truy cập đọc và ghi dựa trên khu vực để chặn thiết bị. Ta sẽ sử dụng giao
diện này để truy cập phân vùng hoán đổi như một thiết bị khối.
‘pgae.h/c’
Cấu trúc dữ liệu của một trang, đôi khi được gọi là trang ảo, là một vùng liên tục của
bộ nhớ ảo có độ dài 4.096 byte (kích thước trang). một địa chỉ ảo 32 bit có thể được
chia thành số trang 20 bit và độ lệch trang 12 bit (hoặc chỉ bù đắp), như sau:

'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 hố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

TIEU LUAN MOI download : moi nhat


Xóa q trình xử lý liên quan đến Kill (1) Xác thực lỗi_addr
Call PageFault Handler Function

Page fault handler

Handle_mm_fault là một hàm được gọi để xử lý khi xảy ra lỗi trang
Chỉ định một trang vật lý khi xảy ra lỗi trang vàt ải tệp từ đĩa lên trang vật lý
Ánh xạ địa chỉ thực và ảo với bảng trang khi tải xong bộ nhớ vật lý

Ghi tệp vào bộ nhớ vật lý Đường dẫn: Pintos / src / vm /
page.c Kết quả

2.2. Memory mapped file

Memory mapped file:
Xử lý tệp I/O dưới dạng truy cập bộ nhớ thông thường bằng cách ánh xạ khối
đĩa vào một trang trong bộ nhớ
Một tệp ban đầu được đọc bằng cách sử dụng phân trang nhu cầu.
Các lần đọc/ghi tiếp theo đến/từ tệp được coi là bộ nhớ thơng thường truy cập đơn
giản hóa truy cập tệp bằng cách xử lý tệp I/O thông qua bộ nhớ thay vì đọc () ghi ()
các cuộc gọi hệ thống cũng cho phép một số quy trình ánh xạ cùng một tệp cho
phép các trang trong bộ nhớ được chia sẻ
1
4

TIEU LUAN MOI download : moi nhat


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

TIEU LUAN MOI download : moi nhat


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

TIEU LUAN MOI download : moi nhat


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


TIEU LUAN MOI download : moi nhat



×