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