Linux操作系統(tǒng)實驗報告 (自動保存的)_第1頁
Linux操作系統(tǒng)實驗報告 (自動保存的)_第2頁
Linux操作系統(tǒng)實驗報告 (自動保存的)_第3頁
Linux操作系統(tǒng)實驗報告 (自動保存的)_第4頁
Linux操作系統(tǒng)實驗報告 (自動保存的)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 Linux操作系統(tǒng)實 驗 報 告姓名 學(xué)號 - 25 -實驗一 熟悉Linux常用命令一. 實驗?zāi)康模?    掌握Linux下各類命令的使用方法;2    熟悉Linux操作環(huán)境。二.    實驗內(nèi)容:練習(xí)使用Linux常用命令。三.    實驗環(huán)境:一臺已經(jīng)安裝好Linux操作系統(tǒng)的主機/或安裝過vmware的windows系統(tǒng)。四、   實驗操作: 虛擬機的安裝見附件1 Linux下常用命令見附件2 1)    

2、60; 獲得命令幫助分別演示一下help -help man info 命令的用法; 2)      目錄操作命令(1)啟動計算機,利用root用戶登錄到系統(tǒng),查看提示符,區(qū)別#和$提示符。(2)用pwd命令查看當(dāng)前所在的目錄。(3)用ls命令列出此目錄下的文件和目錄,包括ls -a ;ls -l;ls -R等選項的使用。(4)使用cd 裝換目錄命令,練習(xí)絕對路徑和相對路徑的使用.(5)  進(jìn)入/home目錄下,創(chuàng)建目錄test,進(jìn)入test目錄,在該目錄下創(chuàng)建一個文件hello.C,創(chuàng)建一個目錄toto,進(jìn)入toto目錄,創(chuàng)建子目錄

3、tata,創(chuàng)建文件 test.c.(6)刪除創(chuàng)建的hello.c,刪除目錄toto.(7) 在/root下創(chuàng)建文件hello.c,拷貝該文件到/home/test下(如果test目錄不存在自己創(chuàng)建),并命名文件為tt.c。(8)  使用cat more less tail head顯示文件的內(nèi)容。 只看/etc/passwd的前5行內(nèi)容。只看/etc/passwd的后5行內(nèi)容。(9)管道的使用,cat hello.c | grep "hello",在hello.C文件中查找具有字符串"hello"的行.(10)重定向的使用。符號 &g

4、t; >> 發(fā)現(xiàn)其不同的用法。(11)壓縮命令的使用。創(chuàng)建三個文件 1.Jpg 2.Jpg 3.Jpg, 把三個文件打包tar cvf hello.tar 1.Jpg 2.Jpg 3.jpg 壓縮gzip hello.tar 將hello.tar拷貝到其他目錄下解壓縮: gzip -d hello.tar.gz 解包hello.tar tar -xvf hello.tar(12) 練習(xí)拷貝命令,重命名命令,查找命令的使用(13) 熟悉根文件系統(tǒng)下的目錄1) 文件操作命令(1) 查找 /etc下的passwd這個文件。命令:1.#Find /etc name passwd /#表示在

5、管理員權(quán)限下,以下同2. #locate passwd(2)        查找/home目錄下的所有文件名中有profile的文件,其命令為。命令:#Find /etc -name “*profile*”(3) 在/home下面創(chuàng)建test目錄,在test目錄下創(chuàng)建目錄a,在a目錄下創(chuàng)建目錄b,在b目錄中創(chuàng)建目錄c.在目錄c中創(chuàng)建d,用一個命令完成。命令:mkdir -p /home/test/a/b/c/d(4) 創(chuàng)建一個軟連接指向/usr/src的源代碼,修改源文件,查看連接文件是否改變2) 用戶管理與組管理(1) 建立帳號us

6、er01,查看/etc/passwd文件有沒變化,并設(shè)置user01的密碼為123456。在查看/etc/shadow文件有無變化。l         查看/etc/group文件。l         新建一個組,組名為group01,在新建一個用戶user02,并指定它的組為group01l         把user02的組更改為user01,l

