You are on page 1of 23

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

TRƯỜNG ĐIỆN - ĐIỆN TỬ

BÀI TẬP LỚN BỘ MÔN

HỆ ĐIỀU HÀNH

Đề tài: System call và Virtual memory

Giảng viên hướng dẫn: TS. Phạm Văn Tiến

Sinh viên thực hiện: Ngô Thế Anh 20192687

Nguyễn Hữu Linh 20192966

Phan Việt Nam 20193036


Hà Nội, 1-2023
LỜI NÓI ĐẦU

Với chức năng phân phối và quản lý tài nguyên hợp lý, đồng thời có thể tạo ra giao
diện thân thiện với người dùng, hệ điều hành là một phần then chốt không thể thiếu
được trong mỗi hệ thống máy tính điện tử.

Trong môi trường xử lý đa nhiệm, có thể xảy ra tình huống nhiều luồng đồng thời
sẵn sàng để được xử lý. Điều này yêu cầu hệ điều hành phải lựa chọn, và xử lý các
luồng trong hàng đợi một cách hợp lý và hiệu quả. Do đó, một trong những chức năng
quan trọng không thể thiết trong hệ điều hành là lập lịch cho CPU.

Chính vì vậy, nhóm chúng em đã lựa chọn, nghiên cứu đề tài “System Call” và
Virtual Mapped memory.

Nhóm chúng em xin gửi lời cảm ơn chân thành tới TS. Phạm Văn Tiến đã hướng
dẫn, đưa ra quy trình tìm hiểu đề tài cụ thể để nhóm chúng em có thể hoàn thành được
đề tài.

Trong quá trình thực hiện đề tài, không tránh khỏi những thiết sót, chúng em rất
mong nhận được sự chỉ dẫn và góp ý của thầy để đề tài ngày càng hoàn thiện hơn.

Em xin chân thành cảm ơn.

1
MỤC LỤC

DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT........................................................................i

DANH MỤC HÌNH VẼ............................................................................................................ii

DANH MỤC BẢNG BIỂU......................................................................................................iii

TÓM TẮT ĐỒ ÁN...................................................................................................................iv

CHƯƠNG 1. QUY ĐỊNH VỀ TRÌNH BÀY ĐỒ ÁN.............................................................1

1.1 Quy định chung về định dạng văn bản..........................................................................1

1.2 Quy định về đánh số thứ tự............................................................................................2


1.2.1 Đánh số trang...........................................................................................................2
1.2.2 Đánh số chương mục................................................................................................3
1.2.3 Đánh số hình vẽ và bảng biểu..................................................................................3
1.2.4 Đánh số phương trình...............................................................................................3
1.2.5 Đánh số định nghĩa, định lý, và hệ quả....................................................................4

1.3 Thứ tự các phần của đồ án.............................................................................................4


1.3.1 Bìa quyển đồ án........................................................................................................4
1.3.2 Mẫu nhận xét............................................................................................................4
1.3.3 Lời nói đầu...............................................................................................................5
1.3.4 Lời cam đoan............................................................................................................5
1.3.5 Mục lục.....................................................................................................................6
1.3.6 Danh mục ký hiệu và chữ viết tắt.............................................................................6
1.3.7 Danh mục hình vẽ....................................................................................................6
1.3.8 Danh mục bảng biểu.................................................................................................7
1.3.9 Tóm tắt đồ án............................................................................................................7
1.3.10 Phần mở đầu...........................................................................................................7
1.3.11 Nội dung chính.......................................................................................................7
1.3.12 Kết luận..................................................................................................................7
1.3.13 Tài liệu tham khảo..................................................................................................8
1.3.14 Phụ lục....................................................................................................................8

1.4 Một số điều cần lưu ý trong trình bày............................................................................8


1.4.1 Lưu ý về dấu câu......................................................................................................8
1.4.2 Lưu ý về hình vẽ và bảng biểu...............................................................................11

0
CHƯƠNG 2. CÁC QUY ĐỊNH KHÁC................................................................................13

2.1 Liệt kê tài liệu tham khảo.............................................................................................13


2.1.1 Cách liệt kê.............................................................................................................13
2.1.2 Các loại tài liệu tham khảo.....................................................................................13

2.2 Trích dẫn tài liệu tham khảo........................................................................................15

2.3 Nộp đồ án......................................................................................................................16


2.3.1 Nộp bản cứng.........................................................................................................16
2.3.2 Nộp bản mềm.........................................................................................................16

2.4 Bản quyền kết quả nghiên cứu....................................................................................17

KẾT LUẬN..............................................................................................................................18

Kết luận chung....................................................................................................................18

Hướng phát triển................................................................................................................18

Kiến nghị và đề xuất...........................................................................................................18

TÀI LIỆU THAM KHẢO......................................................................................................19

PHỤ LỤC.................................................................................................................................20

Phụ lục 1. Mẫu trang bìa chính của đồ án........................................................................20

Phụ lục 2. Mẫu trang bìa phụ của đồ án...........................................................................22

Phụ lục 3. Mẫu nhận xét đồ án..........................................................................................24


DANH MỤC HÌNH VẼ VÀ BẢNG BIỂU

Xem Mục Error: Reference source not found


BẢNG PHÂN CÔNG NHIỆM VỤ

Bài số Công việc Người thực hiện


1: System Tìm hiểu chung về System Call Thế Anh
Call Hoạt động của System Call Việt Nam
Triển khai System Call: create, remove, Thế Anh
read
Triển khai System Call: halt, exit, exec Việt Nam
Triển khai System Call: file, wait, filesize Hữu Linh
2 Tìm hiểu chung về Virtual Memory Thế Anh
Phân vùng bộ nhớ ảo: Pages, Frames Thế Anh
Phân vùng bộ nhớ ảo: Page Tables, Hữu Linh
Swap slots
Triển khai chương trình frame.c Thế Anh
Triển khai chương trình frame.c

Triển khai chương trình frame.c


CHƯƠNG 1. TỔNG QUAN VỀ HỆ ĐIỀU HÀNH

1.1 Hệ thống máy tính


Các thành phần của một hệ thống máy tính được minh họa như Hình 1 bên
dưới, bao gồm: Phần cứng, hệ điều hành, chương trình ứng dụng/chương trình hệ
thống, người sử dụng.

- Phần cứng: CPU, bộ nhớ, các thiết bị nhập/xuất,..

- Hệ điều hành: Điều khiển, phối hợp việc sử dụng phần cứng cho nhiều
ứng dụng và nhiều người sử dụng khác nhau.

- Chương trình ứng dụng và chương trình hệ thống: Là các chương trình
giải quyết những vấn đề của người sử dụng như chương trình dịch, trình
duyệt,..

- Người sử dụng: Có thể là người hoặc bản thân máy tính.

Hình 1: Thành phần của một hệ thống máy tính

1.2 Hệ điều hành

1.2.1 Hệ điều hành là gì?

Hệ điều hành là chương trình đóng vai trò trung gian giữa người sử dụng và phần cứng
của máy tính. Hệ điều hành che giấu sự phức tạp đa dạng của phần cứng, giúp cho việc
sử dụng máy tính trở nên đơn giản, hiệu quả. Nhiệm vụ của hệ điều hành là quản lý tài
nguyên máy tính, thực thi các chương trình ứng dụng, hỗ trợ các chức năng mạng…
1.2.2 Sự phát triển của hệ điều hành

- Giai đoạn 0 ( từ 1945 – 1955): đã có máy tính lớn nhưng chưa có hệ


điều hành. Chỉ có một người dùng tại một thời điểm, họ làm việc trực tiếp
với bảng điều khiển.

- Giai đoạn 1 ( từ 1956 – 1965): Hệ thống xử lý theo lô.

- Giai đoạn 2: (1966 – 1980): Hệ thống xử lý đa chương trình –


Multiprogramming system, hệ thống xử lý đa nhiệm – multitasking systems.

- Giai đoạn 3 ( 1981 – nay): Hệ thống đa xử lý – multiprocessor systems,


hệ thống xử lý phân tán – Distributed systems; hệ thống xử lý thời gian thực
( Real – time system), hệ thống nhúng ( Embedded systems).

1.2.3 Chức năng của hệ điều hành

