Trường Đại Học Bách Khoa Hà Nội Viện Điện Tử Viễn Thông ====o0o==== BÁO CÁO BÀI TẬP DÀI MÔN HỆ ĐIỀU HÀNH Bài tập số 2: Chương trình sửa mã nguồn hệ điều hành Linux báo cáo dung lượng Ram và thu hồi bộ nhớ theo cơ chế slab cache Giáo viên hướng dẫn : PHẠM VĂN TIẾN Sinh viên thực hiện : Lương Kim Doanh Ngô Quang Thìn Trần Hoàng Điệp Nguyễn Trung Thành Lớp : KSTNĐTVTK52 HÀ NỘI 102011 Mục Lục: I.Giới thiệu 3 1.Giới thiệu chung 3 2. Giới thiệu slab cache 4 3. Object: 17 3.1. Khởi tạo object trong slab: 17 3.2. Cấp phát object: 17 3.3. Giải phóng object: 17 4. PerCPU object cache: 18 4.1. Cho phép CPU cache: 18 4.2. Cập nhật thông tin mỗi CPU: 18 4.3. Drainning a PerCPU cache: 19 4.4. Khởi tạo Slab allocator: 19 5. Giao tiếp với Buddy allocator: 19 III. Triển khai. 20 1. Giới thiệu thư mụcprocsys. 20 2. Linux Modules 22 2.1 Xây dựng Module 22 2.2 Exported Symbols 24 IV. Các module mã nguồn chỉnh sửa và thêm 29 1. Mục đích 29 2. Chi tiết 29 2.1. File kernel_sysctl.c 29 2.2. Sửa file sysctl.c 31 2.3. File KSTNDTVTK52.c 32 2.4. Sửa file Makefile 32 V. Kiểm thử và kết quả 32 1. Hiển thị 32 2.Test module 35 I.Giới thiệu 1.Giới thiệu chung Mục đích của việc quản lí bộ nhớ là cung cấp một phương thức trong đó bộ nhớ có thể được chia sẻ động giữa những người sử dụng, những tiến trình khác nhau với những mục đích khác nhau. Phương thức quản lí bộ nhớ sẽ thực hiện hai nhiệm vụ: Tối thiểu lượng thời gian yêu cầu quản lí bộ nhớ
[...]... Khi slab allocator tạo một cache mới, nó cấp phát cache từ cache_ cache hoặc từ kmem _cache cache, cache_ cache phải được tạo như sau: Static kmem _cache_ t cache_ cache = { 1 slab_ full: LIST_HEAD_INIT (cache_ cache.slabs_full), 19 2 slab_ partial: LIST_HEAD_INIT (cache_ cache.slabs_partial), 3 slab_ frê: LIST_HEAD_INIT (cache_ cache.slabs_free), 4 objsize: sizeof (kmem _cache_ t), 5 flag: SLAB_ NO_REAP, 6 spinlock:... được gọi là ’’ cache growing’’ và xảy ra khi không còn object nào trong slabs_partial và không còn slab nào trong slabs_free 14 Những tác vụ được thực hiện để tạo slab như sau : Thực thi những kiểm tra cơ sở để đảm bảo không có sử dụng sai Tính toán color offset cho object trong slab Cấp phát bộ nhớ cho slab và slab descriptor Liên kết những page được sử dụng cho slab đến slab và cache descriptor... pm_qos_params.o sched_clock.o cred.o \ async.o range.o jump_label.o KSTN-DTVT-K52.o obj-y += groups.o V Kiểm thử và kết quả 1 Hiển thị - Hiển thị trợ giúp -Hiển thị thông tin toàn bộ cache có trên hệ thống 33 -Hiển thị các slab cache rỗng -Hiển thị slab cache được sắp xếp theo thứ tự alphabe 34 -Hiển thị thông tin về các slab được merge -Hiển thị dung lượng RAM bị chiếm dụng bởi cơ chế slab cache 35... kennel không chủ động destroy cache của nó bởi vì sự tồn tại của chúng là cần thiết cho hệ thống Những bước được thực hiện để xóa bỏ cache: Delete cache từ cache chain Shrink cache để delete tất cả các slab giải phogns bất kì cache của mỗi CPU (kfree()) Delete cache descriptor từ cache_ cache 1.8: Kích cỡ cache: Linux duy trì hai tập hợp cache dùng cho việc cấp phát lượng bộ nhớ nhỏ mà bình thường cấp... được dữ liệu cục bộ khi object đã được gán cho CPU này 18 4.1 Cho phép CPU cache: Khi một cache được tạo ra, CPU cache của nó phải được kích hoạt và bộ nhớ được cấp phát cho nó sử dụng kmalloc() Hàm enable_cpucache() có trách nhiệm cho việc quyết định kích cỡ cache và gọi hàm do_tune_cpucache() để cấp phát bộ nhớ cho nó Tất nhiên, một CPU cache không thể tồn tại cho đến khi một size cache được chỉ định,... cấu trúc slab, và dãy kmem_bufctl_t Cách khác là lưu trữ cấu trúc slab và dãy kmem_bufclt_t trong slab Dãy kmem_bufctl_t giữ chỉ số của những object chưa được cấp phát, sẵn sàng được sử dụng khi cần thiết 2.2 Tạo Slab : Khi cache được tạo ra, nó là 1 cache rỗng với những danh sách slabs_free, slabs_partial, slabs_full rỗng Slab mới được tạo ra và được cấp phát cho cache bằng cách gọi hàm cache_ grow()... được sử dụng cho DMA, và tập hợp còn lại phù hợp với sử dụng thông thường Tên mà người sử dụng có thể đọc được là cache cỡ -N và cache cỡ -N(DMA) Thông tin về kích cỡ cache được lưu trong cấu trúc cache_ sizes struc cache_ sizes { size_t cs_size; struct kmem _cache * cs_cachep; #ifdef COFIG_ZONE_DMA Struct kmem _cache * cs_cachep; ##emdif }; Cs_size: kích cỡ của khối bộ nhớ Cs_cachep: cache của các khối dùng... mỗi CPU trên hệ thống Sau khi thông tin đã đươc swap, dữ liệu cũ bị xóa đi 4.3 Drainning a Per-CPU cache: Khi một cache bị shink, bước đầu tiên là drain cpucache cho bất cứ object nào cache có bằng cách gọi hàm drain_cpu_caches() Điều này rất quan trọng bởi vì nếu chỉ có 1 object trong slab được đặt vào per-cpu cache, toàn bộ slab không thể được giải phóng 4.4 Khởi tạo Slab allocator: Khi slab allocator... được khai báo static inline kmem_bufctl_t *slab_ bufctl(struct slab *slabp) { return (kmem_bufctl_t*)(slabp+1); } Khi cấp phát một object, kmem _cache_ alloc() thực hiện công việc câp nhật dãy kmem_bufctl () Trường slab free giữ chỉ số của free object đầu tiên, chỉ số free object tiếp theo là kmem_bufctl_t [slab free] diễn giải như sau: objp= slabp->_mem+ slabp->free*cachep-> objsize; slabp->free= slab_ bufctl... hai,_kmem _cache_ shrink() giải phóng tất cả các slab từ slabs_free và sau đó kiểm tra lại xem slabs_partial và slabs_full có rỗng khống Hàm này chỉ được sử dụng bên trong module và rất quan trọng khi hủy cache, nó không quan tâm số page được giải phóng chỉ miễn là cache rỗng 1.7 Cache Destroying: Khi 1 mode unload, nó có trách nhiệm phải xóa bỏ bất kì cache nào với hàm kmem _cache_ destroy() Mã nhân kennel . Thông ====o0o==== BÁO CÁO BÀI TẬP DÀI MÔN HỆ ĐIỀU HÀNH Bài tập số 2: Chương trình sửa mã nguồn hệ điều hành Linux báo cáo dung lượng Ram và thu hồi bộ nhớ theo cơ chế slab cache Giáo viên hướng. kmem _cache cache, cache_ cache phải được tạo như sau: Static kmem _cache_ t cache_ cache = { 1 slab_ full: LIST_HEAD_INIT (cache_ cache.slabs_full), 19 2 slab_ partial: LIST_HEAD_INIT (cache_ cache.slabs_partial), . slab được đặt vào per-cpu cache, toàn bộ slab không thể được giải phóng. 4.4. Khởi tạo Slab allocator: Khi slab allocator tạo một cache mới, nó cấp phát cache từ cache_ cache hoặc từ kmem_cache