Bảng 1.1: Mô tả chức năng list file Mô tả Chức năng này sẽ tiến hành tạo ra file ở trong thư mục hiện tại và sử dụng tên được truyền vào làm tên file.. Chức năng Remove fileMô tả Chức nă
Trang 1HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA CÔNG NGHỆ THÔNG TINBÁ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 – CT030454Phạm Thị Dung – CT030409
Hà Nội, 2022
Trang 2MỤC LỤC
CHƯƠNG 1 Lập trình shell 9
1.1 File management 9
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 2 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
Trang 3CHƯƠNG 3 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 bài tập 45
CHƯƠNG 4 Memory mapping 59
4.1 Tổng quan 59
4.2 Các struct được sử dụng cho quá trình ánh xạ bộ 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ạ bộ nhớ trong driver thiết bị 62
4.4 Phần thực hành 64
4.4.1 Ánh xạ bộ nhớ vật lý liên tục tới không gian người dùng 65
4.4.2 Ánh xạ bộ 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 trong 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 và lấy khung từ github 69
4.5.2 Đảm bảo các dependencies cho máy 71
4.5.3 Sản sinh khung xương mã – khởi động máy ảo qemu 72
Trang 4DANH MỤC HÌNH VẼ
Hình 1.1: sơ đồ usecase mô tả các chức năng trong file management 9
Hình 1.2: Biểu đồ usecase chức năng auto install và uninstall 13
Hình 1.3: Sơ đồ usecase biểu thị task management 15
Hình 1.4: Biểu đồ usecase chức năng task management 19
Hình 2.1: Usecase file management trong lập trình C 23
Hình 2.2: Usecase network management trong lập trình C 28
Hình 2.3: Usecase process management trong lập trình C 31
Hình 2.4: Usecase socket management ở trong 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 = 1 (factory) 55
Hình 3.9: Choice = 2 (matadd) 55
Hình 3.10: Choice = 3 (matnul) 56
Hình 3.11: Choice = 4 (PrimeBetween) 56
Hình 3.12: Choice = 5 (SmallerNumInMatrix) 57
Hình 3.13: Choice = 6 (NumdivisibleByMatrix) 57
Hình 3.14: Choice = 7 (PrimeOfMatrix) 58
Hình 4.1: Cấu trúc địa chỉ 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 các thư viện 32bit 70
Trang 5Hình 4.5: Kết quả thực thi chính xác 74
Trang 6DANH MỤC BẢNG
Bảng 1.1: Mô tả chức năng list file 9
Bảng 1.2: Mô tả chức năng create file 10
Bảng 1.3: Mô tả chức năng remove file 10
Bảng 1.4: Mô tả chức năng show file 10
Bảng 1.5: Mô tả chức năng edit file 10
Bảng 1.6: Mô tả chức năng đổi tên files 10
Bảng 1.7: Mô tả chức năng Copy file 11
Bảng 1.8: Mô tả chức năng auto install 13
Bảng 1.9: Mô tả chức năng auto uninstall 14
Bảng 1.10: Mô tả chức năng list của task management 16
Bảng 1.11: Mô tả chức năng create của task management 16
Bảng 1.12: Mô tả chức năng remove của task management 16
Bảng 1.13: Mô tả chức năng edit của task management 16
Bảng 1.14: Mô tả chức năng info 19
Bảng 1.15: Mô tả chức năng thay đổi giờ hệ thống 19
Bảng 1.16: Mô tả chức năng thay đổi ngày tháng trong hệ thống 20
Bảng 1.17: Mô tả chức năng tự động cập nhật thời gian hệ thống 20
Bảng 2.1: Mô tả chức năng list file trong lập trình C 23
Bảng 2.2: Mô tả chức năng create file ở trong lập trình C 24
Bảng 2.3: Mô tả chức nưng remove file ở trong lập trình C 24
Bảng 2.4: Mô tả chức năng show file trong lập trình C 24
Bảng 2.5: Mô tả list deveice trong lập trình C 29
Bảng 2.6: Mô tả chức năng list process ở trong lập trình C 31
Bảng 2.7: Mô tả chức năng kill process ở trong lập trình C 31
Bảng 2.8: Mô tả list tcp ở trong lập trình C 35
Bảng 2.9: Mô tả list udp ở trong lập trình C 35
Trang 7Bảng 2.10: Mô tả list raw ở trong lập trình C 36
Bảng 2.11: Mô tả list unix ở trong lập trình C 36
Bảng 2.12: Mô tả list tcp6 ở trong lập trình C 36
Bảng 2.13: Mô tả list udp6 ở trong lập trình C 36
Bảng 2.14: Mô tả list raw6 ở trong lập trình C 37
Trang 8DANH 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 trong C 28
Code 2.2: Code thực thi network management trong lập trình C 30
Code 2.3: Code thực thi process management ở trong lập trình C 34
Code 2.4: Code thực thi socket management ở trong lập trình C 42
Trang 9Hình 1.1: sơ đồ usecase mô tả các chức năng trong file management
Mô tả Chức năng này sẽ tiến hành thực hiện hiển thị tất cả các file
và thư mục có trong folder hiện tại
Cách thực hiện Thực hiện bằng cách sử dụng chương trình ls ở trong linux
Bảng 1.1: Mô tả chức năng list file
Mô tả Chức năng này sẽ tiến hành tạo ra file ở trong thư mục hiện
tại và sử dụng tên được truyền vào làm tên file
Cách thực hiện Thực hiện bằng cách sử dụng chương trình touch ở trong
linux
Bảng 1.2: Mô tả chức năng create file
Trang 10Chức năng Remove file
Mô tả Chức năng này sẽ tiến hành xoá file ở trong thư mục hiện
tại, tên file xoá sẽ được truyền vào như là một arument.Cách thực hiện Thực hiện bằng cách sử dụng chương trình rm ở trong linux
Bảng 1.3: Mô tả chức năng remove file
Mô tả Chức năng này sẽ tiến hành hiển thị nội dung của file lên
console
Cách thực hiện Thực hiện bằng cách sử dụng chương trình cat ở trong
linux
Bảng 1.4: Mô tả chức năng show file
Mô tả Chức năng này sẽ tiến hành mở trình soạn thảo trên file,
cho phép thực hiện chỉnh sửa nội dung file
Cách thực hiện Thực hiện bằng cách sử dụng chương trình vim ở trong
linux
Bảng 1.5: Mô tả chức năng edit file
Mô tả Chức năng này sẽ tiến hành đổi tên file
Cách thực hiện Thực hiện bằng cách sử dụng chương trình mv ở trong
linux
Bảng 1.6: Mô tả chức năng đổi tên files
Mô tả Chức năng này sẽ tiến hành copy file bất kỳ được chỉ định
bằng tên file ở trong thư mục hiện tại và copy sang một thưmục khác
Cách thực hiện Thực hiện bằng cách sử dụng chương trình mv ở trong
Trang 11then echo "chua nhap chuc nang" fi
Trang 12Code 1.1: Code thực thi file management
1.2 Auto install and uninstall
1.2.1 Phân tích thiết kế
Đối với chức năng auto install and uninstall, chúng em đi xây dựng hai chương trình
đó là install và uninstall
Trang 13Hình 1.2: Biểu đồ usecase chức năng auto install và uninstall
Mô tả Chức năng install sẽ tiến hành đọc nội dung của file input.txt
và cài đặt tất cả các package được liệt kê ở trong file
Cách thực hiện Đọc từng dòng tên các phần mềm được liệt kê ở trong file
input.txt, sau đó dùng lệnh sudo apt-get với cờ -y để tiếnhành cài đặt tất cả các gói
Bảng 1.8: Mô tả chức năng auto install
Mô tả Chức năng uninstall sẽ tiến hành đọc nội dung của file
input.txt và gỡ cài đặt tất cả các chương trình được liệt kêCách thực hiện Đọc từng dòng tên các phần mềm được liệt kê ở trong file
input.txt, sau đó dùng lệnh sudo apt-get purge với cờ -y đểtiến hành cài đặt tất cả các gói
Bảng 1.9: Mô tả chức năng auto uninstall
Trang 14Hình 1.3: Sơ đồ usecase biểu thị task management
Trang 15Bảng 1.10: Mô tả chức năng list của task management
Mô tả Chức năng create sẽ tiến hành tạo lập lịch tiến trình tuỳ
thuộc vào thông tin người dùng nhập vào
Cách thực hiện Sử dụng chương trình crontab để tạo lập lịch tiến trình
Bảng 1.11: Mô tả chức năng create của task management
Cách thực hiện Sử dụng chương trình crontab và text editor để thực hiện
chỉnh sửa nội dung lập lịch
Bảng 1.13: Mô tả chức năng edit của task management
Trang 16echo "Gio ban se nhap gio va phut de chay."
echo "Hay nhap gio"
crontab l u $LOGNAME | cat
"input.txt" | crontab u $LOGNAME
rm -f "input.txt"
else echo "Aborted\n"
Trang 17Mô tả Chức năng info sẽ hiển thị thời gian ngày tháng của hệ thống
cũng như múi giờ
Trang 18Cách thực hiện Sử dụng chương trình date để thực hiện xem giờ của hệ
Mô tả Chức năng automatic được sử dụng để tự động cập nhật lại
thời gian của hệ thốngCách thực hiện Sử dụng chương trình npdate để thực hiện tự động cập nhật
lại thời gian của hệ thống
Bảng 1.17: Mô tả chức năng tự động cập nhật thời gian hệ thống
Trang 21Hình 2.5: Usecase file management trong lập trình C
Mô tả Chức năng này sẽ tiến hành thực hiện hiển thị tất cả các file
và thư mục có trong folder hiện tại
Cách thực hiện Sử dụng hàm diropen ở trong thư viện <dirent.h> để thực
hiện đọc hết các file và folder trong thư mục được trỏ tới,tiếp theo sử dụng struct dirent để có thể lấy được tên filehoặc tên folder, khi đã có được tên rồi thì tiến hành in ramàn hình
Bảng 2.18: Mô tả chức năng list file trong lập trình C
Mô tả Chức năng này sẽ tiến hành tạo ra file ở trong thư mục hiện
tại và sử dụng tên được truyền vào làm tên file
Cách thực hiện Thực hiện kiểm tra param xem đã truyền vào tên file chưa,
nếu chưa sẽ báo lỗi Khi đã có tên file, sử dụng hàm open ở
Trang 22trong thư viện <fcntl.h> với cờ là O_CREAT kèm theothuộc tính file là 0666.
Bảng 2.19: Mô tả chức năng create file ở trong lập trình C
Mô tả Chức năng này sẽ tiến hành xoá file ở trong thư mục hiện
tại, tên file xoá sẽ được truyền vào như là một arument.Cách thực hiện Sử dụng hàm unlink ở trong thư viện <unistd.h> để thực
hiện xoá file
Bảng 2.20: Mô tả chức nưng remove file ở trong lập trình C
Mô tả Chức năng này sẽ tiến hành hiển thị nội dung của file lên
console
Cách thực hiện Thực hiện bằng cách mở file với cờ O_RDONLY và tiến
hành đọc file và hiển thị nội dung file trên console đến hếtfile
Bảng 2.21: Mô tả chức năng show file trong lập trình C
Trang 25Chức năng network management bao gồm chức năng list ra các network deveice.
Hình 2.6: Usecase network management trong lập trình C
Mô tả Chức năng này sẽ tiến hành hiển thị tất cả các network
deveice trong máy
Trang 26Cách thực hiện Sử dụng struct ifaddr trong thư viện <ifaddrs.h> để có thể
liệt kê được toàn bộ các network deveice trong máy Thôngtin được in ra bao gồm deveice name, protocol và address
Bảng 2.22: Mô tả list deveice trong lập trình C
void list_netdevice(int argc, char *argv[]) {
struct ifaddrs *addresses, *address;
int status, family, family_size;
Trang 27memset(buffer, 0, sizeof(buffer));
getnameinfo(address->ifa_addr, family_size, buffer,sizeof(buffer), 0, 0, NI_NUMERICHOST);
printf("%-15s%-15s%-15s\n", address->ifa_name,family == AF_INET ? "IPv_4" : "IPv_6", buffer);
Hình 2.7: Usecase process management trong lập trình C
Trang 28Mô tả Chức năng này sẽ tiến hành hiển thị tất cả các process đang
được thực thi ở trong máy
Cách thực hiện Sử dụng struct dirent và hàm opendir để mở thư mục /dir,
những thư mục nào bắt đầu bằng số chính là các id biểnhiện tiến trình đang chạy, tiến hành đọc file status ở trongthư mục tiến trình để lấy thông tin tiến trình
Bảng 2.23: Mô tả chức năng list process ở trong lập trình C
Mô tả Chức năng này sẽ tiến hành gửi signal tới process được chỉ
Trang 29struct dirent *dir;
char buffer[100], status_path[1000], process_name[100];int status_fd;
d = opendir("/proc");
printf(" %-10s%-10s\n", "ID", "Name");
while ((dir = readdir(d)) != NULL) {
}
}
}
void kill_process(int argc, char *argv[]) {
int process_id, kill_arg, status;
Trang 30printf("kill %d success\n", process_id);printf("\033[0m");
Trang 31socket đang được sử dụng trong máy.
Bảng 2.25: Mô tả list tcp ở trong lập trình C
Mô tả Chức năng này sẽ tiến hành hiện những socket udp lên
consoleCách thực hiện Tiến hành đọc file /proc/net/udp và in ra thông tin những
socket đang được sử dụng trong máy
Bảng 2.26: Mô tả list udp ở trong lập trình C
Mô tả Chức năng này sẽ tiến hành hiện những socket raw lên
consoleCách thực hiện Tiến hành đọc file /proc/net/raw và in ra thông tin những
socket đang được sử dụng trong máy
Bảng 2.27: Mô tả list raw ở trong lập trình C
Trang 32Chức năng List unix
Mô tả Chức năng này sẽ tiến hành hiện những socket unix lên
consoleCách thực hiện Tiến hành đọc file /proc/net/unix và in ra thông tin những
socket đang được sử dụng trong máy
Bảng 2.28: Mô tả list unix ở trong lập trình C
Mô tả Chức năng này sẽ tiến hành hiện những socket tcp6 lên
consoleCách thực hiện Tiến hành đọc file /proc/net/tcp6 và in ra thông tin những
socket đang được sử dụng trong máy
Bảng 2.29: Mô tả list tcp6 ở trong lập trình C
Mô tả Chức năng này sẽ tiến hành hiện những socket udp6 lên
consoleCách thực hiện Tiến hành đọc file /proc/net/udp6 và in ra thông tin những
socket đang được sử dụng trong máy
Bảng 2.30: Mô tả list udp6 ở trong lập trình C
Mô tả Chức năng này sẽ tiến hành hiện những socket raw6 lên
consoleCách thực hiện Tiến hành đọc file /proc/net/raw6 và in ra thông tin những
socket đang được sử dụng trong máy
Bảng 2.31: Mô tả list raw6 ở trong lập trình C
Trang 33if (strcmp(argv[1], "udp") == 0) {}
if (strcmp(argv[1], "raw") == 0) {}
if (strcmp(argv[1], "unix") == 0) {}
if (strcmp(argv[1], "tcp6") == 0) {}
if (strcmp(argv[1], "udp6") == 0) {
Trang 36while (read(fd, buffer, sizeof(buffer)) != 0) {printf("%s", buffer);
Trang 38CHƯƠNG 3 LẬP TRÌNH VÀ TÍCH HỢP KERNEL 3.1 Tổng quan
Nhân Linux là nền tảng của hệ điều hành giống Unix Kernel chịu trách nhiệm giaotiếp giữa phần cứng và phần mềm và phân bổ các tài nguyên có sẵn
Tất cả các bản phân phối Linux đều dựa trên một nhân được xác định trước Tuynhiên, nếu bạn muốn tắt một số tùy chọn và trình điều khiển hoặc thử các bản vá thửnghiệm, bạn cần phải xây dựng một nhân Linux
Mô-đun nhân là đoạn mã, có thể được tải và dỡ tải từ nhân theo yêu cầu
Mô-đun nhân cung cấp một cách dễ dàng để mở rộng chức năng của hạt nhân cơ sở
mà không cần phải xây dựng lại hoặc biên dịch lại hạt nhân Hầu hết các trình điềukhiển được triển khai dưới dạng mô-đun nhân Linux Khi những trình điều khiển đókhông cần thiết, chúng tôi chỉ có thể dỡ bỏ trình điều khiển cụ thể đó, điều này sẽ làmgiảm kích thước hình ảnh hạt nhân
Các mô-đun nhân sẽ có phần mở rộng ko Trên một hệ thống linux bình thường, cácmodule nhân sẽ nằm bên trong thư mục / lib / modules / <kernel_version> / kernel /
Hình 3.9: Mô tả nhân linux
Trang 39Các tiện ích để điều khiển module nhân:
Lsmode – Liệt kê các module đã được tải
Lệnh lsmod sẽ liệt kê các mô-đun đã được tải trong nhân
Hình 3.10: Lệnh lsmod
Insmode – Chèn module vào nhân
Lệnh insmode sẽ them một module mới vào nhân
Hình 3.11:Lệnh insmod
Modinfo – Hiển thị thông tin module
lệnh modinfo sẽ hiển thị thông tin về module nhân
Trang 40Hình 3.12: Lệnh modinfo
Rm-mode – Xóa module ra khỏi nhân
lệnh rmmod sẽ xóa một module khỏi nhân Bạn không thể xóa một module đã được sửdụng bởi bất kỳ chương trình nào
Hình 3.13: Lệnh rmmod
Modeprobe - Thêm hoặc xóa module khỏi nhân
modprobe là một lệnh thông minh sẽ tải / dỡ các mô-đun dựa trên sự phụ thuộc giữacác mô-đun
3.2 Macro
Macro chủ yếu được sử dụng để xác định mô-đun Một macro quan trọng nhất làMODULE_LICENSE(“GPL”) Nếu chúng ta không xác định macro này, chúng ta sẽkhông thể sử dụng bất kỳ thư viện hệ thống nào khác đang chạy theo giấy phép GPL.Đối với mẫu đơn giản nhất này, đây sẽ không phải là vấn đề lớn, nhưng khi chúng tôiphát triển trình điều khiển hạt nhân, v.v., đây có thể là một vấn đề lớn Vì vậy, hãyluôn nhớ giữ giấy phép GPL nếu bạn cần lấy các thư viện GPL được cấp phép.Ngoài ra, nếu bạn phát hành mô-đun của mình, thì bạn phải chọn cấp phép thích hợpcho mô-đun của mình và trong trường hợp đó, bạn sẽ phải sử dụng liên kết tĩnh đếnGPL các thư viện được cấp phép
3.3 Phần bài tập
Một driver không thể tự nó thực thi mà hoạt động tương tự như một thư viện được nạp
và đăng ký các hàm bởi một ứng dụng đang chạy Driver được viết bằng C, nhưngkhông có hàm main() Hơn nữa, bởi vì driver được nạp và liên kết với hệ điều hành,nên nó cần được biên dịch giống cách biên dịch nhân hệ điều hành, và các header filesđược sử dụng trong mã nguồn driver chỉ là những cái mà nhân hệ điều hành cung cấp,không bao giờ có các hàm của thư viện lập trình C (mà thường để trong thư mục/usr/include)
Một điểm thú vị khác là mã nguồn nhân được lập trình theo kiểu hướng đối tượngtrong C, mã nguồn driver cũng tương tự như vậy Bất kỳ một driver nào trên Linuxđều có một hàm tạo (constructor) và một hàm hủy (destructor) Hàm tạo của driver