Hầu hết chức năng của hệ điều hành đều liên quan đến việc quản lý tài
nguyền được chia sẻ một cách hiệu quả nhất.

- Tính đa nhiệm: cho phép một số tác vụ khác nhau chia sẻ bộ xử lý, mỗi
tác vụ dường như đang có một máy riêng. Để theo dõi mọi thứ, các tiến
trình và luồng đã được phát triển.

- Quản lý bộ nhớ: Giải quyết vấn đề chia sẻ một bộ nhớ duy nhất cho
nhiều tiến trình khác nhau.

- Quản lý các thiết bị vào ra: Quản lý các hoạt động cơ bản hiệu quả, ví
dụ nhiều thiết bị có thể hoạt động đồng thời. Quản lý các tài nguyên được
chia sẻ như giao diện mạng.

- Quản lý tệp: Cho phép nhiều nhiều tệp, cho nhiều người dùng khác
nhau, chia sẻ không gian trên cùng một thiết bị lưu trữ (disk/ flash ).

- Mạng: Cho phép các nhóm máy tính có thể làm việc cùng nhau.

- Bảo mật: Giải quyết vấn đề bảo vệ thông tin trong khi cho phép tương
tác với nhau.
1.3 Giới thiệu về Pintos

1.3.1 Pintos là gì?

Pintos là một khung hệ điều hành đơn giản cho kiến trúc 8086, được phát triển
tại Đại học Stanford bởi Ben Pfaff vào năm 2004. Pintos được xây dựng để thay thế
cho Not Another Completely Heuristic Operating System (Nachos) – một hệ điều hành
giáo dục ít thực tế hơn. Nó được viết bằng ngôn ngữ lập trình C, hỗ trợ kernel threads,
tải và chạy các chương trình người dùng và một hệ thống tệp. Tuy nhiên những điều
này được thực hiện rất đơn giản, đủ thực tế để hiểu sâu sắc các khái niệm về hệ điều
hành cốt lõi.

1.3.2 Cấu trúc của Pintos

Pintos được tổ chức thành các thư mục sau:

- “threads/”: Mã nguồn của nhân (kernel).


- “userprog/”: Đây là thư mục chứa các chương chình của người dùng.
- “vm/”: Một thư mục gần như trống rỗng. Đây là nơi sẽ chứa các mã nguồn dành
cho việc quản lý bộ nhớ
- “filesys/”: Mã nguòn cho một hệ thống tệp cơ bản.
- “devices/”: Thư mục chứa các thư viện dành cho các tác vụ nhập – xuất dữ liệu:
bàn phím, đĩa cứng, bộ định thời,..
- “lib/”: Thư viện chính của Pintos, là tập con của thư viện C chuẩn. Các mã
nguồn trong thư mục này được biên dịch và sử dụng cho nhân của Pintos cũng
như chương trình người dùng.
- “lib/kernel”: Các thư viện được sử dụng cho nhân của Pintos, không được dùng
cho user program. Một số kiểu dữ liệu được cài đặt trong thư viện này có thể
được sử dụng khi làm việc với mã nguồn của nhân Pintos: bitmaps, doubly
linked list và hash tables.
- “lib/user/: Các thư viẹn được sử dụng cho chương trình người dùng, không
dùng cho nhân của Pintos.
- “test”/: thư mục chứa các bộ test dành cho từng bài tập/
- “examples/”: Thư mục này chứa một số chương trình mẫu dùng cho nội dung
thực hành 2- là gì ghi vào đây.
- “misc/”, “utils/”: Hai thư mục này chứa một số thư viện hỗ trợ cần thiết để
Pintos có thể thực thi được. Chú ý không thao tác với các tập tin bên trong hai
thư mục này.
- “Makefile.build”: Tập tin mô tả cách thức để build nhân của Pintos. Chỉ
được chỉnh sửa tập tin này nếu muốn thêm mã nguồn mới.
CHƯƠNG 2. SYSTEM CALL

2.1 System call là gì?


System call cho người dùng cách tiếp cận những tiện ích/ dịch vụ của hệ điều
hành. Mọi phương thức của người dùng qua giao diện (GUI), tập lệnh (Batch) hay câu
lệnh (command line, như cmd trong window) đều có cùng mục đích chung là gọi
system call, để yêu cầu hệ điều hành thực hiện tác vụ cho mình.

Thông thường, những system call được viết bằng ngôn ngữ lập trình C hoặc C+
+, hoặc assemble, đây là những ngôn ngữ lập trình cấp thấp (low- level), tức có khả
năng tiếp cận trực tiếp đến bộ nhớ hay phần cứng máy tính.

2.2 System call được hoạt động như thế nào?


Giả sử có một chương trình đơn giản có tác vụ đọc dữ liệu trong một file, và
sao chép nó qua một file khác.

Để chương trình hoạt động bình thường, chương trình cần phải đọc tên của 2
file (system call 1: đọc file). Nếu có lỗi xảy ra, chương trình phải xuất một dòng báo
lỗi ra màn hình cho người dùng (system call 2: xuất ra màn hình) và thoát chương trình
ngay (system call 3: thoát). Nếu không có lỗi, sẽ đến một vòng lặp liên tục mà chương
trình phải đọc từng dòng bên file này, và sao chép nó qua file kia (system call 4: sao
chép). Nếu file đầu ra (file được sao chép dữ liệu đến) trùng tên file với một file có sẵn
trong thư mục, phải tự tạo tên đuôi khác cho file (system call 5: tạo tên đuôi) hoặc
không cho phép sao chép. Nếu ổ cứng có vấn đề trong việc đọc và ghi, phải được xuất
tên lỗi cho người dùng (lại một system call nữa). Khi sao chép thành công, phải xuất ra
màn hình báo người dùng “đã thành công”.

Để hiểu rõ hơn về bức tranh tổng thể của system call, chúng ta sẽ đi vào chi tiết
cách system call open(). Trong Linux x86_32, open() có số system call là 5, vì vậy
trong system call vector (arch/x86/entry/syscall/syscall_32.tbl), open system call sẽ là
entry thứ 5, tương ứng với system call routine là sys_open.
Hình 2: Kết quả thu được

Từ đây, kernel sẽ gọi đến hàm sys_open() trong /fs/open.c để thực thi việc mở
một file trong hệ thông file system và trả về một mô tả file fd cho user. Cụ thể, chúng
ta xem hình vẽ chi tiết như hình dưới đây:

Hình 3:
2.3 Triển khai dự án System Call
Thực hiện triển khai code trong thư mục userprog/syscall.c. Gọi các lệnh
system call được liệt kê trong thư viện lib/user/syscall.h. System call numbers được
định nghĩa cho mỗi system call trong mục lib/syscall-nr.h:

Hình 4:
 System Call: void halt (void) : Chấm dứt Pintos bằng cách gọi
shutdown_power_off() (khai báo bằng luồng/init.h).
 System Call: void exit (int status): Chấm dứt chương trình người dùng
hiện tại, trả lại trạng thái hoạt động cho kernel.
 System Call: pid_t exec (const char *cmd_line): Chạy tệp thực thi có tên
được đặt trong cmd_line, chuyển bất kỳ đối số đã cho nào và trả về id
chương trình (pid) của quy trình mới. Phải trả về pid - 1, nếu không thì
pid này không phải là pid hợp lệ, nếu chương trình không thể tải hoặc
chạy vì bất kỳ lý do gì. Do đó, tiến trình mẹ không thể trả về từ trình
thực thi cho đến khi nó biết liệu quy trình con đã tải thành công tệp thực
thi của nó hay chưa.
 System Call: int wait (pid_t pid): Chờ pid xử lý tiến trình con và truy
xuất trạng thái thoát của nó. Nếu pid vẫn còn tồn tại, hãy đợi cho đến khi
tiến trình kết thúc.
 System Call: bool create (const char *file, unsigned initial_size): Tạo
một tệp mới có kích thước bằng số byte tệp ban đầu. Trả về true nếu
thành công, trả về false nếu không. Tạo tệp mới không mở được tệp: mở
tệp mới là một thao tác riêng biệt sẽ yêu cầu lệnh gọi hệ thống đang mở.
 System Call: bool remove (const char *file): Xóa tệp được gọi. Trả về
