




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告專 業(yè): 網(wǎng)絡(luò)工程 班 級(jí): 162班 學(xué) 號(hào): 學(xué)生姓名: 指導(dǎo)教師: 2019/06/06目 錄實(shí)驗(yàn)一 進(jìn)程控制3一、實(shí)驗(yàn)?zāi)康模?二、實(shí)驗(yàn)平臺(tái):4三、實(shí)驗(yàn)內(nèi)容:4實(shí)驗(yàn)結(jié)果5單線程執(zhí)行結(jié)果:7實(shí)驗(yàn)總結(jié)8實(shí)驗(yàn)二 進(jìn)程同步8一、實(shí)驗(yàn)?zāi)康模?二、實(shí)驗(yàn)平臺(tái):8三、實(shí)驗(yàn)內(nèi)容:9執(zhí)行結(jié)果12實(shí)驗(yàn)總結(jié)12實(shí)驗(yàn)三 添加內(nèi)核模塊12一、實(shí)驗(yàn)?zāi)康模?2二、實(shí)驗(yàn)平臺(tái):13三、實(shí)驗(yàn)內(nèi)容:13readprocess.c代碼:14Makefile代碼:15processinfo文件源代碼:17Makefile文件源代碼:18實(shí)驗(yàn)總結(jié)20實(shí)驗(yàn)四 統(tǒng)計(jì)操作系統(tǒng)缺頁次數(shù)20實(shí)驗(yàn)?zāi)康?0實(shí)驗(yàn)內(nèi)容21實(shí)驗(yàn)過
2、程211. 修改內(nèi)核源代碼,添加統(tǒng)計(jì)變量212. 配置編譯新內(nèi)核233. 編譯內(nèi)核和模塊244. 安裝新內(nèi)核模塊和新內(nèi)核245. 編寫讀取pfcount值的模塊代碼256.編譯、構(gòu)建內(nèi)核模塊267.加載模塊到內(nèi)核中26實(shí)驗(yàn)總結(jié)27實(shí)驗(yàn)五 EXT4文件系統(tǒng)結(jié)構(gòu)分析27一、實(shí)驗(yàn)?zāi)康模?7二、實(shí)驗(yàn)平臺(tái):27三、實(shí)驗(yàn)內(nèi)容:27實(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.
3、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)程顯示“Parent process! PID=xxx1 PPID=xxx2”;子進(jìn)程顯示“Childx process! PID=xxx PPID=xxx”。多運(yùn)行幾次,觀察記錄屏幕上的顯示結(jié)果,并分析原因。說明: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,用來區(qū)別兩個(gè)子進(jìn)程;w
4、ait()函數(shù)用來避免父進(jìn)程在子進(jìn)程終止之前終止。程序源碼:#include#include#include#define NUM 2int main(void) pid_t pid1,pid2; if(pid1=fork()0) printf(創(chuàng)建進(jìn)程1失敗); else if(pid1=0) /子進(jìn)程1執(zhí)行 printf(Child1 process: ); printf(PID=%d PPID=%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í)行
5、printf(Child2 process: ); printf(PID=%d PPID=%d n,getpid(),getppid(); else /父進(jìn)程執(zhí)行 wait(); wait(); printf(Parent process: ); printf(PID=%d PPID=%d n,getpid(),getppid(); exit(0); 實(shí)驗(yàn)結(jié)果whtcmisswhtcmiss-VirtualBox:/Desktop$ gcc test1.c -o testwhtcmisswhtcmiss-VirtualBox:/Desktop$ ./testChild2 process: PI
6、D=2527 PPID=2525 Child1 process: PID=2526 PPID=2525 Parent process: PID=2525 PPID=2127 whtcmisswhtcmiss-VirtualBox:/Desktop$ ./testChild2 process: PID=2530 PPID=2528 Child1 process: PID=2529 PPID=2528 Parent process: PID=2528 PPID=2127 whtcmisswhtcmiss-VirtualBox:/Desktop$ ./testChild2 process: PID=
7、2533 PPID=2531 Child1 process: PID=2532 PPID=2531 Parent process: PID=2531 PPID=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,說明父進(jìn)程也是一系統(tǒng)進(jìn)程的子進(jìn)程。第二次程序運(yùn)行結(jié)果,父進(jìn)程PID是2528,PPID是2127,說明父進(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
8、.c改造成可并發(fā)執(zhí)行3個(gè)進(jìn)程的程序multi_process.c;并用time命令獲取程序的執(zhí)行時(shí)間,比較單進(jìn)程和多進(jìn)程運(yùn)行時(shí)間,并分析原因。 /single.c#include #define NUM 5 int main(void) void print_msg(char *m); print_msg(Good ); print_msg(Morning ); print_msg(201608030222n); return 0; void print_msg(char *m) int i; for(i = 0; iNUM; i+) printf(%s,m); fflush(stdout);
9、 sleep(1);編譯運(yùn)行方法:#gcc single.c o single#time ./single單線程執(zhí)行結(jié)果:多線程代碼:#multi_process.c#include #include#include#define NUM 5int main(void) pid_t pid3; int i; for(i=1;i=3;i+) pidi-1=fork(); if(pidi-1=0|pidi-1=-1) break; if(pid0=0) execl(print,print,Good,NULL); else if(pid1=0) execl(print,print,Hello,NUL
10、L); else if(pid2=0) execl(print,print,201608030222,NULL); wait(); wait(); wait(); exit(0); return 0; 實(shí)驗(yàn)分析:第二個(gè)實(shí)驗(yàn)結(jié)果,第二個(gè)程序的多線程因?yàn)槭遣l(fā)執(zhí)行,而且是有三個(gè)線程,所以在時(shí)間上幾乎是單線程的1/3,而且因?yàn)槭遣l(fā)的,所以打印結(jié)果是無序的。實(shí)驗(yàn)總結(jié)本次實(shí)驗(yàn)首先要明確進(jìn)程和程序的區(qū)別,我通過在Linux操作系統(tǒng)的進(jìn)程創(chuàng)建和終止操作,運(yùn)行父進(jìn)程和子進(jìn)程,查看運(yùn)行結(jié)果和進(jìn)程狀態(tài)的變化。實(shí)驗(yàn)過程中也了解了父進(jìn)程與子進(jìn)程的運(yùn)行過程及其機(jī)制。實(shí)驗(yàn)二 進(jìn)程同步一、實(shí)驗(yàn)?zāi)康模赫莆栈镜耐剿惴ǎ?/p>
11、解經(jīng)典進(jì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)量
12、做V操作。偽代碼描述:semaphore chopstick5=1,1,1,1,1;第i位哲學(xué)家的活動(dòng)可描述為: do printf(%d is thinkingn,i); printf(%d is hungryn,i); wait(chopsticki); /拿左筷子 wait(chopstick(i+1) % 5); /拿右筷子 printf(%d is eatingn,i); signal(chopsticki); /放左筷子 signal(chopstick(i+1) % 5); /放右筷子 whiletrue; 運(yùn)行該組進(jìn)程,觀察進(jìn)程是否能一直運(yùn)行下去,若停滯則發(fā)生了什么現(xiàn)象?并分析
13、原因。實(shí)驗(yàn)結(jié)果:源碼如下:#include #include #include #include #include #include #include #include #include #include #include #include union semunint val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;#define ERR_EXIT(m) do perror(m); exit(EXIT_FAILURE); while(0)/獲取互斥信號(hào)量void wait_mutex(int mutex)
14、struct sembuf sb=0,-1,0;semop(mutex,&sb,1);/對(duì)互斥信號(hào)量進(jìn)行操作/取得筷子void wait_v(int semid,int num)struct sembuf sb=num,-1,0;semop(semid,&sb,1);/釋放筷子void signal_p(int semid,int num)struct sembuf sb=num,1,0;semop(semid,&sb,1);/釋放互斥變量mutexvoid signal_mutex(int semid0)struct sembuf sb=0,1,0;semop(semid0,&sb,1);/
15、ph函數(shù)void ph(int num,int semid,int semid0)int left=num;int right=(num+1)%5;for(;)printf(%d is thinkingn,num);sleep(1);printf(%d is hungryn,num);sleep(1);/wait操作,控制哲學(xué)家最多4人能進(jìn)餐wait_mutex(semid0);wait_v(semid,left);wait_v(semid,right);printf(%d is eatingn,num);sleep(1);/signal操作signal_p(semid,right);/釋放右
16、筷子signal_p(semid,left);/釋放左快子signal_mutex(semid0);/釋放互斥信號(hào)量int main(int argc,char *argv)int semid,semid0;/創(chuàng)建兩個(gè)信號(hào)量集semid0=semget(IPC_PRIVATE,1,IPC_CREAT | 0666);semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666);/union semun su;su.val=1;int i;for(i=0;i5;i+)/semctl()系統(tǒng)調(diào)用在一個(gè)信號(hào)量集(或集合中的單個(gè)信號(hào)量)上執(zhí)行各種控制操作semctl(sem
17、id,i,SETVAL,su);/設(shè)定semid0信號(hào)量的初始值union semun su0;su0.val=4;semctl(semid0,0,SETVAL,su0);/創(chuàng)建4個(gè)子進(jìn)程int num=0;pid_t pid;for(i=1;i5;i+)pid=fork();if(pid0) ERR_EXIT(fork);if(pid=0) num=i;break;/第num個(gè)哲學(xué)家要做的事ph(num,semid,semid0);return 0;執(zhí)行結(jié)果實(shí)驗(yàn)總結(jié) 哲學(xué)家進(jìn)餐的問題是操作系統(tǒng)信號(hào)量同步的經(jīng)典例題了。這次我通過解決哲學(xué)家進(jìn)餐的哲學(xué)問題從而對(duì)進(jìn)程同步有一個(gè)更好的理解,解決這個(gè)問
18、題書中給出了三種解決方法。我在實(shí)驗(yàn)中也是用這三種方法去定義信號(hào)量解決死鎖問題。通過信號(hào)量的獲取與wait操作去控制進(jìn)餐是通過互斥信號(hào)量的獲取,若沒有信號(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)核模塊編程訪問進(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)
19、核模塊實(shí)例hello.c,掌握內(nèi)核模塊的主要構(gòu)成;閱讀Makefile文件,理解內(nèi)核模塊的編譯方法及執(zhí)行過程;掌握模塊安裝、卸載,以及查看模塊信息的方法。將hello.o和Makefile文件放在一個(gè)文件夾workspace中,使用make命令使其生成了hello.ko等文件,如圖:使用命令載入模塊,如圖:使用命令顯示載入系統(tǒng)的模塊,如圖:使用dmesg命令查看系統(tǒng)的內(nèi)核模塊信息如圖:使用sudo rmmod hello命令卸載該模塊:(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)的成員
20、項(xiàng),以及訪問進(jìn)程隊(duì)列的宏for_each_process;編寫readprocess模塊,獲取進(jìn)程信息;修改Makefile文件,編譯、安裝模塊,查看輸出信息;查看模塊信息,卸載模塊。源代碼如下:readprocess.c代碼:#include #include #include #include MODULE_LICENSE(GPL); static int mod_init_readprocess(void); static void mod_exit_readprocess(void);module_init(mod_init_readprocess); module_exit(mod_
21、exit_readprocess); int mod_init_readprocess(void) printk(KERN_INFOstartn);struct task_struct *p; printk(display moudleinfo is :n); for_each_process(p) printk(NAME:%stt PID:%dtt STATE:%ldttn,p-comm,p-pid,p-state); return 0; void mod_exit_readprocess(void) printk(KERN_INFOendn); Makefile代碼:ifneq ($(KE
22、RNELRELEASE),)obj-m:=readprocess.oelseKDIR:= /lib/modules/$(shell uname -r)/buildPWD:= $(shell pwd)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)核模塊信息 ,如圖:使用sud
23、o rrmod hello命令卸載該模塊,如圖:(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/2013
24、00834101/processinfo命令,查看進(jìn)程信息。processinfo文件源代碼:#include#include#include#include#includeMODULE_LICENSE(GPL);static int mod_init_readprocess(void);static void mod_exit_readprocess(void);module_init(mod_init_readprocess);module_exit(mod_exit_readprocess);struct proc_dir_entry *feeyu_dir,*processinfo_fi
25、le;int processinfo_read_procmem(char *page,char *start,off_t offset,int count,int *eof,void *data);int mod_init_readprocess(void)printk(KERN_INFOLets Gon);feeyu_dir=proc_mkdir(201300824419,NULL);processinfo_file=create_proc_read_entry(processinfo,0,cg_dir,processinfo_read_procmem, NULL );return 0;vo
26、id mod_exit_readprocess(void)remove_proc_entry(processinfo,cg_dir);remove_proc_entry(201300824419,NULL);printk(KERN_INFOThank Youn);int processinfo_read_procmem(char *page,char *start,off_t offset,int count,int *eof,void *data)int len=0;struct task_struct *p;printk(所有內(nèi)核進(jìn)程信息:n);for_each_process(p) le
27、n+=sprintf(page+len,NAME:%sPID:%dSTATE:%ldn,p-comm,p-pid,p-state);return len; Makefile文件源代碼:ifneq ($(KERNELRELEASE),)obj-m:=processinfo.oelseKDIR:= /lib/modules/$(shell uname -r)/buildPWD:= $(shell pwd)default:$(MAKE) -C $(KDIR) M=$(PWD) modulesclean:$(MAKE) -C $(KDIR) M=$(PWD) cleanEndif加載模塊: 查看模塊是
28、否存在:查看模塊信息:查看進(jìn)程信息:卸載模塊后實(shí)驗(yàn)總結(jié)這次實(shí)驗(yàn)內(nèi)容較多,重要是通過一些命令和代碼對(duì)內(nèi)核模塊的進(jìn)程進(jìn)行操作。使用命令對(duì)系統(tǒng)內(nèi)核模塊進(jìn)行操作,通過processinfo文件和makefile文件對(duì)內(nèi)核中的進(jìn)程進(jìn)行讀寫等操作。實(shí)驗(yàn)很繁雜。但思路清晰后也能較完整的把整個(gè)實(shí)驗(yàn)做下來。通過這次實(shí)驗(yàn),我對(duì)內(nèi)核模塊的操作及內(nèi)核的一些進(jìn)程上的操作有的一定的了解。實(shí)驗(yàn)四 統(tǒng)計(jì)操作系統(tǒng)缺頁次數(shù)實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)虛擬內(nèi)存的基本原理和Linux虛擬內(nèi)存管理技術(shù);深入理解、掌握Linux的按需調(diào)頁過程;掌握內(nèi)核模塊的概念和操作方法,和向/proc文件系統(tǒng)中增加文件的方法;綜合運(yùn)用內(nèi)存管理、系統(tǒng)調(diào)用、proc文件
29、系統(tǒng)、內(nèi)核編譯的知識(shí)。實(shí)驗(yàn)內(nèi)容1.原理Linux的虛擬內(nèi)存技術(shù)采用按需調(diào)頁,當(dāng)CPU請(qǐng)求一個(gè)不在內(nèi)存中的頁面時(shí),會(huì)發(fā)生缺頁,缺頁被定義為一種異常(缺頁異常),會(huì)觸發(fā)缺頁中斷處理流程。每種CPU結(jié)構(gòu)都提供一個(gè)do_page_fault處理缺頁中斷。由于每發(fā)生一次缺頁都要進(jìn)入缺頁中斷服務(wù)函數(shù)do_page_fault一次,所以可以認(rèn)為執(zhí)行該函數(shù)的次數(shù)就是系統(tǒng)發(fā)生缺頁的次數(shù)。因此可以定義一個(gè)全局變量pfcount 作為計(jì)數(shù)變量,在執(zhí)行do_page_fault時(shí),該變量值加1。本實(shí)驗(yàn)通過動(dòng)態(tài)加載模塊的方法,利用/proc文件系統(tǒng)作為中介來獲取該值。2.實(shí)驗(yàn)環(huán)境 操作系統(tǒng):Ubuntu 12.04(內(nèi)
30、核版本為3.2.0-23-generic-pae)內(nèi)核源碼:linux-3.2.58實(shí)驗(yàn)過程下載一份內(nèi)核源代碼并解壓Linux受GNU通用公共許可證(GPL)保護(hù),其內(nèi)核源代碼是完全開放的。現(xiàn)在很多Linux的網(wǎng)站都提供內(nèi)核代碼的下載。推薦使用Linux的官方網(wǎng)站:。在terminal下可以通過wget命令下載源代碼:$ cd /tmp$ wget /pub/linux/kernel/v3.x/linux-3.2.58.tar.xz切換到root身份,解壓源代碼到/usr/src目錄下:# xz d linux-3.2.58.tar.xz# tar xvf linux-3.2.58.tar C
31、 /usr/src2. 修改內(nèi)核源代碼,添加統(tǒng)計(jì)變量1、切換到預(yù)編譯內(nèi)核目錄#cd /usr/src/linux-3.2.582、修改處理內(nèi)存訪問異常的代碼/用vi編輯器打開fault.c,一般使用Intel x86體系結(jié)構(gòu),則修改arch/x86/目錄下的文件#vi arch/x86/mm/fault.c#cd arch/x86/mm#sudo gedit fault.c/在do_page_fault函數(shù)的上一行定義統(tǒng)計(jì)缺頁次數(shù)的全局變量pfcountunsigned long volatile pfcount;/將pfcount加入到do_page_fault中,用以統(tǒng)計(jì)缺頁次數(shù)pfcou
32、nt+;3、修改內(nèi)存管理代碼/用vi編輯器打開頭文件mm.h#vi include/linux/mm.h/在mm.h中加入全局變量pfcount的聲明,代碼加在extern int page_cluster;語句之后extern unsigned long volatile pfcount;4、導(dǎo)出pfcount全局變量,讓整個(gè)內(nèi)核(包括模塊)都可以訪問。方法是:#cd kernel#sudo gedit kallsyms.c/在文件最后加入一行代碼EXPORT_SYMBOL(pfcount);配置編譯新內(nèi)核用編譯Linux內(nèi)核預(yù)備實(shí)驗(yàn)中的方法完成新內(nèi)核的配置、編譯、替換,重啟后驗(yàn)證是否完成替
33、換。在編譯內(nèi)核前,一般來說都需要對(duì)內(nèi)核進(jìn)行相應(yīng)的配置。配置是精確控制新內(nèi)核功能的機(jī)會(huì)。配置過程也控制哪些需編譯到內(nèi)核的二進(jìn)制映像中(在啟動(dòng)時(shí)被載入),哪些是需要時(shí)才裝入的內(nèi)核模塊(module)。首先進(jìn)入內(nèi)核源代碼目錄:# cd /usr/src/linux-3.2.58如果不是第一次編譯的話,有必要將內(nèi)核源代碼樹置于一種完整和一致的狀態(tài)。因此,推薦執(zhí)行命令make mrproper。它將清除目錄下所有配置文件和先前生成核心時(shí)產(chǎn)生的.o文件:#make mrproper (如果是第一次可跳過此步)然后配置編譯選項(xiàng)(此處使用原內(nèi)核的配置文件,完整的配置命令看操作提示):# cp /boot/co
34、nfig-3.2.0-20-generic-pae .config該命令的作用是將原內(nèi)核配置文件拷貝的當(dāng)前目錄下,并命名為.config。若需要進(jìn)一步修改配置請(qǐng)參照操作提示。在編譯前用#uname -r查看原來的版本4. 編譯內(nèi)核和模塊編譯內(nèi)核,就用:#make編譯內(nèi)核需要較長的時(shí)間,具體與機(jī)器的硬件條件及內(nèi)核的配置等因素有關(guān)(采用VMWare虛擬機(jī),需要約60分鐘)。完成后產(chǎn)生的內(nèi)核文件bzImage的位置在/usr/src/linux/arch/i386/boot目錄下,當(dāng)然這里假設(shè)用戶的CPU是Intel x86型的,并且你將內(nèi)核源代碼放在/usr/src/linux目錄下。如果選擇了可
35、加載模塊,編譯完內(nèi)核后,要對(duì)選擇的模塊進(jìn)行編譯,可用:#make modules安裝新內(nèi)核模塊和新內(nèi)核首先,用下面的命令將新內(nèi)核模塊安裝到系統(tǒng)的標(biāo)準(zhǔn)模塊目錄中:#make modules_install此處有改動(dòng)選擇了取消 然后,用下面的命令將新內(nèi)核安裝到系統(tǒng)中:# make install通常,Linux在系統(tǒng)引導(dǎo)后從/boot目錄下讀取內(nèi)核映像到內(nèi)存中。因此如果想要使用自己編譯的內(nèi)核,就必須用make install命令將啟動(dòng)文件(內(nèi)核映像)安裝到/boot目錄下。6. 編寫讀取pfcount值的模塊代碼系統(tǒng)重啟后,執(zhí)行如下操作:#mkdir source /在當(dāng)前用戶目錄下創(chuàng)建sourc
36、e文件夾,用于存放編寫的用戶程序#cd source /切換到source目錄#vi pf.c /新建用于構(gòu)建模塊的代碼/*pf.c*/ /*modules program*/#include #include #include #include #include #include #include struct proc_dir_entry *proc_pf; struct proc_dir_entry *proc_pfcount;extern unsigned long pfcount;static inline struct proc_dir_entry *proc_pf_create(
37、const char* name, mode_t mode, read_proc_t * get_info) return create_proc_read_entry(name,mode,proc_pf,get_info,NULL);int get_pfcount(char *buffer, char *start, off_t offset, int length, int *peof, void *data) int len = 0; len = sprintf(buffer, %ld n, pfcount); return len;static int pf_init(void) proc_pf = proc_mkdir(pf, 0); proc_pf_create(pfcount, 0, get_pfcount); return 0;static void pf_exit(void) remove_proc_entry(pfcount,proc_pf); remove_proc_entry(pf,0);module_init(pf_init);module_exit(pf_exit);MODULE_LICENSE(GPL);7編譯、構(gòu)建內(nèi)核模塊#vi Makefile /在source目錄下建立Makefile文件在Makefile中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題代寫申報(bào)書是什么
- 課題申報(bào)評(píng)審書范例范文
- 就業(yè)心理 課題申報(bào)書
- 河南小學(xué)課題申報(bào)書范例
- 兌換房子合同范本
- 公司外匯借款合同范本
- 益智課堂課題研究申報(bào)書
- 閱讀推廣 課題申報(bào)書
- 課題申報(bào)項(xiàng)目書推廣價(jià)值
- 同城工程勞務(wù)合同范例
- 北師大版 數(shù)學(xué) 三年級(jí)下冊(cè) 單元作業(yè)設(shè)計(jì) 面積
- 智能農(nóng)業(yè)除草機(jī)器人研究現(xiàn)狀與趨勢分析
- (完整版)200210號(hào)文-工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)(2002年修訂本)本月修正2023簡版
- 基于核心素養(yǎng)下小學(xué)英語單元整體作業(yè)設(shè)計(jì)實(shí)踐研究 論文
- 風(fēng)電工作流程圖
- 社會(huì)救助公共基礎(chǔ)知識(shí)題庫及答案
- 《論文所用框架圖》課件
- 人教版三年級(jí)下冊(cè)說課標(biāo)、說教材
- 2022版《義務(wù)教育科學(xué)課程標(biāo)準(zhǔn)》試題及答案
- 《民法典》背景下違約精神損害賠償制度適用問題
評(píng)論
0/150
提交評(píng)論