1. Trang chủ
  2. » Giáo Dục - Đào Tạo

(TIỂU LUẬN) môn học hệ điều HÀNH bài tập lớn 1 system call

12 2 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 12
Dung lượng 65,23 KB

Nội dung

TR×˝NG I H¯C B CH KHOA KHOA KHOA H¯C V I HC QUăC GIA TP H CH MINH Kò THU T M Y T NH M˘NH¯C:HI UH NH B i t“p lỵn System Call GVHD: La Ho ng Lºc SVTH: Nguyn XuƠn Trỹc - 1513804 Lợp: Hỗ Ch Minh, 05/2020 L01 Tr÷íng ⁄i håc B¡ch Khoa ⁄i håc QuŁc Gia TP Hỗ Ch Minh Khoa Khoa hồc v K thu“t M¡y t‰nh Mưc lưc Bi¶n dàch Linux Kernel 1.1 Chu'n bà 1.2 C§u h…nh 1.3 XƠy dỹng kernel  ữổc cĐu h…nh 1.4 C i °t kernel mỵi L m gån kernel (trim the kernel) System Call B i t“p lỵn - H» 3.1 Hi»n thüc system call 3.2 Testing 3.3 Wrapper 3.4 Validation i•u h nh , 2019 - 2020 Trang 1/9 Tr÷íng ⁄i håc B¡ch Khoa i hồc Quc Gia TP Hỗ Ch Minh Khoa Khoa håc v Kÿ thu“t M¡y t‰nh Bi¶n dàch Linux Kernel 1.1 Chu'n bà Thi‚t l“p m¡y £o (Virtual machine): Trong b i t“p lỵn n y, chóng ta s‡ c i °t Ubuntu 18.04 tr¶n m¡y £o VirtuaBox V c§p ph¡t cho m¡y £o ı RAM cƒn thi‚t, dung l÷ỉng Œ cøng tŁi thi”u 40GB C i °t core packages: Sau c i xong m¡y £o, chóng ta c i Ubuntu’s toolchain (gcc, make): $ sudo apt-get update $ sudo apt-get install buildessential Sau â l c i kernel-package: $ sudo apt-get install kernel-package C¥u häi: T⁄i chóng ta ph£i c i kernel-package? Tr£ líi: Bði v kernel-package cõ rĐt nhiãu phiản bÊn ht nhƠn (kernel) ” chóng ta lüa chån cho phị hỉp vỵi c§u h…nh phƒn cøng cıa m¡y £o (hay m¡y th“t) ca bn To thữ mửc biản dch kernel: Tip theo, ta to mợi mt thữ mửc kernelbuild Home Sau â chóng ta t£i kernel source v• v gi£i n†n, b i lợn n y, ta sò dửng phi¶n b£n kernel 5.0.5: $ mkdir ~/kernelbuild $ cd ~/kernelbuild $ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.5.tar.xz $ tar -xvJf linux-5.0.5.tar.xz C¥u häi: T⁄i chóng ta ph£i sß dưng nhœng kernel source kh¡c t nhng server nhữ http://www.kernel.org Chúng ta cõ th biản dàch kernel source gŁc (kernel cıa OS hi»n h nh) trüc ti‚p ÷ỉc khỉng? Tr£ líi: ÷ỉc, chóng ta câ th biản dch ht nhƠn gc (the original kernel) t»p cıa OS ang sß dưng, v… kernel m°c ành ữổc chuyn vợi Debian xò lỵ hu ht cĂc cĐu hnh Ngo i ra, Debian thữớng cung cĐp mt s kernel thay th, cn kim tra trữợc kernel n y tữỡng thch tt vợi cĐu hnh phn cøng, nhi¶n nhœng lỉi ‰ch cư th” bi¶n dàch t kernel mợi t server l : ã Xò lỵ c¡c nhu cƒu phƒn cøng °c bi»t, ho°c xung ºt phn cứng vợi kernel ữổc cung cĐp trữợc ã Sò dửng cĂc tũy chồn sò dửng kernel m khổng ữổc hỉ trổ cĂc kernel ữổc cung cĐp trữợc (chflng hn nhữ hỉ trổ b nhợ cao) ã Ti ữu hâa kernel b‹ng c¡ch lo⁄i bä c¡c tr…nh i•u khi”n vổ ch tông tc ng ã To mt monolithic thay v mt kernel  ữổc modularized • Ch⁄y mºt c“p nh“t kernel ho°c d nh cho nh ph¡t tri”n 1.2 C§u h…nh C§u h…nh cıa kernel n‹m file config, b‹ng c¡ch c i °t l⁄i c¡c tịy ch¿nh file c§u h…nh s‡ gióp kernel v m¡y t‰nh ho⁄t ºng mºt c¡ch hi»u qu£ Chóng ta câ th” copy file c§u h…nh cıa kernel hi»n t⁄i cıa OS sang th÷ mưc linux-5.0.5: B i t“p lợn - Hằ iãu h nh , 2019 - 2020 Trang 2/9 Tr÷íng ⁄i håc B¡ch Khoa ⁄i håc Quc Gia TP Hỗ Ch Minh Khoa Khoa hồc v Kÿ thu“t M¡y t‰nh $ cp /boot/config-$(uname -r) ~/kernelbuild/.config Sau â, chóng ta Œi t¶n l⁄i phi¶n b£n kernel ” tịy ch¿nh file c§u h…nh thỉng qua terminal interface, ta ph£i c i °t th¶m c¡c package cƒn thi‚t: $ sudo apt-get install fakeroot ncurses-dev xz-utils bc flex libelf-dev bison libncurses5-dev openssl libssl-dev V ch⁄y l»nh make menuconfig ho°c make nconfig ” mð Kernel Configuration: $ make nconfig ” thay Œi phi¶n b£n kernel, chån General setup option -> (-ARCH) Local version - append to kernel release, sau â nh“p v o 1513804 L÷u file l⁄i v tho¡t 1.3 XƠy dỹng kernel  ữổc cĐu hnh u tiản ta ph£i bi¶n dàch kernel v t⁄o m¡y £o vmlinuz Vi»c n y s‡ m§t mºt kho£ng thíi gian kh¡ d i Trong terminal, di chuy”n ‚n th÷ mưc linux-5.0.5 v command: $ make Ho°c $ make -j Sau â l x¥y düng loadable kernel modules: $ make modules Ho°c $ make -j modules CƠu họi: ị nghắa ca command make v make modules l g…? Nhœng g… ÷ỉc t⁄o v ” l m g…? Tr£ líi: • make: bi¶n dàch v li¶n k‚t kernel image K‚t qu£ to mt file cõ tản vmlinuz ã make modules: bi¶n dàch c¡c module K‚t qu£ t⁄o c¡c file nh phƠn 1.4 Ci t kernel mợi u tiản l c i °t c¡c modules: $ sudo make modules_install Ho°c $ sudo make -j modules_install Sau â l c i °t kernel mỵi: B i t“p lỵn - H» i•u h nh , 2019 - 2020 Trang 3/9 Tr÷íng ⁄i håc B¡ch Khoa ⁄i håc QuŁc Gia TP Hỗ Ch Minh Khoa Khoa hồc v K thut MĂy t‰nh $ sudo make install Ho°c $ sudo make -j install S‡ m§t mºt ‰t thíi gian ” ho n th nh vi»c c i °t kernel mỵi Sau c i °t xong, khði ºng l⁄i m¡y: $ sudo reboot Sau khði ºng l⁄i, ki”m tra vi»c c i °t b‹ng command sau: $ uname -r K‚t qu£: k‚t qu£ câ chøa MSSV, â vi»c bi¶n dàch v c i °t ¢ th nh cỉng L m gån kernel (trim the kernel) Sau c i °t kernel th nh cỉng, chóng ta câ kernel mợi vợi cĐu hnh mc nh Nõ s bao gỗm cĂc gõi hỉ trổ hu nhữ tĐt cÊ mồi thứ, dÔn n sỹ tha khổng cn thit Vợi cĐu hnh n y, s mĐt rĐt nhiãu thới gian ” bi¶n dàch Trong khn khŒ b i t“p lợn n y, cn mt cĐu hnh kernel kh¡c cho m¡y Cư th”, chóng ta n¶n mð l⁄i make nconfig ” chån c§u h…nh phị hỉp cho m¡y cıa m…nh Nâ s‡ cung c§p cho chóng ta mºt lo⁄t c¡c menu, tł â s‡ chån c¡c tòy chån ta mun ữa v o Sau cĐu hnh, s‡ bi¶n l⁄i l⁄i kernel System Call 3.1 Hiằn thỹc system call Trong thữ mửc kernelbuild, to mợi mt thữ mửc cõ tản get_proc_info, v sau õ to mt file sys_get_proc_info.c thữ mửc get_proc_info: $ cd ~/kernelbuild $ mkdir get_proc_info $ cd get_proc_info $ touch sys_get_proc_info.c Sau â vi‚t code v o file sys_get_proc_info.c: B i lợn - Hằ iãu h nh , 2019 - 2020 Trang 4/9 Tr÷íng ⁄i håc B¡ch Khoa ⁄i hồc Quc Gia TP Hỗ Ch Minh Khoa Khoa hồc v Kÿ thu“t M¡y t‰nh #include #include #include #include #include struct proc_info { pid_t pid; char name[16]; 11 10 } 12 struct procinfos { 13 long studentID; 14 struct proc_info proc; 15 struct proc_info parent_proc; 16 struct proc_info oldest_child_proc; 17 }; 18 19 asmlinkage long sys_get_proc_info(pid_t pid, struct procinfos *info){ 20 struct task_struct *task = pid_task ( find_vpid ( pid ) , PIDTYPE_PID); 21 printk("Finding \n"); 22 for_each_process(task) { printk("[%d] - [%s]\n", task->pid, task->comm); if(task->pid == pid) { if(task->mm != NULL){ //struct proc_info proc; struct procinfos buff; buff.studenID = 1513804; buff.proc.pid = task->pid; buff.proc.name = task->comm; buff.parent_proc.pid = task->real-parent->pid; buff.oldest_child_proc.pid = task->children->pid; int res = copy_to_user(info, &buff, sizeof(buff)); if(res == 0) printk("success!"); else printk("fail"); return 0; } 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 } 38 } 39 return -1; 40 41 } Sau â, t⁄o mºt Makefile: $ pwd ~/kernelbuild/get_proc_info $ touch Makefile $ echo "obj-y := get_proc_info.o" Makefile Sau â v o kernel Makefile, tm dặng: B i lợn - Hằ iãu h nh , 2019 - 2020 Trang 5/9 Trữớng i hồc BĂch Khoa i hồc Quc Gia TP Hỗ Ch‰ Minh Khoa Khoa håc v Kÿ thu“t M¡y t‰nh core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ v bŒ sung th nh: core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ get_proc_info/ Ti‚p theo, bŒ sung mºt system call v o system call table: $ pwd ~/kernelbuild/ $ cd arch/x86/entry/syscalls/ $ echo "548 64 get_proc_info sys_get_proc_info" syscall_64.tbl C¥u họi: ị nghắa ca tng thổng tin ữổc thảm v o system call table (548 64 get_proc_info sys_get_proc_info)? Tr£ líi: C¡c system call system call table câ ành d⁄ng: • 548: (sŁ thø tü) • 64: : chøa mºt gi¡ trà: "common", "64" n‚u h» thŁng 64-bit, "x32" n‚u h» thng 32-bit ã get_proc_info: : tản ca system call ã sys_get_proc_info: Ti‚p theo, chóng ta bŒ sung mºt system call mỵi v o file system call header: $ ~/kernelbuild/include/linux/ Mð file syscalls.h v bŒ sung dỈng sau v o trữợc #endif : struct proc_info; struct procinfos; asmlinkage long sys_get_proc_info(pid_t pid, struct procinfos *info); CƠu họi: ị nghắa ca nhng dặng trản? TrÊ lới: CĂc dặng trản ữổc bŒ sung v o file header (syscalls.h) nh‹m möc ‰ch khai b¡o c¡c struct proc_info, procinfos v h m sys_get_proc_info(pid_t pid, struct procinfos *info) CuŁi cịng, bi¶n dàch l⁄i kernel v khði ºng l⁄i h» thŁng ” ¡p döng kernel mỵi: $ make -j $ make modules -j $ sudo make modules_install $ sudo make install $ sudo reboot B i lợn - Hằ iãu h nh , 2019 - 2020 Trang 6/9 Tr÷íng ⁄i håc BĂch Khoa i hồc Quc Gia TP Hỗ Ch Minh Khoa Khoa håc v Kÿ thu“t M¡y t‰nh 3.2 Testing Sau khði ºng v o kernel mỵi, chóng ta t⁄o mºt ch÷ìng tr…nh C nhä ” ki”m tra system call  ữổc tch hổp chữa v o kernel hay ch÷a: #include #include #include #define SIZE 200 int main(){ long sys_return_value; unsigned long info[SIZE]; sys_return_value = syscall(548, -1, &info); 10 printf("My student ID: %lu\n", info[0]); return 0; 11 12 } CƠu họi: Ti chữỡng trnh n y câ th” cho bi‚t li»u h» thŁng cıa chóng tỉi câ ho⁄t ºng hay khỉng? Tr£ líi: Ch÷ìng tr…nh n y in MSSV  ữổc thảm v o file sys_get_proc_info.c N‚u khỉng in óng MSSV, system call ¢ th§t b⁄i 3.3 Wrapper M°c dị system call get_proc_info  hot ng úng, vÔn cn phÊi cÊi ti‚n nâ ” thu“n ti»n hìn cho c¡c l“p tr…nh vi¶n kh¡c Chóng ta cƒn tri”n khai C wrapper ” d d ng sò dửng hỡn trĂnh biản dch kernel l⁄i mºt lƒn nœa, chóng ta s‡ t⁄o mºt thữ mửc khĂc lữu tr m nguỗn cho chữỡng trnh wapper Trữợc tiản to mt header file ca chữỡng trnh wrapper v cĂc cĐu trúc procinfos, proc_info Chóng ta °t t¶n cho header file l get_proc_info.h v nâ chøa nºi dung nh÷ sau: #ifndef _GET_PROC_INFO_H_ #define _GET_PROC_INFO_H_ #include #include struct proc_info { pid_t pid; char name[16]; }; 10 11 struct procinfos { 12 long studentID; 13 struct proc_info proc; 14 struct proc_info parent_proc; 15 struct proc_info oldest_child_proc; 16 }; 17 18 long sys_get_proc_info(pid_t pid, struct procinfos *info); 19 #endif // _GET_PROC_INFO_H_ C¥u häi: T⁄i chóng ta phÊi nh nghắa li cĂc cĐu trúc procinfos v proc_info  nh nghắa nõ kernel? B i lợn - Hằ iãu h nh , 2019 - 2020 Trang 7/9 Tr÷íng ⁄i håc B¡ch Khoa i hồc Quc Gia TP Hỗ Ch Minh Khoa Khoa håc v Kÿ thu“t M¡y t‰nh Tr£ líi: Sau â chóng ta t⁄o mºt file get_proc_info.c #include #include #include #include gi m nguỗn cho wrapper Nºi dung cıa file n y nh÷ sau: "get_proc_info.h" long get_proc_info(pid_t pid, struct procinfos *info) { return syscall(548, pid, info); } 3.4 Validation Ti‚p theo, chóng ta copy file header get_proc_info.h v o /usr/include: $ sudo cp /usr/include C¥u häi: T⁄i root l⁄i °c quy•n? (V‰ dư ph£i thảm sudo trữợc cp copy file header sang /usr/include)? TrÊ lới: v thữ mửc /usr thuc quãn sò hu cıa root n¶n cƒn copy th… ph£i c sü cho ph†p cıa root Sau â ta bi¶n dàch source code nh÷ mºt Łi t÷ỉng chia s‡ ” cho ph†p ng÷íi dịng truy c“p system call cıa ta thỉng qua øng döng cıa hå: $ gcc -shared -fpic get_proc_info.c -o libget_proc_info.so Sau bi¶n dàch th nh cỉng, copy file libget_proc_info.so sang /usr/lib: $ sudo cp libget_proc_info.so /usr/lib C¥u häi: T⁄i ta ph£i th¶m -shared v -fpic gcc command? TrÊ lới: Bữợc cui kim tra to n b cổng viằc, sò dửng chữỡng trnh sau v biản dch vợi tũy chồn get_proc_info option: #include #include #include #include #include int main() { pid_t mypid = getpid(); printf("PID: %d\n", mypid); struct procinfos info; if(get_proc_info(mypid, &info) == 0) { 10 11 12 13 14 15 B i lợn - Hằ iãu h nh , 2019 - 2020 printf("My student ID: %lu/n" printf("Process with pid or cu printf("Parent process: %llu\ printf("Oldest child process: Trang 8/9 Tr÷íng ⁄i håc B¡ch Khoa ⁄i håc Quc Gia TP Hỗ Ch Minh Khoa Khoa hồc v Kÿ thu“t M¡y t‰nh 16 } else { printf("Cannot get information from the process %d\n", mypid); 17 18 19 20 } } return 0; B i t“p lỵn - H» i•u h nh , 2019 - 2020 Trang 9/9 ... pid; char name [16 ]; 11 10 } 12 struct procinfos { 13 long studentID; 14 struct proc_info proc; 15 struct proc_info parent_proc; 16 struct proc_info oldest_child_proc; 17 }; 18 19 asmlinkage long... pid_t pid; char name [16 ]; }; 10 11 struct procinfos { 12 long studentID; 13 struct proc_info proc; 14 struct proc_info parent_proc; 15 struct proc_info oldest_child_proc; 16 }; 17 18 long sys_get_proc_info(pid_t... %d\n", mypid); struct procinfos info; if(get_proc_info(mypid, &info) == 0) { 10 11 12 13 14 15 B i lợn - Hằ iãu h nh , 2 019 - 2020 printf("My student ID: %lu/n" printf("Process with pid or cu printf("Parent

Ngày đăng: 11/12/2022, 04:39

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w