true nếu thành công, trả về false nếu không. Một tệp có thể bị xóa bất kể
đang mở hay đóng và việc xóa tệp đang mở sẽ không đóng tệp đó.
 System Call: int open (const char *file): Mở tệp được gọi. Trả về một xử
lý số nguyên không âm được gọi là "bộ mô tả tệp" (fd) hoặc -1 nếu
không thể mở tệp.
 System Call: int filesize (int fd): Trả về kích thước, tính bằng byte, của
tệp được mở dưới dạng fd.
 System Call: int read (int fd, void *buffer, unsigned size): Đọc các byte
kích thước từ tệp được mở dưới dạng fd vào bộ đệm. Trả về số byte thực
sự được đọc (0 ở cuối tệp) hoặc -1 nếu tệp không thể đọc được.
 System Call: int write (int fd, const void *buffer, unsigned size): Ghi
kích thước byte từ bộ đệm vào tệp đang mở fd. Trả về số byte thực sự
được ghi, có thể nhỏ hơn kích thước nếu không thể ghi lượng byte.
 System Call: void seek (int fd, unsigned position): Thay đổi byte tiếp
theo được đọc hoặc ghi trong tệp mở fd thành vị trí, được biểu thị bằng
byte từ đầu tệp.
 System Call: unsigned tell (int fd): Trả về vị trí của byte tiếp theo
được đọc hoặc ghi trong tệp mở fd, được biểu thị bằng byte từ đầu tệp.
 System Call: void close (int fd): Đóng bộ mô tả tệp fd. Việc thoát hoặc
kết thúc một tiến trình sẽ đóng tất cả các bộ mô tả tệp đang mở của nó,
như thể bằng cách gọi hàm này cho từng bộ.
CHƯƠNG 3. VIRTUAL MEMORY

3.1 Virtual Memory là gì?


Virtual memory là kỹ thuật quản lý bộ nhớ được hệ điều hành sử dụng để quản
lý quyền truy cập vào bộ nhớ của máy tính. Hệ điều hành ánh xạ các địa chỉ bộ nhớ vật
lý của máy tính với một loạt các địa chì bộ nhớ phần mềm duy nhất, được gọi là địa
chì ảo. Lược đồ ánh xạ khác nhau giữa các hệ điều hành, nhưng trong Pintos, ánh xạ
này luôn là 1−1 đối với bộ nhớ hạt nhân, tức là mỗi địa chỉ hạt nhân ảo ánh xạ chính
xác đến một địa chi vật lý. Trong Pintos, bộ nhớ ảo được tách thành hai nhóm: bộ nhớ
người dùng và bộ nhớ hạt nhân. Nhóm bộ nhớ người dùng mở rộng từ 0 x 0 đến
PHYS_BASE, và nhóm bộ nhớ nhân mở rộng từ PHYS_BASE đến cuối bộ nhớ.

Địa chỉ vật lý của nhân luôn là địa chỉ ảo của nhân - PHYS_BASE. Tuy nhiên,
ánh xạ này không nhất thiết phải đúng với bộ nhớ người dùng

Hình 5:
3.2 Phân vùng bộ nhớ ảo trong Pintos

3.2.1 Cấu trúc bộ nhớ ảo


 Về mặt khái niệm, mỗi tiến trình có thể tự do bố trí bộ nhớ ảo cho người dùng
theo cách mà nó chọn. Trong thực tế, bộ nhớ ảo của người dùng có cấu trúc như
sau:
 Đoạn mã trong Pintos bắt đầu từ địa chỉ ảo của người dùng 0x08048000,
khoảng 128 MB từ cuối vùng địa chỉ.

3.2.2 Trang (Pages)

Một trang, đôi khi được gọi là một trang ảo, là một vùng liên tục của bộ nhớ ảo
4.096 byte (kích thước trang) theo chiều dài. Một trang phải được liên kết trang, nghĩa
là bắt đầu trên một địa chỉ ảo chia đều cho kích thước trang. Do đó, địa chỉ ảo 32 bit có
thể được chia thành số trang 20 bit và bù trang 12 bit (hoặc chỉ bù)

