Báo cáo bài tập lớn môn học lập trình nhân linux

47 34 0
Báo cáo bài tập lớn môn học lập trình nhân linux

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 MƠN HỌC LẬP TRÌNH NHÂN LINUX Sinh viên thực hiện: TRẦN NGỌC PHONG - CT030143 HOÀNG MINH TÚ – CT030157 NGUYỄN THỊ THANH LOAN - CT030134 Đề tài 22 Giảng viên hướng dẫn: TS PHẠM VĂN HƯỞNG Hà Nội, – 2022 NHẬN XÉT VÀ CHO ĐIỂM CỦA GIÁO VIÊN LỜI MỞ ĐẦU Trong thời đại bùng nổ công nghệ thông tin nay, người ngày hưởng nhiều tiện ích từ hỗ trợ phần mềm đặc biệt phần mềm mã nguồn mở Linux số phần mềm mã nguồn mở sử dụng ứng dụng rộng rãi phát triển từ phần mềm UNIX Linux việc trao cho người sử dụng quyền sử dụng miễn phí, cịn có quyền chép, nghiên cứu, sửa đổi Vi vậy, phần mềm mã nguồn mở Linux ngày phát triển có phát triển cộng đồng Nước ta trình hội nhập với giới, cơng nghệ thơng tin nước ta giai đoạn học hỏi, phát triển cộng đồng sử dụng mã nguồn mở nước ta có bước tiến hồ giới Với mong muốn có hiểu biết xác vấn đề cốt lõi phần mềm mã nguồn mở, báo cáo em đề cập tới nội dung: - Phần 1: Giới thiệu chung Phần 2: Xây dựng chương trình Phần 3: Tìm hiểu sytem call Em chân thành cảm ơn giúp đỡ giảng viên TS Phạm Văn Hưởng cung cấp kiến thức tài liệu mơn học để em hồn thành báo cáo Trong q trình tìm hiểu thực hồn thành báo cáo, kiến thức chưa chuyên sâu phạm vi nghiên cứu cịn hạn hẹp nên khơng tránh khỏi sai sót, mong nhận đóng góp ý kiến từ thầy để báo cáo em hoàn thiện MỤC LỤC DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT i DANH MỤC HÌNH VẼ .ii CHƯƠNG GIỚI THIỆU CHUNG .1 1.1 Tổng quan Linux 1.1.1 Khái niệm hệ điều hành Linux 1.1.2 Cấu trúc hệ điều hành Linux .2 1.1.3 Ưu nhược điểm Linux 1.1.4 Vai trị Linux hệ thống thơng tin 1.2 Tổng quan lập trình Embedded 1.2.1 Khái niệm 1.2.2 Ưu nhược điểm .4 1.2.3 Một số lĩnh vực ứng dụng CHƯƠNG Xây dựng chương trình 2.1 Lập trình Shell 2.1.1 Quản lý file 2.1.1.1 Khái quát 2.1.1.2 Menu chức 2.1.1.3 Chức tạo thư mục .6 2.1.1.4 Chức chỉnh sửa thư mục 2.1.1.5 Chức điều hướng thư mục 2.1.1.6 Chức hiển thị danh sách thư mục .9 2.1.1.7 Kết thực thi chương trình 10 2.1.2 Lập lịch tác vụ 12 2.1.2.1 Chương trình 12 2.1.2.2 Kết thực thi chương trình 14 2.1.3 Thiết lập thời gian hệ thống .14 2.1.3.1 Chương trình 14 2.1.3.2 Kết thực thi chương trình 15 2.1.3.3 Chương trình 15 2.1.3.4 Kết thực thi chương trình 15 2.2 Lập trình C 17 2.2.1 Quản lý file 17 2.2.1.1 Chương trình 17 2.2.1.2 Kết thực thi chương trình 19 2.2.2 Process 19 2.2.2.1 Chương trình 19 2.2.2.2 Kết thực thi chương trình 21 2.2.3 Socket 22 2.2.3.1 Chương trình 22 2.2.3.2 Kết thực thi chương trình 25 2.2.4 Network 26 2.2.4.1 Chương trình 26 2.2.4.2 Kết thực thi chương trình 26 2.3 Lập trình Kenel .27 2.3.1 Chương trình 27 2.3.2 Kết thực thi chương trình 28 CHƯƠNG Tìm hiểu system call .30 3.1 Định nghĩa 30 3.2 System call table 32 3.3 Xử lý data từ tầng user xuống kernel cho system call 33 3.4 Cách kernel lấy liệu từ không gian địa vào khơng gian khác ngược lại 34 3.5 Chia sẻ nhớ động VDSO 34 KẾT LUẬN 36 TÀI LIỆU THAM KHẢO .37 DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT CPU Central Processing Unit OS Operating System GNU General Public License RTOS Real Time Operating System PCB Printed Circuit Board API Application Programming Interface VDSO Virtual Dynamic Shared Object DANH MỤC HÌNH Hình 1.1 Hệ điều hành Linux .1 Hình 1.2 Cấu trúc hệ điều hành Linux 2Y Hình 2.1 Kết thực thi chương trình quản lý file 10 Hình 2.2 Kết thực thi chương trình quản lý file 10 Hình 2.3 Kết thực thi chương trình quản lý file 11 Hình 2.4 Kết thực thi chương trình quản lý file 11 Hình 2.5 Kết thực thi chương trình quản lý file 12 Hình 2.6 Kết thực thi chương trình quản lý file 12 Hình 2.7 Lập lịch tác vụ .13 Hình 2.8 Kết thực thi chương trình lập lịch hệ thống 14 Hình 2.9 Kết thực thi chương trình thiết lập thời gian hệ thống 15 Hình 2.10 Kết thực thi chương trình cài đặt chương trình tự động 16 Hình 2.11 Kết thực thi chương trình gỡ bỏ chương trình tự động .16 Hình 2.12 Kết thực thi chương trình quản lý file 19 Hình 2.13 Kết thực thi chương trình Process 21 Hình 2.14 Kết thực thi chương trình Process 21 Hình 2.15 Kết thực thi chương trình Process 22 Hình 2.16 Kết thực thi chương trình Socket 25 Hình 2.17 Kết thực thi chương trình Socket 25 Hình 2.18 Kết thực thi chương trình Network .26 Hình 2.19 Kết thực thi chương trình module nhân 28 Hình 2.20 Kết thực thi chương trình module nhân Hình 3.1 System call 30 Hình 3.2 Ví dụ System call 31 Hình 3.3 Mơ tả luồng System call .31 Hình 3.4 System call table 32 CHƯƠNG GIỚI THIỆU CHUNG 1.1 Tổng quan Linux 1.1.1 Khái niệm hệ điều hành Linux Linux hệ điều hành mã nguồn mở (open-source OS) chạy hầu hết kiến trúc vi xử lý, bao gồm dòng vi xử lý ARM Linux hỗ trợ cộng đồng mã nguồn mở (GNU), điều làm cho Linux linh hoạt phát triển nhanh với nhiều tính khơng thua hệ điều hành khác Tất ứng dụng chạy hệ điều hành UNIX tương thích với Linux Hầu hết Linux hỗ trợ nhiều ngôn ngữ lập trình, đặc biệt cơng cụ GCC cho phép người lập trình biên dịch thực thi ứng dụng viết nhiều ngơn ngữ lập trình khác nhau: C/C++, Java, v.v Ngồi ra, Linux cịn hỗ trợ ngơn ngữ lập trình để phát triển ứng dụng đồ họa như: JTK+, Qt, v.v Ngày nay, Linux phân làm nhiều nhánh như: Ubuntu, Linux Mint, Fedora… Được sử dụng thông dụng Ubuntu Hình 1.1 Hệ điều hành Linux 1.1.2 Cấu trúc hệ điều hành Linux    Kernel  Đây yếu tố quan trọng hay gọi phần Nhân chứa đựng Module hay thư viện để quản lý, giao tiếp phần cứng máy tính ứng dụng Shell  Shell phần có nhiệm vụ thực thi lệnh từ người dùng ứng dụng yêu cầu, chuyển đến cho Kernel xử lý Shell cầu nối để kết nối Internet Application, phiên dịch lệnh từ Application gửi đến Kernel để thực thi  Các dạng Shell kể đến như: sh (the Bourne SHell), bash (Bourne-again shell), csh (C shell), ash (Almquist shell), tsh (TENEX C shell), zsh (Z shell) Application  Đây phần quen thuộc với nhất, phần để người dùng cài đặt ứng dụng, chạy ứng dụng để người dùng phục vụ cho nhu cầu Hình 1.2 Cấu trúc hệ điều hành Linux len = sizeof(client_addr); //Dung de lay thong tin dia chi client ket noi den //Server su dung mot vong lap de lien tuc nghe va phuc vu client ket noi den while(1){ printf("Server is listening at port %d\n", portno); newsockfd = accept(sockfd, (struct sockaddr *) &client_addr, (socklen_t*)&len); if (newsockfd < 0) { puts("ERROR on accept"); continue; } char s[255]; //Chua thong tin dia chi client ket noi den inet_ntop(client_addr.sin_family,(struct sockaddr *)&client_addr,s, sizeof s); printf("server: got connection from %s\n", s); while(1){ memset(recvbuff, 0, 256); //read data from socket n = read(newsockfd,recvbuff,255); //block den co du lieu tu client gui toi if (n < 0) puts("ERROR reading from socket"); printf("Client: %s",recvbuff); //write data via socket //strcpy(sendbuff, "Server has got message\n"); printf("server: "); memset(sendbuff, 0, 256); //Khoi tao buffer fgets(sendbuff,255,stdin); //Chua thong diep doc tu ban phim n = write(newsockfd,sendbuff,sizeof(sendbuff)); if (n < 0) puts("ERROR writing to socket"); } close(newsockfd); //Dong ket noi cua client sleep(1); } close(sockfd); return 0; } 2.2.3.2 Kết thực thi chương trình Hình 2.16 Kết thực thi chương trình Socket Hình 2.17 Kết thực thi chương trình Socket 2.2.4 Network 2.2.4.1 Chương trình Khai báo thư viện sử dụng chương trình: #include #include #include #include #include Hàm main chương trình: int main() { struct ifaddrs *addresses; if (getifaddrs(&addresses) == -1) { printf("getifaddrs call failed\n"); return -1; } struct ifaddrs *address = addresses; while(address) { int family = address->ifa_addr->sa_family; if (family == AF_INET || family == AF_INET6) { printf("%s\t", address->ifa_name); printf("%s\t", family == AF_INET ? "IPv4" : "IPv6"); char ap[100]; const int family_size = family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6); getnameinfo(address->ifa_addr,family_size, ap, sizeof(ap), 0, 0, NI_NUMERICHOST); printf("\t%s\n", ap); } address = address->ifa_next; } freeifaddrs(addresses); return 0; } 2.2.4.2 Kết thực thi chương trình Hình 2.18 Kết thực thi chương trình Network 2.3 Lập trình Kenel 2.3.1 Chương trình Khai báo thư viện sử dụng chương trình: #include #include #include #include #include #include #include #include Khai báo số sử dụng chương trình: #define DRIVER_NAME "my-driver" #define DRRIVE_CLASS "MyModuleClass" Khai báo hàm nguyên thủy: static int driver_open(struct inode *device_file, struct file *instance){ printk("Device open was called\n"); return 0; } static int driver_close(struct inode *device_file, struct file *instance){ printk("Device close was called\n"); return 0; } static ssize_t driver_read(struct file *File, char *user_buffer, size_t size, loff_t *offs){ return copy_to_user(user_buffer, "hello user\n", 11)?0:11; } static ssize_t driver_write(struct file *File, const char *user_buffer, size_t size, loff_t *offs){ char user_data[10]; memset(user_data, 0, 10); if(copy_from_user(user_data, user_buffer, size)) return 0; printk("user write: %s \n", user_data); return size; } static struct file_operations fops = { owner = THIS_MODULE, open = driver_open, release = driver_close, read = driver_read, write = driver_write }; Hàm init: static int my_driver_init(void){ printk("Hello device driver\n"); if(alloc_chrdev_region(&my_device_nr, 0, 1, DRIVER_NAME)){ printk("device khong the cap phat"); return -1; } printk("my-driver:Major %d, Minor : %d \n", my_device_nr>>20, my_device_nr&0xfffff); if((my_class = class_create(THIS_MODULE, DRIVER_NAME))== NULL){ printk ("device class khong the duoc tao"); unregister_chrdev_region(my_device_nr, 1); return -1; } if(device_create(my_class, NULL, my_device_nr, NULL, DRIVER_NAME) == NULL){ printk("khong the tao file device"); class_destroy(my_class); return -1; } cdev_init(&my_device, &fops); if(cdev_add(&my_device, my_device_nr,1)== 1){ printk("registering device fail\n"); device_destroy(my_class, my_device_nr); } return 0; } Hàm exit: static void my_driver_exit(void){ printk("Bye devide driver\n"); cdev_del(&my_device); device_destroy(my_class, my_device_nr); class_destroy(my_class); unregister_chrdev_region(my_device_nr, 1); } 2.3.2 Kết thực thi chương trình Hình 2.19 Kết thực thi chương trình module nhân Hình 2.20 Kết thực thi chương trình module nhân CHƯƠNG TÌM HIỂU VỀ SYSTEM CALL 3.1 Định nghĩa Trong kiến trúc Linux, không gian nhớ chia thành hai phần user space kernel space Theo đó, tồn hai chế độ (mode) user mode kernel mode Các lệnh gọi từ chương trình đóng mở file (fopen, fclose), in thơng tin (printf) thực thi truy cập vùng nhớ tầng user mà không truy cập vùng nhớ kernel Cơ chế phân tách user space với kernel space không cho phép người dùng tự ý truy cập tài nguyên kernel giúp quản lý bảo vệ kernel toàn hệ thống Thật vậy, bạn truy cập vùng nhớ trái phép user space ứng dụng bạn crash, bạn truy cập trái phép vùng nhớ kernel tồn thiết bị bạn bị crash Vấn đề đặt làm cách để user gọi xuống kernel hay thao tác điều khiển device driver? Để đáp ứng yêu cầu này, kernel cung cấp cho user space API (còn gọi dịch vụ) system call, chất system call gọi qua ngắt Hình 3.1 System call System call cửa ngõ vào kernel, cho phép tiến trình tầng user yêu cầu kernel thực thi vài tác vụ cho Những dịch vụ tạo tiến trình (fork), thực thi I/O (read, write), tạo pipe cho giao tiếp liên tiến trình (IPC) Có số điều cần ý system call sau:  Khi tiến trình gọi system call, CPU chuyển từ chế độ user mode sang kernel mode, điều cho phép CPU truy cập vùng nhớ thực lệnh kernel  Mỗi system call kernel định danh số Tiến trình tầng user khơng biết đến số này, thay vào đó, gọi system call tên hàm (ví dụ open(), read() )  Mỗi system call có số tham số truyền để cung cấp thông tin từ user truyền xuống kernel ngược lại Tuy nhiên, xem xét kỹ hơn, thấy lệnh gọi hệ thống thực lệnh gọi hàm, mà lệnh hợp ngữ cụ thể (kiến trúc kernel cụ thể) thực việc sau:  Thiết lập thông tin để xác định gọi hệ thống tham số  Kích hoạt chuyển đổi chế độ kernel  Lấy kết gọi hệ thống Ví dụ System call: Hình 3.2 Ví dụ System call Mơ tả luồng system call Hình 3.3 Mơ tả luồng System call Một số lưu ý system call:  Khi process gọi system call ln ln bị sleep  Chương trình xử lý system call phải có full permissions 3.2 System call table Là cách mà hệ điều hành implement system call Trong linux cung cấp bảng gọi system call table Hình 3.4 System call table Cột offset số hiệu system call, cột sys_call_table cột chứa địa hàm xử lý system call #define SYSCALL_I386(nr, sym, qual) [nr] = sym, const sys_call_ptr_t ia32_sys_call_table[] = { [0 NR_syscall_compat_max] = &sys_ni_syscall, #include }; SYSCALL_I386(0, sys_restart_syscall, ) SYSCALL_I386(1, sys_exit, ) #ifdef CONFIG_X86_32 SYSCALL_I386(2, sys_fork, ) #else SYSCALL_I386(2, sys_fork, ) #endif SYSCALL_I386(3, sys_read, ) SYSCALL_I386(4, sys_write, ) 3.3 Xử lý data từ tầng user xuống kernel cho system call Mỗi system call có paramenter truyền vào khác Xử lý data từ user xuống tầng kernel cho system call việc khó khắn Vì giá trị thiết lập không gian nhớ user ,system call chạy tronng không gian nhớ kernel  Kernel cần chế khác để truy cập biến vào không gian nhớ khác Khi sử dụng system call, trỏ có số trường hợp đặc biệt quan trọng cần phải kiểm tra:  Không cho phép trỏ tới không gian kernel  Kiểm tra trỏ khơng hợp lệ Vì lệnh gọi hệ thống thực mức độ kernel, chúng có quyền truy cập vào không gian kernel trỏ không kiểm tra cách, ứng dụng người dùng có quyền truy cập đọc ghi vào không gian kernel  Kernel cần chế đặc biệt để kiểm tra trỏ có hợp lệ hay khơng( access_ok() verify_area()) Ví dụ, xem xét trường hợp kiểm tra không thực cho lệnh gọi hệ thống đọc ghi Nếu người dùng chuyển trỏ không gian nhân tới lệnh gọi hệ thống ghi có quyền truy cập vào liệu nhân cách đọc tệp sau Nếu chuyển trỏ không gian nhân đến lệnh gọi hệ thống đọc làm hỏng nhớ nhân Tương tự vậy, trỏ ứng dụng chuyển qua khơng hợp lệ (ví dụ: khơng ánh xạ, đọc cho trường hợp sử dụng để viết), "làm hỏng" nhân Có thể sử dụng hai cách tiếp cận:  Kiểm tra trỏ so với không gian địa người dùng trước sử dụng  Tránh kiểm tra trỏ dựa vào MMU để phát trỏ khơng hợp lệ sử dụng trình xử lý lỗi trang để xác định trỏ khơng hợp lệ Mặc dù nghe hấp dẫn, cách tiếp cận thứ hai không dễ thực Trình xử lý lỗi trang sử dụng địa lỗi (địa truy cập), giá trị địa lỗi (địa lệnh thực truy cập) thông tin từ không gian địa người dùng để xác định nguyên nhân:  Sao chép ghi, phân trang theo yêu cầu, hoán đổi: địa lỗi địa lỗi nằm không gian người dùng; địa lỗi hợp lệ (được kiểm tra dựa không gian địa người dùng)  Con trỏ không hợp lệ sử dụng lệnh gọi hệ thống: địa lỗi nằm không gian nhân; địa lỗi nằm không gian người dùng khơng hợp lệ  Lỗi nhân (nhân truy cập trỏ không hợp lệ): giống Nhưng hai trường hợp cuối cùng, khơng có đủ thông tin để xác định nguyên nhân gây lỗi 3.4 Cách kernel lấy liệu từ không gian địa vào khơng gian khác ngược lại Kernel truy cập trức tiếp vào nhớ khơng gian người dùng gây crash Vì kernel cần phải có chế đặc biệt để copy nhớ từ user-space tới kernel-space dùng số hàm API sau: Get_user(): lấy data từ tầng user-space tới tầng kernel-sapce put_user(): gửi data từ tàng kernel-space tới tầng user-space / * OK: trả -EFAULT user_ptr không hợp lệ * / if ( copy_from_user ( & kernel_buffer , user_ptr , return - EFAULT ; size )) / * NOK: hoạt động user_ptr hợp lệ, không làm hỏng nhân * / memcpy ( & kernel_buffer , user_ptr , size ); Hãy kiểm tra API đơn giản nhất, get_user, triển khai cho x86: #define get_user (x, ptr) \ ({\ int ret_gu; \ register inttype (* (ptr)) val_gu asm ("%" _ ASM_DX); \ chk_user_ptr (ptr); \ might_fault (); \ asm volatile ("call get_user_% P4 "\ :" = a "( ret_gu)," = r "( val_gu), \ ASM_CALL_CONSTRAINT \ :" "(ptr)," i "(sizeof (* (ptr)))); \ (x) = ( force typeof (* (ptr))) val_gu; \ builtin_expect ( ret_gu, 0); \ }) Đặc biệt hàm put_user(), get_user() hàm đặc biệt hàm có khả sửa lỗi đến mức Assembly 3.5 Chia sẻ nhớ động VDSO Do kernel user hoạt động vùng nhớ khác nhau, nên sử dụng system call ảnh hưởng tới thời gian hoạt động tiển trình, phải hoạt động tâng nhớ khác vây chế VDSO sinh cần thiết việc tối ưu hóa việc thực system call Ví dụ: x86 có hai cách gọi hệ thống: int 0x80 sysenter Cái sau nhanh đáng kể sử dụng có sẵn Tuy nhiên, có sẵn cho vi xử lý Pentium II dành cho phiên nhân lớn 2.6 Với VDSO,system call định bới kernel:  Một luồng hướng dẫn để thực lệnh gọi hệ thống tạo nhân vùng nhớ đặc biệt (được định dạng đối tượng chia sẻ ELF)  Vùng nhớ ánh xạ phía cuối khơng gian địa người dùng  Libc tìm kiếm VDSO có, sử dụng để thực lệnh gọi hệ thống Một phát triển VDSO lệnh gọi hệ thống ảo (vsyscalls) chạy trực tiếp từ không gian người dùng Các gọi vsyscall phần VDSO chúng truy cập liệu từ trang VDSO tĩnh sửa đổi nhân đồ đọc-ghi riêng biệt trang VDSO hàm getpid() gettimeofday() 3.6 Thực hành Thực hành 1: mở file sử dụng system call #define _GNU_SOURCE #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd = syscall( NR_open, "hello.txt", O_RDWR|O_CREAT, 0777); if(fd == -1) puts("That bai"); else puts("Thanh cong"); exit(EXIT_SUCCESS); } Thực hành 2: Tạo system call #include #include #include #include #include #include MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Tao mot system call moi de len system call cu"); MODULE_AUTHOR("Tran Ngoc Phong"); void **sys_call_table_ptr; unsigned long copied; asmlinkage int (*original_open)( const char user *, int , mode_t); asmlinkage int mode ) new_open( const char user * pathname, int flags, mode_t { char user_msg[256]; printk("%s\n", FUNCTION ); memset(user_msg,0,sizeof(user_msg)); copied = strncpy_from_user(user_msg, pathname, sizeof(user_msg)); printk("copied:%ld\n", copied); printk("pathname%s\n",user_msg); printk(" \n"); return ( *original_open )( pathname, flags, mode ); } static int init open_hook_init(void) { write_cr0(read_cr0() & (~0x10000)); ));// khoi tao vung nho cho system call sys_call_table_ptr = (void**)kallsyms_lookup_name("sys_call_table"); original_open = sys_call_table_ptr[ NR_open]; sys_call_table_ptr[ NR_open] = new_open; write_cr0(read_cr0() | (0x10000 return 0; } static void exit open_hook_exit(void) { write_cr0(read_cr0() & (~0x10000)); sys_call_table_ptr[ NR_open] = original_open; write_cr0(read_cr0() | (0x10000)); printk("Bye bye open_hook\n"); } module_init(open_hook_init); module_exit(open_hook_exit); KẾT LUẬN Trong q trình thực đề tài, nhóm phát huy tinh thần làm việc nhóm hồn thành báo cáo tập nhóm đề Nhờ mà chúng em có thêm nhiều kiến thức kinh nghiệm thực hành liên quan đến lập trình nhân linux, lập trình shell, module nhân linux system call Thời gian qua nhóm chúng em cố gắng để tìm hiểu thực đề tài thời gian nghiên cứu tìm hiểu kiến thức kinh nghiệm nhóm chúng em cịn nhiều hạn chế nên khơng thể tránh khỏi thiếu sót, số kiến thức chưa hiểu rõ, hiểu sâu, sản phẩm đưa dừng lại mức Chúng em mong ủng hộ giúp đỡ thầy giáo để đề tài chúng em thực hoàn thiện có thêm nhiều cải tiến đáng kể Với mong muốn tìm hiểu sâu hệ điều hành linux, thời gian tới nhóm chúng em tiếp tục tìm hiểu, nghiên cứu sâu để tiến tương lai tới TÀI LIỆU THAM KHẢO [1] Bình, P (2020, August 23) Linux gì? Tại lập trình viên nên biết cách sử dụng Linux PhamBinh.Net.https://phambinh.net/bai-viet/linux-la-gi-tai-sao-lap-trinh-viennen-biet-cach-su-dung-linux/ [2] Hải, Q (2021, December 3) Embedded Linux gì? Khai Dân Trí https://khaidantri.net/embedded-linux-la-gi [3] What’s the best way to check if a file exists in C? (2008, October 23) Stack Overflow https://stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a-fileexists-in-c [4] phuthodien - Overview (2019, May 25) GitHub https://github.com/phuthodien [5] Phu Luu An (2020) YouTube https://www.youtube.com/user/phuthodien [6] Scribbr (2022, March 21) APA Citation Generator (Free) | For Students Who Value Accuracy https://www.scribbr.com/apa-citation-generator/ [7] Hungpn (2014, March 31) Device Drivers, Phần Character Device Files Embedded247 Device Drivers https://sites.google.com/site/embedded247/ddcourse/device-drivers-phan-5-characterdevice-files [8] D (2019, October 8) GitHub - davidebeatrici/list-processes: This repository contains code that can be used to retrieve the list of running processes on Windows, Linux, FreeBSD, macOS and generic BSD systems Pull requests are welcome! GitHub https://github.com/davidebeatrici/list-processes [9] GIỚI THIỆU HỆ ĐIỀU HÀNH LINUX, HỆ THỐNG NHÚNG (2012, March 15) embedded linux https://www.thegioiic.com/forums/gioi-thieu-he-dieu-hanh-linux-hethong-nhung

Ngày đăng: 26/05/2023, 09:39

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan