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ủ
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
Đề 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:
Trang 2MỤ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Ả
Trang 3II VIRTUAL MEMORY
1.1 Tổng quan
Call PageFault Handler Function 20
Page fault handler 20
2.2 Memmory mapped file 20
Trang 4Lờ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ẽ luôn luôn 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 hoàn thành bài tập lớn lần này.
Trang 5BẢNG PHÂN CHIA CÔNG VIỆC
Phạm Đức Thắng Nguyễn Thành Trung System call
Virtual
Memory
Trang 6I.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.
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
Trang 7thư 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 thoá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 toà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
Trang 81.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!”.
Trang 92.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,
Trang 10Tiế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
Trang 11Chạy thử lại, ta nhận được kết quả
Trang 12Pintos đã 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:
Trang 13Kế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
II VIRTUAL MEMORY
1.1 Tổng quan
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
Trang 14lý 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 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 :
Trang 15 Xóa quá 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:
Trang 16Memory 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ả
Trang 172.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ả:
Trang 18ngườ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ả: