Professional Documents
Culture Documents
Báo cáo BTL Hệ điều hành
Báo cáo BTL Hệ điều hành
HỆ ĐIỀU HÀNH
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.
1
MỤC LỤC
0
CHƯƠNG 2. CÁC QUY ĐỊNH KHÁC................................................................................13
KẾT LUẬN..............................................................................................................................18
PHỤ LỤC.................................................................................................................................20
- 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,..
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
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
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.
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.
Để 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
Đị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
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).
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.
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.
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.
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.
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: