Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 69 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
69
Dung lượng
4,48 MB
Nội dung
HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO BÀI TẬP LỚN LẬP TRÌNH NHÂN LINUX Giảng viên hướng dẫn: TS Phạm Văn Hưởng Sinh viên thực hiện: Trương Quốc Quân – CT030440 Nguyễn Việt Tùng – CT030454 Phạm Thị Dung – CT030409 Hà Nội, 2022 MỤC LỤC CHƯƠNG Lập trình shell .9 1.1 File management 1.1.1 Phân tích thiết kế .9 1.1.2 Thực thi 11 1.2 Auto install and uninstall 13 1.2.1 Phân tích thiết kế .13 1.2.2 Thực thi 14 1.3 Task management 15 1.3.1 Phân tích thiết kế .15 1.3.2 Thực thi 16 1.4 Time management 19 1.4.1 Phân tích thiết kế .19 1.4.2 Thực thi 20 CHƯƠNG Lập trình C 23 2.1 File management 23 2.1.1 Phân tích thiết kế .23 2.1.2 Thực thi 24 2.2 Network management 28 2.2.1 Phân tích thiết kế .28 2.2.2 Thực thi 29 2.3 Process management 30 2.3.1 Phân tích thiết kế .30 2.3.2 Thực thi 31 2.4 Socket management 35 2.4.1 Phân tích thiết kế .35 2.4.2 Thực thi 37 CHƯƠNG LẬP TRÌNH VÀ TÍCH HỢP KERNEL 43 3.1 Tổng quan 43 3.2 Macro .45 3.3 Phần tập 45 CHƯƠNG Memory mapping 59 4.1 Tổng quan 59 4.2 Các struct sử dụng cho trình ánh xạ nhớ 60 4.2.1 Struct page .60 4.2.2 Struct vm_area_struct 61 4.2.3 Struct mm_struct .62 4.3 Ánh xạ nhớ driver thiết bị 62 4.4 Phần thực hành .64 4.4.1 Ánh xạ nhớ vật lý liên tục tới không gian người dùng 65 4.4.2 Ánh xạ nhớ vật lý không liệ tục tới không gian người dùng .66 4.4.3 Các thao tác đọc ghi vùng nhớ ánh xạ .67 4.4.4 Hiển thị vùng nhớ ánh xạ sử dụng procfs 67 4.5 Hướng dẫn thiết lập hệ thống 69 4.5.1 Thiết lập hệ thống máy ảo lấy khung từ github 69 4.5.2 Đảm bảo dependencies cho máy .71 4.5.3 Sản sinh khung xương mã – khởi động máy ảo qemu .72 DANH MỤC HÌNH VẼ Hình 1.1: sơ đồ usecase mô tả chức file management Hình 1.2: Biểu đồ usecase chức auto install uninstall 13 Hình 1.3: Sơ đồ usecase biểu thị task management 15 Hình 1.4: Biểu đồ usecase chức task management 19 Hình 2.1: Usecase file management lập trình C .23 Hình 2.2: Usecase network management lập trình C .28 Hình 2.3: Usecase process management lập trình C 31 Hình 2.4: Usecase socket management lập trình C .35 Hình 3.1: Mô tả nhân linux .43 Hình 3.2: Lệnh lsmod 44 Hình 3.3:Lệnh insmod 44 Hình 3.4: Lệnh modinfo 44 Hình 3.5: Lệnh rmmod 45 Hình 3.6: Makefile để build module nhân 54 Hình 3.7: Biên dịch module nhân 54 Hình 3.8:Choice = (factory) 55 Hình 3.9: Choice = (matadd) 55 Hình 3.10: Choice = (matnul) 56 Hình 3.11: Choice = (PrimeBetween) 56 Hình 3.12: Choice = (SmallerNumInMatrix) 57 Hình 3.13: Choice = (NumdivisibleByMatrix) .57 Hình 3.14: Choice = (PrimeOfMatrix) 58 Hình 4.1: Cấu trúc địa 59 Hình 4.2: Virtual memory 60 Hình 4.3: Nội dung file maps 61 Hình 4.4: Ảnh minh hoạ lỗi khơng tương thích thư viện 32bit 70 Hình 4.5: Kết thực thi xác 74 DANH MỤC BẢNG Bảng 1.1: Mô tả chức list file .9 Bảng 1.2: Mô tả chức create file .10 Bảng 1.3: Mô tả chức remove file 10 Bảng 1.4: Mô tả chức show file 10 Bảng 1.5: Mô tả chức edit file 10 Bảng 1.6: Mô tả chức đổi tên files 10 Bảng 1.7: Mô tả chức Copy file 11 Bảng 1.8: Mô tả chức auto install .13 Bảng 1.9: Mô tả chức auto uninstall 14 Bảng 1.10: Mô tả chức list task management .16 Bảng 1.11: Mô tả chức create task management 16 Bảng 1.12: Mô tả chức remove task management 16 Bảng 1.13: Mô tả chức edit task management 16 Bảng 1.14: Mô tả chức info 19 Bảng 1.15: Mô tả chức thay đổi hệ thống 19 Bảng 1.16: Mô tả chức thay đổi ngày tháng hệ thống .20 Bảng 1.17: Mô tả chức tự động cập nhật thời gian hệ thống 20 Bảng 2.1: Mô tả chức list file lập trình C 23 Bảng 2.2: Mô tả chức create file lập trình C 24 Bảng 2.3: Mô tả chức nưng remove file lập trình C 24 Bảng 2.4: Mơ tả chức show file lập trình C .24 Bảng 2.5: Mô tả list deveice lập trình C 29 Bảng 2.6: Mô tả chức list process lập trình C .31 Bảng 2.7: Mô tả chức kill process lập trình C 31 Bảng 2.8: Mơ tả list tcp lập trình C .35 Bảng 2.9: Mơ tả list udp lập trình C 35 Bảng 2.10: Mô tả list raw lập trình C 36 Bảng 2.11: Mô tả list unix lập trình C 36 Bảng 2.12: Mô tả list tcp6 lập trình C 36 Bảng 2.13: Mô tả list udp6 lập trình C 36 Bảng 2.14: Mô tả list raw6 lập trình C 37 DANH MỤC CODE Code 1.1: Code thực thi file management 13 Code 1.2: Code thực thi auto install and uninstall .15 Code 1.3: Code thực thi task management 18 Code 1.4: Code thực thi time management .22 Code 2.1: Code thực thi file management C 28 Code 2.2: Code thực thi network management lập trình C 30 Code 2.3: Code thực thi process management lập trình C 34 Code 2.4: Code thực thi socket management lập trình C 42 CHƯƠNG Lập trình shell 1.1 File management 1.1.1 Phân tích thiết kế Đối với chức file management, chúng em tìm hiểu phân tích bảy chức liên quan đến quản lý file bao gồm: Hình 1.1: sơ đồ usecase mơ tả chức file management Chức List file Mô tả Chức tiến hành thực hiển thị tất file thư mục có folder Cách thực Thực cách sử dụng chương trình ls linux Bảng 1.1: Mơ tả chức list file Chức Create file Mô tả Chức tiến hành tạo file thư mục sử dụng tên truyền vào làm tên file Cách thực Thực cách sử dụng chương trình touch linux Bảng 1.2: Mô tả chức create file Chức Remove file Mô tả Chức tiến hành xoá file thư mục tại, tên file xoá truyền vào arument Cách thực Thực cách sử dụng chương trình rm linux Bảng 1.3: Mơ tả chức remove file Chức Show file Mô tả Chức tiến hành hiển thị nội dung file lên console Cách thực Thực cách sử dụng chương trình cat linux Bảng 1.4: Mô tả chức show file Chức Edit file Mơ tả Chức tiến hành mở trình soạn thảo file, cho phép thực chỉnh sửa nội dung file Cách thực Thực cách sử dụng chương trình vim linux Bảng 1.5: Mô tả chức edit file Chức Rename file Mô tả Chức tiến hành đổi tên file Cách thực Thực cách sử dụng chương trình mv linux Bảng 1.6: Mơ tả chức đổi tên files Chức Copy file Mô tả Chức tiến hành copy file định tên file thư mục copy sang thư mục khác Cách thực Thực cách sử dụng chương trình mv linux Bảng 1.7: Mơ tả chức Copy file 1.1.2 Thực thi #!/bin/sh command=$1 if [ $command = "" ] page_to_pfn() trả trang tương ứng với struct page page_address() trả địa ảo struct page, hàm có tác dụng với trang ánh xạ từ lowmem kmap() tạo ánh xạ kernel cho trang vật lý cách trừu tượng, ngẫu nhiên (trang từ vùng highmem) trả địa ảo tham chiếu trực tiếp vào trang 4.2.2 Struct vm_area_struct struct vm_area_struct chứa thông tin vùng nhớ ảo liên tục Ta quan sát vùng nhớ tiến trình thơng qua việc quan sát thơng số maps tiến trình với procfs Hình 4.25: Nội dung file maps Một vùng nhớ (memory area) có thông số đặc trưng địa bắt đầu (start address), địa kết thúc (stop address), độ rộng (length) quyền truy cập (permission) Một struct vm_area_struct tạo qua lần không gian người dùng gọi lệnh mmap() Một driver hỗ trợ lệnh mmap() phải chứa toàn phải khởi tạo struct vm_area_struct tương ứng Trong struct trên, trường thông tin quan trọng bao gồm: vm_start, vm_end - điểm khởi nguyên kết thúc vùng nhớ (các trường xuất /proc//maps) vm_file - trỏ tới cấu trúc file tương ứng (nếu có) vm_pgoff - offset vùng nhớ file vm_flags - hệ thống cờ vm_ops – tập hợp hàm thực vùng nhớ vm_next, vm_prev – truy cập đến vùng nhớ liên tục trước liên tục sau danh sách vùng nhớ process 4.2.3 Struct mm_struct struct mm_struct hàm chứa tất vùng nhớ process Trường mm struct task_struct mọt trỏ tới struct mm_struct tiến trình 4.3 Ánh xạ nhớ driver thiết bị Ánh xạ nhớ tính đặc trưng hệ thống Unix Từ điểm nhìn driver, việc ánh xạ nhớ cho phép truy cập trực tiếp nhớ tới không gian người dùng thiết bị Để gán hàm mmap() cho driver, trước hết trường mmap struct file_operations driver thiết bị cần implement Nếu implement, tiến trình khơng gian người dùng sử dụng lời gọi hệ thống mmap() với file descriptor tương ứng với thiết bị Lời gọi hệ thông mmap nhận tham số sau: void *mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset); Để ánh xạ địa thiết bị không gian người dùng, tiến trình người dùng phải mở thiết bị đưa lời gọi hệ thống mmap() với file descriptor tương ứng Hàm mmap() driver thiết bị nhận tham số sau: int (*mmap)(struct file *filp, struct vm_area_struct *vma); Trường filp trỏ đến struct file tạo thiết bị không gian người dùng kích hoạt Trường vma sử dụng để xác định vùng địa ảo thiết bị ánh xạ tới vùng nhớ Một driver cần cấp phát nhớ (bằng kmalloc(), vmalloc(), alloc_pages()) ánh xạ tới vùng địa khơng gian người dùng Quy trình tham số vma quy định cách sử dụng hàm hỗ trợ remap_pfn_range() Trong đó, hàm remap_pfn_range() nhận vào tham số sau: vma - vùng không gian nhớ ảo ánh xạ tới vùng nhớ vật lý addr - không gian địa ảo từ nơi bắt đầu ánh xạ, bảng trang cho không gian địa ảo với kích cỡ cần thiết tạo nhu cầu phát sinh pfn - số khung trang địa ảo ánh xạ tới size - kích cỡ vùng nhớ ánh xạ tới (đơn vị byte) prot - cờ bảo vệ cho ánh xạ Đây ví dụ sử dụng hàm trên, ánh xạ liên tục nhớ vật lý, số khung trang pfn (bộ nhớ mà trước cấp phát) tới địa ảo vma -> vm_start: struct vm_area_struct *vma; unsigned long len = vma->vm_end - vma->vm_start; int ret ; ret = remap_pfn_range(vma, vma->vm_start, pfn, len, vma->vm_page_prot); if (ret < 0) { pr_err("could not map the address area\n"); return -EIO; } hệ thống static char *kmalloc_area; unsigned long pfn = virt_to_phys((void *)kmalloc_area)>>PAGE_SHIFT; static char *vmalloc_area; unsigned long pfn = vmalloc_to_pfn(vmalloc_area); struct page *page; unsigned long pfn = page_to_pfn(page); vật lý (tức ô nhớ không nằm liên tục nhớ vật lý) Nên ta muốn ánh xạ vùng nhớ cấp phát vmalloc, ta cần phải ánh xạ trang tính địa vật lý tương ứng với trang Vì trang ánh xạ tới khơng gian người dùng, nên bị tráo đổi Để tránh điều xảy ra, ta cần đặt bit PG_reserved trang Việc bật bit thơng qua hàm SetPageReserved(), cịn việc reset (thao tác phải làm trước giải phóng nhớ) thực thông qua hàm ClearPageReserved() void alloc_mmap_pages(int npages) { int i; char *mem = kmalloc(PAGE_SIZE * npages); if (!mem) return mem; for(i = 0; i < npages * PAGE_SIZE; i += PAGE_SIZE) SetPageReserved(virt_to_page(((unsigned long)mem) + i)); return mem; } void free_mmap_pages(void *mem, int npages) { int i; for(i = 0; i < npages * PAGE_SIZE; i += PAGE_SIZE) ClearPageReserved(virt_to_page(((unsigned long)mem) + i)); kfree(mem); } 4.4 Phần thực hành Để giải tập đây, bạn cần thực bước sau: Chuẩn bị khung chương trình (skeletons) từ mẫu Xây module Sao chép module vào máy ảo (VM) Khởi động VM thử module VM Bài lab mang tên memory_mapping Hãy quan sát phần tập để xem tên Khung mã nguồn tạo từ ví dụ nằm tools/labs/templates Để giải tập, việc tạo đoạn khung mã cho lab này: tools/labs $ make clean tools/labs $ LABS= make skels Bạn sinh khung mã cho tập một, sử dụng đoạn câu lệnh sau: tools/labs $ LABS=/ make skels Một đoạn khung mã driver tạo ra, bạn cần build đoạn mã đó: tools/labs $ make build Sau đó, bạn cần copy module khởi động máy ảo: tools/labs $ make copy tools/labs $ make boot Các module đặt /home/root/skels/memory_mapping/ Hoặc bạn chép file thông qua scp, để tránh khởi động lại VM Xin truy cập https://linux-kernellabs.github.io/refs/heads/master/info/vm.html#vm-interaction-link để tham khảo thêm cách kết nối VM với mạng Chú ý: Trước bắt đầu làm tập tạo khung mã, xin chạy git pull bên repo Linux, để đảm bảo bạn có phiên tập Nếu bạn có sửa đổi code nội (local changes) máy, lệnh pull thất bại Bạn cần kiểm tra sửa đổi nội sử dụng lệnh git changes Nếu bạn muốn giữ sửa đổi này, bạn cần chạy git stash trước pull git stash pop sau pull Để loại bỏ sửa đổi máy, bạn cần chạy git reset –hard master Nếu bạn tạo khung mã trước chạy git pull, bạn cần phải tạo lại khung mã 4.4.1 Ánh xạ nhớ vật lý liên tục tới không gian người dùng Trong khuôn khổ tập này, bạn cần viết driver ánh xạ nhớ vật lý liên tục (vd Bộ nhớ cấp phát thông qua lệnh kmalloc()) tới không gian người dùng Hãy xem lại đoạn Ánh xạ nhớ driver thiết bị, tạo khung mã cho tập này, đặt tên kmmap điền vào đoạn ô trống đánh dấu TODO1 Để bắt đầu, học viên cần cấp phát vùng nhớ với kích cỡ N-trang + 2, sử dụng kmalloc() module init (khởi tạo) tìm địa vùng nhớ mà khớp với địa trang Gợi ý: Kích cỡ trang chứa biến PAGE_SIZE Lưu trữ vùng cấp phát sử dụng trỏ kmalloc_ptr địa vùng nhớ biến kmalloc_area Sử dụng PAGE_ALIGN() để xác định kmalloc_area Bật bit PG_reserved trang với SetPageReserved() Xóa bit với ClearPageReserved() trước giải phóng nhớ Gợi ý: Sử dụng virt_to_page() để ánh xạ ngược trang ảo trang vật lý Hàm cần thiết cho hàm SetPageReserved() ClearPageReserved() Sau đó, học viên cần viết hàm mmap() cho driver Gợi ý: Để ánh xạ, sử dụng hàm remap_pfn_range() Tham số thứ hàm số khung trang (PFN) Để chuyển từ địa kernel ảo sang địa vật lý, sử dụng hàm virt_to_phys() Để chuyển từ địa vật lý sang số PFN, dịch địa với bit PAGE_SHIFT phía bên phải Để kiểm thử, load module kernel chạy: root@qemux86:~# skels/memory_mapping/test/mmap-test Nếu thứ lập trình xác, terminal kết thành công 4.4.2 Ánh xạ nhớ vật lý không liên tục tới không gian người dùng Hãy viết driver ánh xạ nhớ vật lý không liên tục (vd Thông qua lời gọi hàm vmalloc()) tới không gian người dùng Hãy xem lại đoạn Ánh xạ nhớ driver thiết bị, tạo khung mã cho tập này, đặt tên kmmap điền vào đoạn ô trống đánh dấu TODO1 Để làm tập, trước hết học viên cần cấp phát vùng nhớ với kích cỡ N-trang với vmalloc() Gợi ý: Kích cỡ trang quy định biến PAGE_SIZE Hãy lưu vùng nhớ cấp phát vào vmalloc_area Vùng nhớ cấp phát vmalloc() khớp trang (tức địa ô nhớ khớp với địa trang) Bật bit PG_reserved với trang với hàm SetPageReserved() Tắt bit với hàm ClearPageReserved() trước giải phóng nhớ Gợi ý: Sử dụng hàm vmalloc_to_page() để ánh xạ trang ảo thành trang vật lý, để từ làm đối số cho hàm SetPageReserved() ClearPageReserved() Để kiểm thử làm, điền byte trang với giá trị sau: 0xaa, 0xbb, 0xcc, 0xdd Sau đó, viết hàm mmap() cho driver Gợi ý: Để chuyển từ địa ảo vmalloc (virtual vmalloc address), sử dụng hàm vmalloc_to_pfn() Hàm trả số khung trang PFN tương ứng với địa ảo CHÚ Ý Các trang vmalloc không liên tục với nhớ vật lý, nên cần phải sử dụng hàm remap_pfn_range() cho trang Học viên cần tạo vòng lặp qua tất trang ảo, xây dựng thuật toán tương đương với ngôn ngữ tựa C sau: For each: *xác định địa vật lý* Ánh xạ cách sử dụng remap_pfn_range() Học viên cần xác định địa vật lý với trang một, lần ánh xạ cần sử dụng khoảng trang Để kiểm thử, cần load module kernel chạy: root@qemux86:~# skels/memory_mapping/test/mmap-test Nếu làm đúng, terminal in kết thành công 4.4.3 Các thao tác đọc ghi vùng nhớ ánh xạ Hãy chỉnh lại module trước để thêm tính đọc ghi lên thiết bị Bài tập mang tính chất minh họa để giúp học viên hiểu rõ với vùng nhớ nào, ta sử dụng lời gọi hàm mmap(), lệnh read() write() Học viên cần lập trình vùng code đánh dấu sẵn với dòng chữ TODO2 Ghi chú: Ta không cần quan tâm đến tham số offset gửi đến trình đọc/ghi, thao tác Để kiểm thử, load module kernel chạy: root@qemux86:~# skels/memory_mapping/test/mmap-test 4.4.4 Hiển thị vùng nhớ ánh xạ sử dụng procfs Sử dụng module trước, học viên cần lập trình để in file procfs chứa tất vùng nhớ ánh xạ thông qua lời gọi hàm Học viên cần lập trình vùng code đánh dấu sẵn với dòng chữ TODO3 Tạo entry procfs (PROC_ENTRY_NAME, định nghĩa thư viện mmap-test.h) hiển thị toàn vùng nhớ ánh xạ tiến trình gọi hàm read() file Gợi ý: Sử dụng hàm proc_create() Truyền giá trị cho tham số chế độ (mode), truyền giá trị NULL cho tham số cha (parent) Sử dụng hàm my_proc_file_ops() cho thao tác Trong hàm kết thúc module (module exit function), xóa entry PROC_ENTRY_NAME cách sử dụng hàm remove_proc_entry().\ Ghi chú: Có thể tham khảo mơ tả ví dụ sử dụng interface struct seq_file (ví dụ phức tạp) qua link http://tldp.org/LDP/lkmpg/2.6/html/x861.html Với tập này, ta cần sử dụng interface cách đơn giản Có thể tham khảo ví dụ nyaf qua đường link http://lwn.net/Articles/22355/ Có thể sử dụng API đơn giản có đường link Trong hàm my_seq_show() bạn cần: Sử dụng hàm get_task_mm() để lấy trường struct mm_struct tiến trình tạị Gợi ý: tiến trình truy cập cách sử dụng biến thuộc kiểu struct task_struct* Lần lượt xử lý toàn danh sách struct vm_area_struct tương ứng với tiến trình Gợi ý: Sử dụng biến vma_iteratir bắt đầy từ mm->mmap Sử dụng trường vm_next struct vm_area_struct để định vị danh sách vùng nhớ Dừng lại trỏ đến NULL Sử dụng vm_start vm_end cho vùng nhớ để tính tốn kích cỡ Sử dụng hàm pr_info(“%lx %lxn, …)() để in vm_start vm_end cho vùng nhớ Để giải phóng struct mm_struct, cần giảm đếm tham chiếu (reference counter) biến struct sử dụng hàm mmput() Sử dụng seq_printf() để viết vào file Chỉ viết tổng cộng số đếm, ngồi khơng viết khác Khơng thêm ký tự xuống dòng \n Trong my_seq_open() đăng ký hàm hiển thị (my_seq_show()) hàm single_open() Ghi chú: single_open() nhận NULL tham số thứ Để kiểm thử tập, load module kernel root@qemux86:~# skels/memory_mapping/test/mmap-test Ghi chú: Lần kiểm thử lâu (do có lệnh sleep bên trong) Chỉ cần trình chạy, học viên sử dụng lệnh pmap console khác để quan sát trình ánh xạ phép kiểm thử, sau so sánh với kết kiểm thử 4.5 Hướng dẫn thiết lập hệ thống 4.5.1 Thiết lập hệ thống máy ảo lấy khung từ github Trên trang nguồn (Linux Kernel Teaching — The Linux Kernel documentation (linuxkernel-labs.github.io)), thấy phần học liệu chia làm hai phần, phần lectures (bài giảng) phần labs (bài thực hành) Trong phần giảng lẫn phần thực hành có code, có khác biệt: Phần giảng có code dạng demonstrative and didactic (mang tính minh họa, dùng giảng dạy) minimally reproducible (đoạn code ngắn tái tạo), tức để chạy code người lập trình bắt buộc phải có sẵn thành phần khác, thường cần phải chỉnh sửa nhiều để chạy Phần thực hành có code dạng hands-on exercise (code cung cấp dạng khung xương trống, tức có nguyên hàm hướng dẫn dạng comment, học viên bắt buộc phải theo dẫn để implement hàm đó) Phần báo cáo hướng dẫn cách thiết lập mơi trường cài đặt dependencies để hồn thành thực hành Trước hết, thống phiên hệ điều hành Linux cần sử dụng Trong khuôn khổ thực hành này, bạn khuyên dùng Ubuntu phiên 32 bit Các bạn sử dụng phiên 64 bit, bạn cần phải đối mặt với lỗi khơng tương thích Lỗi giải thông qua việc cài thư viện 32 bit để giải quyết, lượng thời gian bỏ để vá lỗi lớn Để tiết kiệm thời gian công sức, xin sử dụng phiên 32 bit Hình 4.26: Ảnh minh hoạ lỗi khơng tương thích thư viện 32bit Bài báo cáo sử dụng phiên Ubuntu 16.04, phiên 32 bit (i386) Tiếp theo, sau cài đặt hệ điều hành, ta cần lấy phần khung xương thực hành Khung xương bao gồm: Kernel Linux fork từ Torvalds/Linux Máy ảo Qemu Phần khung thực hành (được lưu trữ tools/labs) Các Makefile Kbuild tương ứng Để lấy phần khung xương này, trước hết cần cài đặt git: sudo apt-get install git git clone https://github.com/linux-kernel-labs/linux-kernellabs.github.io.git 4.5.2 Đảm bảo dependencies cho máy Qemu cần package sau để chạy: Flex Bison Build-essential Gcc-multilib libncurses5-dev qemu-system-x86 qemu-system-arm python3 minicom kvm Để cài phần mềm cách nhanh chóng, học viên viết script chạy file script để cài đặt Sau đó, ta cần cài đặt package sau để lập trình: sudo apt install reinstall build-essential sudo apt install reinstall dkms sudo apt install reinstall linux-generic sudo apt install reinstall linux-signed-generic sudo apt install reinstall linux-headers-$(uname -r) Kiểm tra xem có đủ file autoconf.h: sudo cp /usr/src/linux-headers-$(uname -r)/include/generated/autoconf.h /usr/src/linux-headers-$ (uname -r)/include/generated/ Thêm path: export LD_LIBRARY_PATH = $ {LD_LIBRARY_PATH}:/lib32:/usr/lib32:/usr/lib/i386-linux-gnu Nếu sử dụng hệ điều hành 64-bit, cần cài tiếp packages sau (nếu cần thiết, học viên chạy đoạn code hệ điều hành 32-bit, có sẵn): sudo apt-get install lib32z1 sudo apt-get install libgtk2.0-0:i386 libidn11:i386 libglu1-mesa:i386 libxmu6:i386 sudo apt-get install libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 sudo apt-get install g++-multilib Tiếp theo, cần đảm bảo chắn sử dụng gcc-6 trở lên Chúng ta làm qua câu lệnh sau: sudo update-alternatives install /usr/bin/gcc gcc /usr/bin/gcc-6 10 sudo update-alternatives install /usr/bin/g++ g++ /usr/bin/g++-6 10 sudo update-alternatives install /usr/bin/cc cc /usr/bin/gcc 30 sudo update-alternatives set cc /usr/bin/gcc sudo update-alternatives install /usr/bin/c++ c++ /usr/bin/g++ 30 sudo update-alternatives set c++ /usr/bin/g++ Để chọn phiên mặc định: sudo update-alternatives config gcc sudo update-alternatives config g++ 4.5.3 Sản sinh khung xương mã – khởi động máy ảo qemu Bước cần làm cài đặt máy ảo qemu Để làm vậy, trước hết cần mở terminal thư mục tools/labs chạy dịng lệnh: make boot Sau đó, máy ảo qemu đươc cài đặt Để khởi động qemu ta cần chạy lệnh make boot Sau máy ảo cài chạy, ta cần sử dụng cửa sổ terminal thứ để kết nối với qemu: Tại cửa sổ thứ 2, gõ lệnh sau: minicom -D serial.pts Lúc này, kết terminal máy sau: Giờ, đóng máy ảo bắt đầu q trình sinh khung mã Đầu tiên, cần chạy lệnh sau: make clean sau đó: LABS=memory_mapping make skels Trong skels có file mã nguồn trống mà học viên phải implement Sau implement, chạy: make build make copy Và cuối cùng, để chạy máy ảo: make boot Sau bạn kiểm thử code cách chạy lệnh hướng dẫn thực hành Hình 4.27: Kết thực thi xác Nếu code xác qua test case thực hành, terminal KẾT LUẬN Sau thời gian nỗ lực thực theo tiến độ, đề tài hoàn thành theo mục tiêu đề Em xin chân thành cảm ơn hướng dẫn, giúp đỡ thầy bạn để nhóm hồn thành nội dung đề tài theo mục tiêu tiến độ đặt Dù cố gắng, thời gian có hạn kiến thức chúng em hạn chế , nên đề tài khơng tránh khỏi thiếu sót, mong nhận góp ý thầy bạn