7、0;        刪除user01這個用戶l         刪除group01這個組 5)  文件的權(quán)限屬性l         查看/etc/passwd的權(quán)限,在查看/etc/shadow的權(quán)限。l         在/home下面新建 afile文件,查看它的權(quán)

8、限l         新建user02這個帳戶,l         新建group02這個組,l         把afile的權(quán)限設(shè)置為對用戶來說可讀可寫,對組來說可讀,對其他用戶來說沒有任何權(quán)限l         把afile文件的所有者更該為user02,所屬組更改為gro

9、up02,五、     思考題:1、 如何查看隱含文件列表?答:#ls all2、 如何將一個目錄中的所有文件拷貝到另一個目錄中,包括這個目錄中的隱含文件。答:# cp r 3、 如何刪除一個目錄包括其中的所有文件,并且不顯示任何提示信息?答:#rm r f4、 什么是絕對路徑?什么是相對路徑?如何表示?答:絕對路徑,從根目錄為起點到文件(夾)所在的目錄;相對路徑,從一個目錄為起點到文件(夾)所在的目錄。實驗二 Linux下程序設(shè)計基礎(chǔ)一.   實驗?zāi)康模?    掌握Linux下常用

10、編輯器的使用;2    掌握linux下程序的編譯/調(diào)試方法。二.    實驗內(nèi)容:練習(xí)linux下的 c語言程序設(shè)計,熟練使用vim編輯器編輯文件。學(xué)會gcc編譯器的使用及常用的編譯選項。能夠使用gdb調(diào)試器進(jìn)行調(diào)試程序。三.    實驗環(huán)境:一臺已經(jīng)安裝好Linux操作系統(tǒng)的主機/或安裝過vmware的windows系統(tǒng)。四、實驗操作:1. Vi 編輯器的使用1)vi 編輯器的啟動在控制臺下輸入$ vi或$ vi 文件名即可啟動vi 編輯器。如果文件是一個新文件,就會在屏幕底部現(xiàn)實一個信息,說明用戶正在創(chuàng)建新文

11、件。2)Vi編輯進(jìn)入插入模式3)Vi的保存與退出(末行模式下常用命令)4)命令模式下常用的命令命令含義x刪除光標(biāo)所指向的當(dāng)前字符 nx 刪除光標(biāo)所指向的前 n 個字符dd 刪除光標(biāo)所在行,并去除空隙 ndd刪除 n 行內(nèi)容,并去除空隙 小寫字母 p將緩沖區(qū)的內(nèi)容粘貼到光標(biāo)的后面 大寫字母 P將緩沖區(qū)的內(nèi)容粘貼到光標(biāo)的前面 yy 復(fù)制當(dāng)前行到內(nèi)存緩沖區(qū)nyy復(fù)制 n 行內(nèi)容到內(nèi)存緩沖區(qū) u 撤消前一條命令的結(jié)果 練習(xí)要求:用vi編輯器編寫一段文字,然后用上述命令進(jìn)行操作,最后保存退出。2.Gcc編譯器的使用 1)用vi編輯器編寫一個簡單hello world程序,命名為hello.c,保存退出。

12、 2)Gcc 編譯該hello.c文件,要求生成hello可執(zhí)行文件,并加入調(diào)試信息。 3)運行hello文件,查看實驗結(jié)果。Gcc下常用的命令選項:-c 選項:告訴gcc僅把源程序編譯為目標(biāo)代碼而并不做鏈接工作生成.o文件-o選項:默認(rèn)情況下,在gcc沒有指定編譯選項的情況下會在當(dāng)前目錄生成一個名為a.out的可執(zhí)行程序。g選項:在可執(zhí)行文件中輸出調(diào)試信息,通常是為調(diào)試器gdb所用Idir選項:指定庫以及頭文件搜索路徑Ldir選項:指定在目錄中需要搜索的庫(動態(tài)庫.so和靜態(tài)庫.a)3.Gdb調(diào)試器的使用進(jìn)入gdb 調(diào)試環(huán)境Gdb hello 然后用如下命令進(jìn)行操作:調(diào)試基本步驟:²

13、; Gdb <可執(zhí)行文件名> 進(jìn)入程序調(diào)試環(huán)境² Break設(shè)置斷點² Run運行程序² Next 單步運行五、思考題:1 斷點是否可以設(shè)置多個,自己試試看。如何清除所設(shè)的斷點?答:可以設(shè)置多個,但是執(zhí)行時只會執(zhí)行到第一個斷點2 如果要調(diào)試程序,編譯時有何要求?答:需要在編譯時添加調(diào)試參數(shù),如gcc g o name *.c自己寫一個完整的程序,該程序主要完成數(shù)組排序,按照由小到大順序排列給定數(shù)組的數(shù)據(jù)。并進(jìn)行編譯、調(diào)試,查看運行結(jié)果,寫出整個步驟。#include "stdio.h"int main(void) int a5,te

14、mp;printf("input 5 numn");for(int i=0;i<5;i+)scanf("%d",&ai);for(i=0;i<5;i+)for(int j=i;j<5;j+)if(ai>aj)temp=ai;ai=aj;aj=temp;for(i=0;i<5;i+)printf("%dn ",ai); return 0;實驗三 Linux下進(jìn)程間管道通信一.  實驗?zāi)康模?    掌握Linux下有名管道和無名管道通信的原理;2 

15、 掌握Linux下進(jìn)程創(chuàng)建、撤銷的方法。二.    實驗內(nèi)容:1 創(chuàng)建一個進(jìn)程,父進(jìn)程調(diào)用外部程序?qū)崿F(xiàn)兩個數(shù)求和,并打印輸出結(jié)果(從外部輸入待求和的兩個數(shù)),子進(jìn)程待父進(jìn)程結(jié)果輸出后,刪除外部程序。2 使子進(jìn)程處于僵死狀態(tài),并通過ps查看進(jìn)程狀態(tài)3 在1的基礎(chǔ)上修改:父進(jìn)程得到求和結(jié)果后傳給子進(jìn)程,由子進(jìn)程打印輸出。(通過無名管道)4 通過有名管道實現(xiàn)兩個外部進(jìn)程之間的通信。一個進(jìn)程從外部獲取輸入,另外一個進(jìn)程打印出前一個進(jìn)程的輸入內(nèi)容。三.    實驗環(huán)境:一臺已經(jīng)安裝好Linux操作系統(tǒng)的主機/或安裝過vmware的wi

16、ndows系統(tǒng)。四、實驗原理1無名管道無名管道只能實現(xiàn)父子進(jìn)程或具有親緣關(guān)系的進(jìn)程間的通信,系統(tǒng)調(diào)用為: int pipe(int pipe2),參數(shù)是2個元素的int型數(shù)組,pipe0是讀取管道的文件標(biāo)識符,pipe1是寫入管道的文件標(biāo)識符。所使用的頭文件 #include <unistd.h>。Ø 使用時先建立管道再建立子進(jìn)程的順序不能變。若不然,先建立子進(jìn)程,再建立管道,管道只對建立它的進(jìn)程可見,對另一個進(jìn)程是看不見的,因此無法實現(xiàn)父子間的通信。2有名管道有名管道可以實現(xiàn)任意兩個進(jìn)程間的通信,不局限于具有親緣關(guān)系的進(jìn)程。系統(tǒng)調(diào)用為:int mkfifo(const

17、char *path,mode_t mode), path:要使用的命名管道的路徑和名字mode指明管道的訪問權(quán)限(O_RDONLY,O_WRONLY,O_RDWR)所使用的頭文件:#include <sys/stat.h> #include <sys/types.h>五、實驗參考代碼 1.無名管道通信 #include<stdio.h>#include<unistd.h>#include<signal.h>#include<errno.h>#include<sys/types.h>int main(int a

18、rgc,char* argv)int f_des2;char msgBUFSIZ;pid_t pid;if(pid=fork()<0)printf("creat childprogress failed!");return 1;else if(pid=0)execl("/plus","plus",0);exit(0);return 0;/此時加法程序plus位于程序同一目錄else if(pid>0)wait(0);system("rm /plus"); /系統(tǒng)命令調(diào)用return 0;/判斷參數(shù)是否符

19、合程序要求if(argc!=2)printf("Usage :%s messagen",argv0;);return 1;/創(chuàng)建父子間的通信管道if(pipe(f_des)=-1)perror("cannot creat the IPC pipe");return 1;/創(chuàng)建子進(jìn)程有名管道的創(chuàng)建#define FIFO "/tmp/myfifo"mkfifo(FIFO,O_CREAT|O_EXCL)七、實驗過程實驗1代碼參見上面實驗2運行kill命令終止父進(jìn)程則子進(jìn)程處于僵死狀態(tài)八、思考題1為什么無名管道只能在具有親緣關(guān)系的進(jìn)程間通信

20、。答:因為無名管道的應(yīng)用是通過fork()的方式來創(chuàng)建一個子進(jìn)程,然后子進(jìn)程和父進(jìn)程之間的管道就可以讀寫,所以說有親緣關(guān)系的進(jìn)程(父子進(jìn)程)之間,2管道與文件有什么樣的區(qū)別。答:無名管道只是內(nèi)存虛擬的一個文件,在存儲器上并不存在,隨著程序的執(zhí)行二產(chǎn)生,隨著程序的結(jié)束而消亡,文件是存儲器上確實存在的,不以程序的運行與否而存在消亡的;有名管道和無名管道不通,它是一個文件,在存儲器上真實存在實驗四 IPC進(jìn)程間共享內(nèi)存通信一.   實驗?zāi)康模?   掌握Linux下進(jìn)程間使用共享內(nèi)存進(jìn)行通信的基本原理;2 掌握共享內(nèi)存的使用方法。二. &#

21、160;  實驗內(nèi)容:1創(chuàng)建一塊共享內(nèi)存,然后使用該共享內(nèi)存實現(xiàn)兩個進(jìn)程之間的通信。三.    實驗環(huán)境:一臺已經(jīng)安裝好Linux操作系統(tǒng)的主機/或安裝過vmware的windows系統(tǒng)。四實驗原理1Linux采用內(nèi)存映射技術(shù)把共享內(nèi)存區(qū)域映射到有關(guān)進(jìn)程的虛擬內(nèi)存空間,使他成為進(jìn)程虛擬內(nèi)存的一部分,從而進(jìn)程可以對這部分虛擬內(nèi)存區(qū)域進(jìn)行讀寫。對共享內(nèi)存的基本操作包括:Ø 進(jìn)程與共享內(nèi)存的結(jié)合;共享內(nèi)存映射到進(jìn)程虛擬區(qū)域的過程Ø 進(jìn)程與虛擬內(nèi)存的分離;當(dāng)使用共享內(nèi)存完成數(shù)據(jù)交換后需要釋放相關(guān)的虛擬內(nèi)存區(qū)域,即脫離與共享內(nèi)存的的聯(lián)系。

22、16; 主要系統(tǒng)調(diào)用(1) int shmget(key_t key,int size,int shmflg)/創(chuàng)建共享內(nèi)存(2) shmctl(int shmid,int cmd,struct shmid_ds *buf)/共享內(nèi)存的控制(3) int shmat(int shmid,char*shmaddr,int shmflg) /共享內(nèi)存映射到進(jìn)程虛擬區(qū)域(4) int shmdt(char*shmaddr)/進(jìn)程與虛擬內(nèi)存的分離Ø 參考程序段:shmid = shmget(KEY,SIZE,IPC_CREAT|0600); /* 建立共享內(nèi)存*/if(shmid = -1)

23、printf("create share memory failed: %s",strerror(errno);return 0;if(fork() = 0) /* 子進(jìn)程*/* 系統(tǒng)自動選擇一個地址連接*/shmaddr = (char *)shmat(shmid,NULL,0);if(shmaddr = (void *)-1)printf("connect to the share memory failed: %s",strerror(errno);return 0;strcpy(shmaddr,"hello, this is child

24、 process!n");shmdt(shmaddr); /* detach共享內(nèi)存*/return 0;else /* 父進(jìn)程*/sleep(3); /* 等待子進(jìn)程執(zhí)行完畢*/shmctl(shmid,IPC_STAT,&buf); /* 取得共享內(nèi)存的相關(guān)信息*/printf(" size of the share memory: ");printf("shm_segsz = %d bytes n",buf.shm_segsz);printf(" process id of the creator: ");pr

25、intf("shm_cpid = %d n",buf.shm_cpid);printf(" process id of the last operator: ");printf("shm_lpid = %d n",buf.shm_lpid);/* 系統(tǒng)自動選擇一個地址連接*/shmaddr = (char *)shmat(shmid,NULL,0);if(shmaddr = (void *)-1)printf("connect the share memory failed: %s",strerror(errno)

26、;return 0;printf("print the content of the share memory: ");printf("%s n",shmaddr);shmdt(shmaddr); /* detach共享內(nèi)存*/ 五、實驗代碼#include"stdio.h"#include"signal.h"#include"unistd.h"int pid1,pid2;main()int fd2; char outpipe100,inpipe100;pipe(fd);while(pid1=f

27、ork()=-1);if(pid1 =0)lockf(fd1,1,0);sprintf(outpipe,"nChild progress is sending message!n");write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewhile(pid2=fork()=-1);if(pid2=0)lockf(fd1,1,0);sprintf(outpipe,"nChild progress2 is sending messsage!n");write(fd1,outpipe,50);sle

28、ep(5);lockf(fd1,0,0);exit(0);elsewait(0);read(fd0,inpipe,50);printf("%sn",inpipe);wait(0);read(fd0,inpipe,50);printf("%sn",inpipe);exit(0);六實驗結(jié)果 六思考題1共享內(nèi)存通信相比其它通信方式有沒有優(yōu)勢? 答:采用共享內(nèi)存通信的一個顯而易見的好處是效率高,因為進(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝。對于像管道和消息隊列等通信方式,則需要在內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次數(shù)據(jù)1:一次從輸入文件

29、到共享內(nèi)存區(qū),另一次從共享內(nèi)存區(qū)到輸出文件實驗五 IPC信號量使用一、實驗?zāi)康模?1學(xué)習(xí)在LINUX 下信號量的使用方法。 2學(xué)習(xí)使用信號量實現(xiàn)進(jìn)程間互斥操作的原理。二.   實驗內(nèi)容:在PC機上編寫程序,實現(xiàn)2個進(jìn)程間的互斥操作。三.   實驗環(huán)境:一臺已經(jīng)安裝好Linux操作系統(tǒng)的主機/或安裝過vmware的windows系統(tǒng)。四、實驗原理信號量機制用于進(jìn)程同步與互斥。某種資源的信號量代表該資源的數(shù)量,可以限制一種資源同時被多少個地方訪問。一個進(jìn)程如果申請信號量失敗,說明那個資源在其他地方被使用,需要等待,于是這個進(jìn)程會被掛起,等

30、資源釋放了再繼續(xù)。(1)在Linux下使用信號量的步驟:1) 創(chuàng)建信號量集合2) 初始化信號量的個數(shù),即設(shè)置每種信號量有多少個。3) 申請獲得某個信號量4) 釋放以獲得的某個信號量(2)系統(tǒng)調(diào)用1) 創(chuàng)建信號量集合:int semget(key_t key, int nsems, int flag)a) key是用來生成信號量標(biāo)識的整數(shù),使用IPC_PRIVATE可以由系統(tǒng)自動選擇。b) nsems是信號量集合中有多少種信號量。創(chuàng)建兩種信號量并不需要調(diào)用這個函數(shù)兩次,只要設(shè)置nsems就可以一次創(chuàng)建多種信號量。c) flag是信號量訪問權(quán)限,用S_IRWXU設(shè)為可讀寫2) 初始化信號量個數(shù):i

31、nt semctl(int semid, int semnum, int cmd, union semun arg)a) semid是信號量集合標(biāo)識,由semget()產(chǎn)生b) semnum用來指定要訪問信號量集合中的哪個信號量,第一個信號量編號為0,其余遞增。c) cmd是執(zhí)行的操作,有很多種,這里用SETVAL,設(shè)置信號量個數(shù)。d) arg是輸入信息,新的信號量個數(shù)寫在里面。arg是一個需要自己定義的聯(lián)合體,結(jié)構(gòu)如下:union semun int val; /要把信號量設(shè)置為多少 struct semid_ds *buf; /一個系統(tǒng)定義的結(jié)構(gòu)體,本例中不用理會 ushort *arra

32、y; /用于一次設(shè)置多個信號量,本例不用理會3)申請獲得某個信號量:int semop(int semid, struct sembuf semoparray, size_t nops)a) semid是信號量集合標(biāo)識,由semget()產(chǎn)生b) semoparray是一個結(jié)構(gòu)體數(shù)組,由這個數(shù)組指定要操作那個信號量,是申請還是釋放,申請多少或釋放多少,如果申請不到的話是略過還是等待。sembuf結(jié)構(gòu)體定義如下:struct sembuf ushort sem_num; /選擇要操作集合中的哪個信號量,編號從0開始 short sem_op; /+n表示歸還n個信號量,-n表示申請n個信號量 s

33、hort sem_flg; /失敗處理,IPC_NOWAIT表示略過,SEM_UNDO表示等待c) nops指定取semoparray中前多少個數(shù)據(jù)來進(jìn)行操作。4)釋放某個信號量:int semop(int semid, struct sembuf semoparray, size_t nops)。和申請相同,不過在結(jié)構(gòu)體的sem_op中指定正數(shù)。(3)主要頭文件<sys/stat.h><sys/sem.h><sys/ipc.h><sys/types.h>(4)參考代碼union semun int val; struct semid_ds *b

34、uf; unsigned short *array; arg;int sem_creat(key_t key) union semun sem; int semid; sem.val = 0; semid = semget(key,1,IPC_CREAT|0666); if (-1 = semid) printf("create semaphore errorn"); exit(-1); semctl(semid,0,SETVAL,sem); return semid;void del_sem(int semid) union semun sem; sem.val = 0;

35、 semctl(semid,0,IPC_RMID,sem);/pint p(int semid) struct sembuf sops=0,+1,IPC_NOWAIT; return (semop(semid,&sops,1);/vint v(int semid) struct sembuf sops=0,-1,IPC_NOWAIT; return (semop(semid,&sops,1);int main() pid_t pid;int semid; key_t key;/*get the key*/ key = ftok("./etc/ld.so.conf&qu

36、ot;, 'u');/*create a semaphore*/ if(semid = semget(key, 1, IPC_CREAT | 0666) = -1) printf("Create a sempahore fail!n"); exit(EXIT_FAILURE); /*initial the semaphore*/ if(semaphore_init(semid, 0) = -1) printf("Initial the semaphore fail!n"); exit(EXIT_FAILURE); /*fork. crea

37、te a child process*/ if(pid = fork() = -1) printf("Fork fail!n"); exit(EXIT_FAILURE); /*parent process, post the semaphore*/ if(pid > 0) sleep(3);printf("The value of semaphore in the parent process : %dn", semctl(semid, 0, GETVAL); /post the semaphore V printf("I post th

38、e semaphore !n"); if(semaphore_v(semid) = -1) printf("post the semaphore fail!n"); exit(EXIT_FAILURE); printf("post done !n"); exit(0); else /wait the semaphore P if(semaphore_p(semid) = -1) printf("Wait the semphore fail!/n"); exit(EXIT_FAILURE); printf("I ge

39、t the semaphore!n");semctl(semid, 0, IPC_RMID); /destroy the semaphore exit(0);五、實驗要求自己寫一個程序,練習(xí)信號量的使用。六實驗代碼如參考中的main()函數(shù)七實驗結(jié)果六、思考題1、信號量實現(xiàn)進(jìn)程間互斥的原理是什么?答:設(shè)互斥信號量mutex初值為1,進(jìn)程執(zhí)行操作前P(mutex),操作完成后V(mutex)。P操作使mutex減1,如果mutex<1,新進(jìn)程在執(zhí)行P操作后會阻塞,等到前一個進(jìn)程V操作使mutex+1后mutex=1才執(zhí)行。實驗六 設(shè)備驅(qū)動程序一、  實驗?zāi)康模?1學(xué)習(xí)在

40、LINUX 下進(jìn)行驅(qū)動設(shè)計的原理。 2掌握使用模塊方式進(jìn)行驅(qū)動開發(fā)調(diào)試的過程。二、    實驗內(nèi)容:在PC 機上編寫簡單的虛擬硬件驅(qū)動程序并進(jìn)行調(diào)試,實驗驅(qū)動的各個接口函數(shù)的實現(xiàn),分析并理解驅(qū)動與應(yīng)用程序的交互過程。三、 實驗環(huán)境:一臺已經(jīng)安裝好Linux操作系統(tǒng)的主機/或安裝過vmware的windows系統(tǒng)。四、實驗原理 1.驅(qū)動程序與應(yīng)用程序的區(qū)別 應(yīng)用程序一般有一個main 函數(shù),從頭到尾執(zhí)行一個任務(wù);驅(qū)動程序卻不同,它沒有main 函數(shù),通過使用宏init_module(); 將初始化函數(shù)加入內(nèi)核全局初始化函數(shù)列表中,在內(nèi)核初始化時執(zhí)行驅(qū)動的初始化函數(shù),

41、從而完成驅(qū)動的初始化和注冊,之后驅(qū)動便停止等待被應(yīng)用軟件調(diào)用。驅(qū)動程序中有一個宏cleanup_module()注冊退出處理函數(shù)。它在驅(qū)動退出時被調(diào)用。 2.主設(shè)備號和次設(shè)備號 傳統(tǒng)方式中的設(shè)備管理中,除了設(shè)備類型外,內(nèi)核還需要一對稱作主次設(shè)備號的參數(shù),才能唯一標(biāo)識一個設(shè)備。主設(shè)備號相同的設(shè)備使用相同的驅(qū)動程序,次設(shè)備號用于區(qū)分具體設(shè)備的實例。比如PC 機中的IDE 設(shè)備,一般主設(shè)備號使用3,WINDOWS 下進(jìn)行的分區(qū),一般將主分區(qū)的次設(shè)備號為1,擴展分區(qū)的次設(shè)備號為2、3、4,邏輯分區(qū)使用5、6.。設(shè)備操作宏MAJOR()和MINOR()可分別用于獲取主次設(shè)備號,宏MKDEV()用于將主設(shè)

42、備號和次設(shè)備號合并為設(shè)備號,這些宏定義在include/linux/kdev_t.h 中。對于查看/dev 目錄下的設(shè)備的主次設(shè)備號可以使用如下命令:/mnt/yaffsls /dev l 3.設(shè)備驅(qū)動程序接口通常所說的設(shè)備驅(qū)動程序接口是指結(jié)構(gòu)file_operations,它定義在include/linux/fs.h 中。 4.模塊的加載與卸載 加載模塊:insmod test.O 卸載模塊:rmmod test 顯示已安裝的模塊:lsmod五、驅(qū)動模塊設(shè)計參考#define   MODULE #include   <linux/module.h > int

43、  init_module(void)                 printk("Hello   World!n");                 return   0; void   cleanup_module(void)                 printk("Go

44、odbye!n"); 編譯:root# gcc c hello.c執(zhí)行:root# insmod hello.o使用lsmod命令查看加載的hello模塊:root# lsmodModule size Used byHello 464 0卸載模塊root# rmmod hello查看結(jié)果:dmesg (可以看到打印信息)六、實驗要求自己寫一個簡單的驅(qū)動程序,驅(qū)動程序中定義struct file_operations結(jié)構(gòu),在其中定義自己的接口,利用該驅(qū)動程序?qū)崿F(xiàn)設(shè)備文件的寫入與輸出。寫一個應(yīng)用程序測試自己的驅(qū)動程序。七實驗代碼1.驅(qū)動程序#include <linux/init.

45、h> #include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/errno.h> #include <asm/segment.h> #include<linux/poll.h> #include <linux/compiler.h> char kernel_buf30="Hello,the first driver dem

46、o" unsigned int test_major=0; static ssize_t read_test(struct file *file,char *buf,size_t count,loff_t *f_pos) copy_to_user(buf,kernel_buf,count); return count; static ssize_t write_test(struct file *file,char *buf,size_t count,loff_t *f_pos) copy_from_user(kernel_buf,buf,count); return count;

47、static int open_test(struct inode *inode,struct file *file) try_module_get(THIS_MODULE); return 0; static int release_test(struct inode *inode,struct file *file) module_put(THIS_MODULE); return 0; struct file_operations test_fops= owner:THIS_MODULE, read:read_test, write:write_test, open:open_test,

48、release:release_test, /ioctl:ioctl_test ; int driver_init(void) int result; result=register_chrdev(250,"test",&test_fops); if(result<0) printk(KERN_INFO "test:can not get major number!n"); return result; return 0; void driver_exit(void) unregister_chrdev(250,"test&quo

49、t;); module_init(driver_init);module_exit(driver_exit);MODULE_LICENSE("Dual BSD/GPL"); 2.測試程序#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>main() int i,n;int testdev; char buf20="hello worldn" testdev=open("/lib/modules/2.

50、6.38-11-generic/build/driver2",O_RDWR);if(testdev=-1)printf("can not open file!n"); exit(0); write(testdev,buf,10); read(testdev,buf,10); printf("%sn",buf); close(testdev);七、思考題1. 驅(qū)動程序框架中要有哪幾個部分?答:1.驅(qū)動程序與操作系統(tǒng)內(nèi)核的接口。通過file_operations(include/linux/fs.h)數(shù)據(jù)結(jié)構(gòu)來完成的。2.驅(qū)動程序與系統(tǒng)引導(dǎo)的接口。

51、這部分利用驅(qū)動程序?qū)υO(shè)備進(jìn)行初始化。3.驅(qū)動程序與設(shè)備的接口。這部分描述了驅(qū)動程序如何與設(shè)備進(jìn)行交互,與具體的設(shè)備密切相關(guān)。2. 模塊方式與直接編譯進(jìn)內(nèi)核有什么優(yōu)缺點?答:模塊方式可以即插即用,十分方便;而編譯進(jìn)內(nèi)核系統(tǒng)需重啟驅(qū)動程序才可使用不很方便實驗七 Linux 下socket網(wǎng)絡(luò)通信一.   實驗?zāi)康模?1學(xué)習(xí)在LINUX 下進(jìn)行網(wǎng)絡(luò)通信的原理。 2掌握基本的網(wǎng)絡(luò)協(xié)議。 3.能夠自己編寫網(wǎng)絡(luò)通信程序?qū)崿F(xiàn)網(wǎng)絡(luò)內(nèi)主機的通信。二.    實驗內(nèi)容:在PC 機上編寫簡單的一個網(wǎng)絡(luò)程序,實現(xiàn)局域網(wǎng)內(nèi)兩臺主機之間的通信??蛻舳讼蚍?wù)器端發(fā)送信息,服

52、務(wù)器端接受信息并顯示。三.    實驗環(huán)境:一臺已經(jīng)安裝好Linux操作系統(tǒng)的主機/或安裝過vmware的windows系統(tǒng)。四實驗原理1. 套接字相關(guān)數(shù)據(jù)結(jié)構(gòu)struct sockaddrsa_family_t sa_family;char sa_data14; 面向TCP/IP協(xié)議使用的套接字地址結(jié)構(gòu):struct sockaddr_inshort intsin_family;/*套接字域*/unsigned short int sin_port;/*端口號,網(wǎng)絡(luò)直接順序*/struct in_addr sin_addr;/*Internet 地址,網(wǎng)絡(luò)直接順 序*/unsigned charsin_zero8;/*沒用*/3. 使用TCP協(xié)議通信方式4.參考程序段:服務(wù)器端:sockfd=socket(AF_INET,SOCK_STREAM,0);my_addr.sin_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論