版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
30/30計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告專業(yè):網(wǎng)絡(luò)工程班級(jí):162班學(xué)號(hào):學(xué)生姓名:指導(dǎo)教師:2019/06/06目錄1391821962_WPSOffice_Level1實(shí)驗(yàn)一進(jìn)程控制 311314988_WPSOffice_Level2一、實(shí)驗(yàn)?zāi)康模?31141244918_WPSOffice_Level2二、實(shí)驗(yàn)平臺(tái): 41522428356_WPSOffice_Level2三、實(shí)驗(yàn)內(nèi)容: 4858952486_WPSOffice_Level2實(shí)驗(yàn)結(jié)果 5374592024_WPSOffice_Level2單線程執(zhí)行結(jié)果: 7669580999_WPSOffice_Level2實(shí)驗(yàn)總結(jié) 8970829032_WPSOffice_Level1實(shí)驗(yàn)二進(jìn)程同步 81626682711_WPSOffice_Level2一、實(shí)驗(yàn)?zāi)康模?82024240931_WPSOffice_Level2二、實(shí)驗(yàn)平臺(tái): 82098306784_WPSOffice_Level2三、實(shí)驗(yàn)內(nèi)容: 91182322199_WPSOffice_Level2執(zhí)行結(jié)果 12218910234_WPSOffice_Level2實(shí)驗(yàn)總結(jié) 121114325145_WPSOffice_Level1實(shí)驗(yàn)三添加內(nèi)核模塊 12517769509_WPSOffice_Level2一、實(shí)驗(yàn)?zāi)康模?121094375619_WPSOffice_Level2二、實(shí)驗(yàn)平臺(tái): 1318893989_WPSOffice_Level2三、實(shí)驗(yàn)內(nèi)容:WPSOffice_Level2readprocess.c代碼:WPSOffice_Level2Makefile代碼: 151267937767_WPSOffice_Level2processinfo文件源代碼:WPSOffice_Level2Makefile文件源代碼:WPSOffice_Level2實(shí)驗(yàn)總結(jié) 20934746788_WPSOffice_Level1實(shí)驗(yàn)四統(tǒng)計(jì)操作系統(tǒng)缺頁(yè)次數(shù) 20808971174_WPSOffice_Level2實(shí)驗(yàn)?zāi)康?202386544_WPSOffice_Level2實(shí)驗(yàn)內(nèi)容 21477969571_WPSOffice_Level2實(shí)驗(yàn)過(guò)程 211300931025_WPSOffice_Level21.修改內(nèi)核源代碼,添加統(tǒng)計(jì)變量 21571942801_WPSOffice_Level22.配置編譯新內(nèi)核 231103344504_WPSOffice_Level23.編譯內(nèi)核和模塊 241312246013_WPSOffice_Level24.安裝新內(nèi)核模塊和新內(nèi)核 241713187719_WPSOffice_Level25.編寫讀取pfcount值的模塊代碼 25478289212_WPSOffice_Level26.編譯、構(gòu)建內(nèi)核模塊 2623714852_WPSOffice_Level27.加載模塊到內(nèi)核中 262087779743_WPSOffice_Level2實(shí)驗(yàn)總結(jié) 271147870212_WPSOffice_Level1實(shí)驗(yàn)五EXT4文件系統(tǒng)結(jié)構(gòu)分析 27994543884_WPSOffice_Level2一、實(shí)驗(yàn)?zāi)康模?271566978807_WPSOffice_Level2二、實(shí)驗(yàn)平臺(tái): 271024627495_WPSOffice_Level2三、實(shí)驗(yàn)內(nèi)容: 27945367020_WPSOffice_Level2實(shí)驗(yàn)總結(jié) 31實(shí)驗(yàn)一進(jìn)程控制一、實(shí)驗(yàn)?zāi)康模杭由顚?duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別;掌握Linux操作系統(tǒng)的進(jìn)程創(chuàng)建和終止操作,體會(huì)父進(jìn)程和子進(jìn)程的關(guān)系及進(jìn)程狀態(tài)的變化;進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì),編寫并發(fā)程序。二、實(shí)驗(yàn)平臺(tái):虛擬機(jī):VMWare9以上操作系統(tǒng):Ubuntu12.04以上編輯器:Gedit|Vim編譯器:Gcc三、實(shí)驗(yàn)內(nèi)容:(1)編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程,當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示“身份信息”:父進(jìn)程顯示“Parentprocess!PID=xxx1PPID=xxx2”;子進(jìn)程顯示“Childxprocess!PID=xxxPPID=xxx”。多運(yùn)行幾次,觀察記錄屏幕上的顯示結(jié)果,并分析原因。說(shuō)明:xxx1為進(jìn)程號(hào),用getpid()函數(shù)可獲取進(jìn)程號(hào);xxx2為父進(jìn)程號(hào),用getppid()函數(shù)可獲取父進(jìn)程號(hào);Childx中x為1和2,用來(lái)區(qū)別兩個(gè)子進(jìn)程;wait()函數(shù)用來(lái)避免父進(jìn)程在子進(jìn)程終止之前終止。程序源碼:#include<stdio.h>#include<unistd.h>#include<stdlib.h>#defineNUM2intmain(void){pid_tpid1,pid2;if((pid1=fork())<0){printf("創(chuàng)建進(jìn)程1失敗");}else{if(pid1==0){//子進(jìn)程1執(zhí)行printf("Child1process:");printf("PID=%dPPID=%d\n",getpid(),getppid());sleep(2);}else{if((pid2=fork())<0){printf("創(chuàng)建進(jìn)程2失敗");}else{if(pid2==0){//子進(jìn)程2執(zhí)行printf("Child2process:");printf("PID=%dPPID=%d\n",getpid(),getppid());}else{//父進(jìn)程執(zhí)行 wait(); wait(); printf("Parentprocess:"); printf("PID=%dPPID=%d\n",getpid(),getppid()); exit(0); }}}}}實(shí)驗(yàn)結(jié)果whtcmiss@whtcmiss-VirtualBox:~/Desktop$gcctest1.c-otestwhtcmiss@whtcmiss-VirtualBox:~/Desktop$./testChild2process:PID=2527PPID=2525Child1process:PID=2526PPID=2525Parentprocess:PID=2525PPID=2127whtcmiss@whtcmiss-VirtualBox:~/Desktop$./testChild2process:PID=2530PPID=2528Child1process:PID=2529PPID=2528Parentprocess:PID=2528PPID=2127whtcmiss@whtcmiss-VirtualBox:~/Desktop$./testChild2process:PID=2533PPID=2531Child1process:PID=2532PPID=2531Parentprocess:PID=2531PPID=2127實(shí)驗(yàn)結(jié)果分析:第一次程序運(yùn)行結(jié)果,兩個(gè)子進(jìn)程的PPID都是2525,是由同一個(gè)進(jìn)程創(chuàng)建。而父進(jìn)程PID是2525,父進(jìn)程PPID是2127,說(shuō)明父進(jìn)程也是一系統(tǒng)進(jìn)程的子進(jìn)程。第二次程序運(yùn)行結(jié)果,父進(jìn)程PID是2528,PPID是2127,說(shuō)明父進(jìn)程是由同一進(jìn)程創(chuàng)建的,父進(jìn)程也是以子進(jìn)程的方式存在,且進(jìn)程ID是逐漸遞增的。(2)fork()和exec()系列函數(shù)能同時(shí)運(yùn)行多個(gè)程序,利用上述函數(shù)將下面單進(jìn)程順序執(zhí)行的程序single.c改造成可并發(fā)執(zhí)行3個(gè)進(jìn)程的程序multi_process.c;并用time命令獲取程序的執(zhí)行時(shí)間,比較單進(jìn)程和多進(jìn)程運(yùn)行時(shí)間,并分析原因。//single.c#include<stdio.h>#defineNUM5intmain(void){voidprint_msg(char*m);print_msg("Good");print_msg("Morning");print_msg("201608030222\n");return0;}voidprint_msg(char*m){inti;for(i=0;i<NUM;i++){printf("%s",m);fflush(stdout);sleep(1);}}編譯運(yùn)行方法:#gccsingle.c–osingle#time./single單線程執(zhí)行結(jié)果:多線程代碼:#multi_process.c#include<stdio.h>#include<unistd.h>#include<stdlib.h>#defineNUM5intmain(void){pid_tpid[3];inti;for(i=1;i<=3;i++){pid[i-1]=fork();if(pid[i-1]==0||pid[i-1]==-1)break;}if(pid[0]==0){execl("print","print","Good",NULL);}else{if(pid[1]==0){execl("print","print","Hello",NULL);}else{if(pid[2]==0){execl("print","print","201608030222",NULL);}wait();wait();wait();exit(0);}}return0;}實(shí)驗(yàn)分析:第二個(gè)實(shí)驗(yàn)結(jié)果,第二個(gè)程序的多線程因?yàn)槭遣l(fā)執(zhí)行,而且是有三個(gè)線程,所以在時(shí)間上幾乎是單線程的1/3,而且因?yàn)槭遣l(fā)的,所以打印結(jié)果是無(wú)序的。實(shí)驗(yàn)總結(jié)本次實(shí)驗(yàn)首先要明確進(jìn)程和程序的區(qū)別,我通過(guò)在Linux操作系統(tǒng)的進(jìn)程創(chuàng)建和終止操作,運(yùn)行父進(jìn)程和子進(jìn)程,查看運(yùn)行結(jié)果和進(jìn)程狀態(tài)的變化。實(shí)驗(yàn)過(guò)程中也了解了父進(jìn)程與子進(jìn)程的運(yùn)行過(guò)程及其機(jī)制。實(shí)驗(yàn)二進(jìn)程同步一、實(shí)驗(yàn)?zāi)康模赫莆栈镜耐剿惴?,理解?jīng)典進(jìn)程同步問(wèn)題的本質(zhì);學(xué)習(xí)使用Linux的進(jìn)程同步機(jī)制,掌握相關(guān)API的使用方法;能利用信號(hào)量機(jī)制,采用多種同步算法實(shí)現(xiàn)不會(huì)發(fā)生死鎖的哲學(xué)家進(jìn)餐程序。二、實(shí)驗(yàn)平臺(tái):虛擬機(jī):VMWare9以上操作系統(tǒng):Ubuntu12.04以上編輯器:Gedit|Vim編譯器:Gcc三、實(shí)驗(yàn)內(nèi)容:(1)以哲學(xué)家進(jìn)餐模型為依據(jù),在Linux控制臺(tái)環(huán)境下創(chuàng)建5個(gè)進(jìn)程,用semget函數(shù)創(chuàng)建一個(gè)信號(hào)量集(5個(gè)信號(hào)量,初值為1),模擬哲學(xué)家的思考和進(jìn)餐行為:每一位哲學(xué)家饑餓時(shí),先拿起左手筷子,再拿起右手筷子;筷子是臨界資源,為每一支筷子定義1個(gè)互斥信號(hào)量;想拿到筷子需要先對(duì)信號(hào)量做P操作,使用完釋放筷子對(duì)信號(hào)量做V操作。偽代碼描述:semaphorechopstick[5]={1,1,1,1,1};第i位哲學(xué)家的活動(dòng)可描述為:do{ printf("%disthinking\n",i); printf("%dishungry\n",i);wait(chopstick[i]);//拿左筷子 wait(chopstick[(i+1)%5]);//拿右筷子printf("%diseating\n",i); signal(chopstick[i]);//放左筷子 signal(chopstick[(i+1)%5]);//放右筷子 … }while[true];運(yùn)行該組進(jìn)程,觀察進(jìn)程是否能一直運(yùn)行下去,若停滯則發(fā)生了什么現(xiàn)象?并分析原因。實(shí)驗(yàn)結(jié)果:源碼如下:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdint.h>#include<stdbool.h>#include<errno.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/wait.h>unionsemun{intval;structsemid_ds*buf;unsignedshort*array;structseminfo*_buf;};#defineERR_EXIT(m)\do{\perror(m);\exit(EXIT_FAILURE);\}while(0)//獲取互斥信號(hào)量voidwait_mutex(intmutex){structsembufsb={0,-1,0};semop(mutex,&sb,1);//對(duì)互斥信號(hào)量進(jìn)行操作}//取得筷子voidwait_v(intsemid,intnum){structsembufsb={num,-1,0};semop(semid,&sb,1);}//釋放筷子voidsignal_p(intsemid,intnum){structsembufsb={num,1,0};semop(semid,&sb,1);}//釋放互斥變量mutexvoidsignal_mutex(intsemid0){structsembufsb={0,1,0};semop(semid0,&sb,1);}//ph函數(shù)voidph(intnum,intsemid,intsemid0){intleft=num;intright=(num+1)%5;for(;;){printf("%disthinking\n",num);sleep(1);printf("%dishungry\n",num);sleep(1);//wait操作,控制哲學(xué)家最多4人能進(jìn)餐wait_mutex(semid0);wait_v(semid,left);wait_v(semid,right);printf("%diseating\n",num);sleep(1);//signal操作signal_p(semid,right);//釋放右筷子signal_p(semid,left);//釋放左快子signal_mutex(semid0);//釋放互斥信號(hào)量}}intmain(intargc,char*argv[]){intsemid,semid0;//創(chuàng)建兩個(gè)信號(hào)量集semid0=semget(IPC_PRIVATE,1,IPC_CREAT|0666);semid=semget(IPC_PRIVATE,5,IPC_CREAT|0666);//unionsemunsu;su.val=1;inti;for(i=0;i<5;i++){//semctl()系統(tǒng)調(diào)用在一個(gè)信號(hào)量集(或集合中的單個(gè)信號(hào)量)上執(zhí)行各種控制操作semctl(semid,i,SETVAL,su);}//設(shè)定semid0信號(hào)量的初始值unionsemunsu0;su0.val=4;semctl(semid0,0,SETVAL,su0);//創(chuàng)建4個(gè)子進(jìn)程intnum=0;pid_tpid;for(i=1;i<5;i++){pid=fork();if(pid<0){ERR_EXIT("fork");}if(pid==0){num=i;break;}}//第num個(gè)哲學(xué)家要做的事ph(num,semid,semid0);return0;}執(zhí)行結(jié)果實(shí)驗(yàn)總結(jié)哲學(xué)家進(jìn)餐的問(wèn)題是操作系統(tǒng)信號(hào)量同步的經(jīng)典例題了。這次我通過(guò)解決哲學(xué)家進(jìn)餐的哲學(xué)問(wèn)題從而對(duì)進(jìn)程同步有一個(gè)更好的理解,解決這個(gè)問(wèn)題書(shū)中給出了三種解決方法。我在實(shí)驗(yàn)中也是用這三種方法去定義信號(hào)量解決死鎖問(wèn)題。通過(guò)信號(hào)量的獲取與wait操作去控制進(jìn)餐是通過(guò)互斥信號(hào)量的獲取,若沒(méi)有信號(hào)量便不能執(zhí)行,而且只有四個(gè)哲學(xué)家能同時(shí)進(jìn)餐也避免了死鎖的出現(xiàn)。實(shí)驗(yàn)三添加內(nèi)核模塊一、實(shí)驗(yàn)?zāi)康模簩W(xué)習(xí)Linux模塊的基本概念和原理,學(xué)習(xí)內(nèi)核模塊編程的基本技術(shù),利用內(nèi)核模塊編程訪問(wèn)進(jìn)程描述符,操作內(nèi)核的基本數(shù)據(jù)結(jié)構(gòu),加深對(duì)進(jìn)程的理解;理解proc文件系統(tǒng)的作用,學(xué)習(xí)proc文件的創(chuàng)建方法,掌握這種用戶態(tài)和核心態(tài)通信的方法。二、實(shí)驗(yàn)平臺(tái):虛擬機(jī):VMWare9操作系統(tǒng):Ubuntu12.04編輯器:Gedit|Vi三、實(shí)驗(yàn)內(nèi)容:(1)閱讀內(nèi)核模塊實(shí)例hello.c,掌握內(nèi)核模塊的主要構(gòu)成;閱讀Makefile文件,理解內(nèi)核模塊的編譯方法及執(zhí)行過(guò)程;掌握模塊安裝、卸載,以及查看模塊信息的方法。將hello.o和Makefile文件放在一個(gè)文件夾workspace中,使用make命令使其生成了hello.ko等文件,如圖:使用命令載入模塊,如圖:使用命令顯示載入系統(tǒng)的模塊,如圖:使用dmesg命令查看系統(tǒng)的內(nèi)核模塊信息如圖:使用sudormmodhello命令卸載該模塊:(2)設(shè)計(jì)一個(gè)模塊,功能是列出系統(tǒng)中所有內(nèi)核進(jìn)程的程序名、PID號(hào)和進(jìn)程狀態(tài)。主要步驟:閱讀內(nèi)核源代碼,了解進(jìn)程描述符task_struct中與本實(shí)驗(yàn)有關(guān)的成員項(xiàng),以及訪問(wèn)進(jìn)程隊(duì)列的宏for_each_process;編寫readprocess模塊,獲取進(jìn)程信息;修改Makefile文件,編譯、安裝模塊,查看輸出信息;查看模塊信息,卸載模塊。源代碼如下:readprocess.c代碼:#include<linux/init.h>#include<linux/module.h>#include<linux/sched.h>#include<linux/list.h>MODULE_LICENSE("GPL");staticintmod_init_readprocess(void);staticvoidmod_exit_readprocess(void);module_init(mod_init_readprocess);module_exit(mod_exit_readprocess);intmod_init_readprocess(void){ printk(KERN_INFO"start\n"); structtask_struct*p; printk("displaymoudleinfois:\n"); for_each_process(p) { printk("NAME:%s\t\tPID:%d\t\tSTATE:%ld\t\t\n",p->comm,p->pid,p->state); } return0;}voidmod_exit_readprocess(void){printk(KERN_INFO"end\n");}Makefile代碼:ifneq($(KERNELRELEASE),) obj-m:=readprocess.oelse KDIR:=/lib/modules/$(shelluname-r)/build PWD:=$(shellpwd)default: $(MAKE)-C$(KDIR)M=$(PWD)modulesclean: $(MAKE)-C$(KDIR)M=$(PWD)cleanEndif將process.c和Makefile文件放在同一個(gè)文件夾下使用make函數(shù)生成后綴為.ko文件:使用命令載入模塊,如圖:使用lsmod命令顯示載入系統(tǒng)的模塊,如圖:使用dmesg命令查看到系統(tǒng)的內(nèi)核模塊信息,如圖:使用sudorrmodhello命令卸載該模塊,如圖:(3)利用內(nèi)核模塊編程,在/proc目錄下用自己的學(xué)號(hào)創(chuàng)建一個(gè)目錄,如/proc/201300834101然后在學(xué)號(hào)目錄下創(chuàng)建一個(gè)processinfo文件,如/proc/201300834101/processinfo,此文件為只讀文件,用于顯示所有內(nèi)核進(jìn)程的程序名、PID號(hào)和進(jìn)程狀態(tài)。主要步驟:修改(2)中readprocess模塊,在模塊初始化函數(shù)中創(chuàng)建目錄及proc文件,并定義產(chǎn)生proc文件內(nèi)容的函數(shù)(獲取進(jìn)程信息);在卸載模塊函數(shù)中刪除相應(yīng)的proc文件及目錄;修改Makefile文件,編譯、安裝模塊;執(zhí)行cat/proc/201300834101/processinfo命令,查看進(jìn)程信息。processinfo文件源代碼:#include<linux/init.h>#include<linux/module.h>#include<linux/sched.h>#include<linux/list.h>#include<linux/proc_fs.h>MODULE_LICENSE("GPL");staticintmod_init_readprocess(void);staticvoidmod_exit_readprocess(void);module_init(mod_init_readprocess);module_exit(mod_exit_readprocess);structproc_dir_entry*feeyu_dir,*processinfo_file;intprocessinfo_read_procmem(char*page,char**start,off_toffset,intcount,int*eof,void*data);intmod_init_readprocess(void){ printk(KERN_INFO"Let'sGo\n"); feeyu_dir=proc_mkdir("201300824419",NULL); processinfo_file=create_proc_read_entry("processinfo",0,cg_dir,processinfo_read_procmem,NULL); return0;}voidmod_exit_readprocess(void){ remove_proc_entry("processinfo",cg_dir); remove_proc_entry("201300824419",NULL); printk(KERN_INFO"ThankYou\n");}intprocessinfo_read_procmem(char*page,char**start,off_toffset,intcount,int*eof,void*data){ intlen=0; structtask_struct*p; printk("所有內(nèi)核進(jìn)程信息:\n"); for_each_process(p) { len+=sprintf(page+len,"NAME:%sPID:%dSTATE:%ld\n",p->comm,p->pid,p->state); } returnlen;}Makefile文件源代碼:ifneq($(KERNELRELEASE),) obj-m:=processinfo.oelse KDIR:=/lib/modules/$(shelluname-r)/build PWD:=$(shellpwd)default: $(MAKE)-C$(KDIR)M=$(PWD)modulesclean: $(MAKE)-C$(KDIR)M=$(PWD)cleanEndif加載模塊:查看模塊是否存在:查看模塊信息:查看進(jìn)程信息:卸載模塊后實(shí)驗(yàn)總結(jié)這次實(shí)驗(yàn)內(nèi)容較多,重要是通過(guò)一些命令和代碼對(duì)內(nèi)核模塊的進(jìn)程進(jìn)行操作。使用命令對(duì)系統(tǒng)內(nèi)核模塊進(jìn)行操作,通過(guò)processinfo文件和makefile文件對(duì)內(nèi)核中的進(jìn)程進(jìn)行讀寫等操作。實(shí)驗(yàn)很繁雜。但思路清晰后也能較完整的把整個(gè)實(shí)驗(yàn)做下來(lái)。通過(guò)這次實(shí)驗(yàn),我對(duì)內(nèi)核模塊的操作及內(nèi)核的一些進(jìn)程上的操作有的一定的了解。實(shí)驗(yàn)四統(tǒng)計(jì)操作系統(tǒng)缺頁(yè)次數(shù)實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)虛擬內(nèi)存的基本原理和Linux虛擬內(nèi)存管理技術(shù);深入理解、掌握Linux的按需調(diào)頁(yè)過(guò)程;掌握內(nèi)核模塊的概念和操作方法,和向/proc文件系統(tǒng)中增加文件的方法;綜合運(yùn)用內(nèi)存管理、系統(tǒng)調(diào)用、proc文件系統(tǒng)、內(nèi)核編譯的知識(shí)。實(shí)驗(yàn)內(nèi)容1.原理Linux的虛擬內(nèi)存技術(shù)采用按需調(diào)頁(yè),當(dāng)CPU請(qǐng)求一個(gè)不在內(nèi)存中的頁(yè)面時(shí),會(huì)發(fā)生缺頁(yè),缺頁(yè)被定義為一種異常(缺頁(yè)異常),會(huì)觸發(fā)缺頁(yè)中斷處理流程。每種CPU結(jié)構(gòu)都提供一個(gè)do_page_fault處理缺頁(yè)中斷。由于每發(fā)生一次缺頁(yè)都要進(jìn)入缺頁(yè)中斷服務(wù)函數(shù)do_page_fault一次,所以可以認(rèn)為執(zhí)行該函數(shù)的次數(shù)就是系統(tǒng)發(fā)生缺頁(yè)的次數(shù)。因此可以定義一個(gè)全局變量pfcount作為計(jì)數(shù)變量,在執(zhí)行do_page_fault時(shí),該變量值加1。本實(shí)驗(yàn)通過(guò)動(dòng)態(tài)加載模塊的方法,利用/proc文件系統(tǒng)作為中介來(lái)獲取該值。2.實(shí)驗(yàn)環(huán)境操作系統(tǒng):Ubuntu12.04(內(nèi)核版本為3.2.0-23-generic-pae)內(nèi)核源碼:linux-3.2.58實(shí)驗(yàn)過(guò)程下載一份內(nèi)核源代碼并解壓Linux受GNU通用公共許可證(GPL)保護(hù),其內(nèi)核源代碼是完全開(kāi)放的?,F(xiàn)在很多Linux的網(wǎng)站都提供內(nèi)核代碼的下載。推薦使用Linux的官方網(wǎng)站:。在terminal下可以通過(guò)wget命令下載源代碼:$cd/tmp$wget/pub/linux/kernel/v3.x/linux-3.2.58.tar.xz切換到root身份,解壓源代碼到/usr/src目錄下:#xz–dlinux-3.2.58.tar.xz#tar–xvflinux-3.2.58.tar–C/usr/src2.修改內(nèi)核源代碼,添加統(tǒng)計(jì)變量1、切換到預(yù)編譯內(nèi)核目錄#cd/usr/src/linux-3.2.582、修改處理內(nèi)存訪問(wèn)異常的代碼//用vi編輯器打開(kāi)fault.c,一般使用Intelx86體系結(jié)構(gòu),則修改arch/x86/目錄下的文件#viarch/x86/mm/fault.c#cdarch/x86/mm#sudogeditfault.c//在do_page_fault函數(shù)的上一行定義統(tǒng)計(jì)缺頁(yè)次數(shù)的全局變量pfcountunsignedlongvolatilepfcount;//將pfcount加入到do_page_fault中,用以統(tǒng)計(jì)缺頁(yè)次數(shù)pfcount++;3、修改內(nèi)存管理代碼//用vi編輯器打開(kāi)頭文件mm.h#viinclude/linux/mm.h//在mm.h中加入全局變量pfcount的聲明,代碼加在externintpage_cluster;語(yǔ)句之后externunsignedlongvolatilepfcount;4、導(dǎo)出pfcount全局變量,讓整個(gè)內(nèi)核(包括模塊)都可以訪問(wèn)。方法是:#cdkernel#sudogeditkallsyms.c//在文件最后加入一行代碼EXPORT_SYMBOL(pfcount);配置編譯新內(nèi)核用編譯Linux內(nèi)核預(yù)備實(shí)驗(yàn)中的方法完成新內(nèi)核的配置、編譯、替換,重啟后驗(yàn)證是否完成替換。在編譯內(nèi)核前,一般來(lái)說(shuō)都需要對(duì)內(nèi)核進(jìn)行相應(yīng)的配置。配置是精確控制新內(nèi)核功能的機(jī)會(huì)。配置過(guò)程也控制哪些需編譯到內(nèi)核的二進(jìn)制映像中(在啟動(dòng)時(shí)被載入),哪些是需要時(shí)才裝入的內(nèi)核模塊(module)。首先進(jìn)入內(nèi)核源代碼目錄:#cd/usr/src/linux-3.2.58如果不是第一次編譯的話,有必要將內(nèi)核源代碼樹(shù)置于一種完整和一致的狀態(tài)。因此,推薦執(zhí)行命令makemrproper。它將清除目錄下所有配置文件和先前生成核心時(shí)產(chǎn)生的.o文件:#makemrproper(如果是第一次可跳過(guò)此步)然后配置編譯選項(xiàng)(此處使用原內(nèi)核的配置文件,完整的配置命令看操作提示):#cp/boot/config-3.2.0-20-generic-pae.config該命令的作用是將原內(nèi)核配置文件拷貝的當(dāng)前目錄下,并命名為.config。若需要進(jìn)一步修改配置請(qǐng)參照操作提示。在編譯前用#uname-r查看原來(lái)的版本4.編譯內(nèi)核和模塊編譯內(nèi)核,就用:#make編譯內(nèi)核需要較長(zhǎng)的時(shí)間,具體與機(jī)器的硬件條件及內(nèi)核的配置等因素有關(guān)(采用VMWare虛擬機(jī),需要約60分鐘)。完成后產(chǎn)生的內(nèi)核文件bzImage的位置在/usr/src/linux/arch/i386/boot目錄下,當(dāng)然這里假設(shè)用戶的CPU是Intelx86型的,并且你將內(nèi)核源代碼放在/usr/src/linux目錄下。如果選擇了可加載模塊,編譯完內(nèi)核后,要對(duì)選擇的模塊進(jìn)行編譯,可用:#makemodules安裝新內(nèi)核模塊和新內(nèi)核首先,用下面的命令將新內(nèi)核模塊安裝到系統(tǒng)的標(biāo)準(zhǔn)模塊目錄中:#makemodules_install此處有改動(dòng)選擇了取消然后,用下面的命令將新內(nèi)核安裝到系統(tǒng)中:#makeinstall通常,Linux在系統(tǒng)引導(dǎo)后從/boot目錄下讀取內(nèi)核映像到內(nèi)存中。因此如果想要使用自己編譯的內(nèi)核,就必須用makeinstall命令將啟動(dòng)文件(內(nèi)核映像)安裝到/boot目錄下。6.編寫讀取pfcount值的模塊代碼系統(tǒng)重啟后,執(zhí)行如下操作:#mkdirsource//在當(dāng)前用戶目錄下創(chuàng)建source文件夾,用于存放編寫的用戶程序#cdsource//切換到source目錄#vipf.c//新建用于構(gòu)建模塊的代碼/*pf.c*//*modulesprogram*/#include<linux/init.h>#include<linux/module.h>#include<linux/kernel.h>#include<linux/mm.h>#include<linux/proc_fs.h>#include<linux/string.h>#include<asm/uaccess.h>structproc_dir_entry*proc_pf;structproc_dir_entry*proc_pfcount;externunsignedlongpfcount;staticinlinestructproc_dir_entry*proc_pf_create(constchar*name,mode_tmode,read_proc_t*get_info){returncreate_proc_read_entry(name,mode,proc_pf,get_info,NULL);}intget_pfcount(char*buffer,char**start,off_toffset,intlength,int*peof,void*data){intlen=0;len=sprintf(buffer,"%ld\n",pfcount);
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版電梯采購(gòu)安裝合同范文
- 2024版魚(yú)塘租賃與使用協(xié)議3篇
- 2024版演出場(chǎng)地租賃協(xié)議
- 2024影視制作公司與演員勞務(wù)合同標(biāo)的確認(rèn)書(shū)
- 2024年租賃協(xié)議(簡(jiǎn)化版)
- 2024年金融科技解決方案定制合同
- 【大學(xué)課件】高科技產(chǎn)業(yè)概論之中國(guó)奈米產(chǎn)業(yè)
- 2024年美術(shù)教師兼職合同
- 2024年生態(tài)環(huán)境治理服務(wù)外包合同
- 2024物業(yè)管理區(qū)域內(nèi)綠化維護(hù)合同
- 1.1、供應(yīng)商管理控制流程與風(fēng)險(xiǎn)控制流程圖
- 初二年級(jí)勞動(dòng)課教案6篇
- 箱變遷移工程施工方案
- 北師大版九年級(jí)數(shù)學(xué)下冊(cè)《圓的對(duì)稱性》評(píng)課稿
- 《遙感原理與應(yīng)用》期末考試試卷附答案
- 物流無(wú)人機(jī)垂直起降場(chǎng)選址與建設(shè)規(guī)范(征求意見(jiàn)稿)
- 工程分包管理制度
- 2023年湖南成人學(xué)位英語(yǔ)考試真題
- GB/T 9452-2023熱處理爐有效加熱區(qū)測(cè)定方法
- 肺炎支原體肺炎診治專家共識(shí)
- 藥物化學(xué)(第七版)(全套課件1364P)
評(píng)論
0/150
提交評(píng)論