Mỗi quy trình có một bộ trang độc lập của các trang người dùng (ảo), là các
trang dưới địa chỉ ảo Phys_base, thường là 0xC0000000 (3 GB).

Mỗi tiến trình có một nhóm trang người dùng (ảo).

Kernel có thể truy cập cả trang người dùng và trang của chính nó, nhưng tiến
trình người dùng chỉ có thể truy cập các trang người dùng của chính nó mà thôi.

3.2.3 Khung (Frames)

Một khung, đô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ý. Giống như các Pages địa chỉ vật lý, khung phải có kích thước
trang và liên kết trang. Do đó, địa chỉ vật lý 32 bit có thể được chia thành số khung 20
bit và độ lệch khung 12 bit

80x86 không cung cấp bất kỳ cách nào để truy cập trực tiếp bộ nhớ tại một địa
chỉ vật lý.

Pintos hoạt động xung quanh điều này bằng cách ánh xạ bộ nhớ ảo nhân trực
tiếp vào bộ nhớ vật lý: trang đầu tiên của bộ nhớ ảo kernel được ánh xạ tới khung đầu
tiên của bộ nhớ vật lý, trang thứ hai đến khung thứ hai,... Do đó, các khung có thể
được truy cập thông qua bộ nhớ ảo kernel.

3.2.4 Bảng trang (page tables)

Trong Pintos, bảng trang là cấu trúc dữ liệu mà CPU sử dụng để dịch một địa
chỉ ảo sang địa chỉ vật lý, nghĩa là từ trang này sang trang khác. Định dạng bảng trang
được chỉ định bởi kiến trúc 80x86. Pintos cung cấp mã quản lý bảng trang trong
pagedir.c
Sơ đồ dưới đây minh họa mối quan hệ giữa các trang và khung. Địa chỉ ảo, ở
bên trái, bao gồm một số trang và bù. Bảng trang dịch số trang thành số khung, được
kết hợp với phần bù không được sửa đổi để có được địa chỉ vật lý, ở bên phải.

3.2.5 Trao đổi khe (Swap slots)

Một khe hoán đổi là một vùng liên tục, kích thước trang của không gian đĩa
trong phân vùng hoán đổi. Mặc dù các giới hạn phần cứng chỉ ra vị trí của các khe
được lỏng lẻo hơn so với các trang và khung, các khe hoán đổi nên được liên kết với
trang vì không có nhược điểm nào khi làm như vậy.

3.3 Triển khai chương trình

3.3.1 Xử lý lỗi trang


sửa hàm page_fault() (Xử lý các tham chiếu không hợp lệ từ việc triên khai
cuộc gọi hệ thông)

3.3.2 Viết chương trình cho frame.c


 init_frame_table: Khởi tạo frame table
 frame_hash: Tính toán và trả về giá trị băm cho frame
 frame_less: Trả về true nếu frame thứ nhất truyền vào đứng trước frame thứ 2
 frame_alloc: phân bốkhung cho trang
 frame free: Tìm một khung để loại bỏ khỏi bảng khung. Sử dụng thuật toán
đổng hồ quay
 frame_acquire: khóa frame
 frame_release: giải phóng frame
3.3.3 Viết chương trình cho page.c
 page_init: Khởi tạo trang
 page_hash: trả về giá trị băm của page
 page_less: Trả về true nếu page thứ nhất truyền vào đứng trước page thứ
 page_load: Cho một địa chỉ tải trang vào bộ nhớ nếu thành công trả về true, nêu
không thỉ ngược lại
 page get: Truyền vào một đia chỉ, lấy ra trang được liên kết với nó, nếu không
thảnh công thì trã vê NULL.
 page_alloc: phân bố một mục nhập trong bảng trang
 page_read: đọc dữ liệu được lưu trữ trong trang
 page_evict: Xóa một trang và lưu nó để hoán đổi
 page_write: Ghi dữ liệu để hoán đổi.

3.3.4 Viết chương trình cho swap.c

 swap_init: Khởi tạo swap


 swap_read: đọc dữ liệu ra từ swap
 swap_write: ghi dữ liệu vào swap
CHƯƠNG 4. 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.
HYPER LINK

Link github:

You might also like