版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、. .實驗1.1、1.2 Linux Ubuntu的安裝、創(chuàng)立新的虛擬機VMWare實驗1.3 Shell編程1.實驗目的與內容通過本實驗,了解Linux系統(tǒng)的shell機制,掌握簡單的shell編程技巧。編制簡單的Shell程序,該程序在用戶登錄時自動執(zhí)行,顯示某些提示信息,如“Wele to Linux, 并在命令提示符中包含當前時間、當前目錄和當前用戶名等根本信息。2.程序源代碼清單#include<stdio.h>#include<sys/wait.h> int main()printf("Hello Linuxn");int pid;int
2、 state;int pfd2;pipe(pfd);if (fork()=0)printf("In the grep progressn");dup2(pfd0,0);close(pfd0);close(pfd1);execlp("grep","grep","sh",0);perror("exelp grep error");esle if(fork()=0) printf("In the ps progressn");dup2(pfd1,1);close(pfd0);clo
3、se(pfd1);execlp("ps","ps","-ef",0);perror("execlp ps -ef");close(pfd1);close(pfd0);wait(&state);wait(&state);實驗2.3 內核模塊實驗步驟:(1).編寫內核模塊 文件中主要包含init_clock(),exit_clock(),read_clock()三個函數。其 中init_clock(),exit_clock()負責將模塊從系統(tǒng)中加載或卸載,以及增加或刪除模塊在/proc中的入口。read
4、_clock()負責產生/proc/clock被讀時的動作。(2).編譯內核模塊Makefile文件# Makefile under 2.6.25 ifneq ($(KERNELRELEASE),) #kbuild syntax. dependency relationshsip of files and target modules are listed here. obj-m := proc_clock.o else PWD := $(shell pwd) KVER ?= $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all: $
5、(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf .* d *.o *.mod.c *.ko .tmp_versions *.symvers *.order endif 編譯完成之后生成proc_clock.ko模塊文件。(3).內核模塊源代碼clock.c#include <linux/kernel.h> #include <linux/module.h> #include <linux/proc_fs.h> #include <linux/string.h> #include <linux
6、/vmalloc.h> #include <asm/uaccess.h> #define MODULE #define MODULE_VERSION "1.0" #define MODULE_NAME "clock" struct proc_dir_entry* my_clock; int read_clock(char* page, char* start, off_t off, int count, int* eof, void* data) int len; struct timeval xtime; do_gettimeofda
7、y(&xtime); len = sprintf(page, "%d %dn", xtime.tv_sec, xtime.tv_usec); printk("clock: read_func()n"); return len; struct proc_dir_entry *clock_proc_file; int init_clock(void) clock_proc_file =create_proc_read_entry("clock",0,NULL,read_clock,NULL); return 0; void exi
8、t_clock(void) remove_proc_entry("clock",clock_proc_file); module_init(init_clock) module_exit(exit_clock) MODULE_LICENSE("GPL");(4).編譯內核模塊# make (5) .加載內核模塊 在系統(tǒng)root用戶下運行用戶態(tài)模塊命令裝載內核模塊 # insmod proc_clock.ko(6).測試在終端中輸入以下命令: cat /proc/clock (7).卸載內核模塊在系統(tǒng)root用戶下運行用戶態(tài)模塊命令卸載內核模塊#rmmod
9、 proc_clock.ko 實驗2.4 系統(tǒng)調用實驗步驟:(1). 添加新調用的源代碼 在./linux-2.6.33.7/arch/x86/kernel/sys_i386_32.c中添加相應的調用代碼asmlinkage int sys_xwlcall(struct timeval *tv) struct timeval ktv; do_gettimeofday(&ktv); copy_to_user(tv,&ktv,sizeof(ktv); printk(KERN_ALERT"PID %ld called sys_xwlcall()./n",(long
10、)current->pid); return 0; (2). 連接系統(tǒng)調用 a、修改./linux-2.6.33.7/arch/x86/include/asm/unistd_32.h,在系統(tǒng)調用列表后面相應位置添加一行,這樣在用戶空間做系統(tǒng)調用時就不需要知道系統(tǒng)調用號了,如果在用戶空間指明了調用號,就可以省略這一步,實際上我就沒寫:#define _NR_xwlcall338 新增加的調用號位338 b、修改./linux-2.6.33.7/arch/x86/kernel/syscall_table_32.S 在ENTRY(sys_call_table)清單最后添加一行,這步至關重要,3
11、38就是這里來的: .long sys_xwlcall (3). 重建新的Linux內核先安裝好編譯內核必要的軟件包:# sudo apt-get install build-essential kernel-package libncurses5-dev 復制當前內核的配置文件 # cp /boot/config-uname -r ./.config 保存配置文件# sudo make menuconfig 使用debian的的內核編譯方法,要簡單很多# sudo make-kpkg-initrd-initrd-append-to-version=xwlcallkernel_image ke
12、rnel-headers 運行以下deb包,安裝內核鏡像和模塊:linux-image-2.6.33.7xwlcall_2.6.33.7xwlcall-10.00.Custom_i386.deb運行以下deb包,安裝內核頭文件:linux-headers-2.6.33.7xwlcall_2.6.33.7xwlcall-10.00.Custom_i386.deb 運行以下命令,使內核啟動時能調用模塊,比方硬件驅動:# sudo update-initramfs -c -k 2.6.33.7xwlcall此次編譯的內核采用ubuntu默認配置文件,通用性非常好,可以拷貝到大局部x86機器上安裝。安
13、裝后系統(tǒng)自動會修改grub啟動選單。4. 重建引導信息 a、安裝deb包就自動重建引導信息了,無須另行處理。 b、如果仍然不放心,可以運行# update-grub5. 重新引導從新的內核進入6. 修改系統(tǒng)調用表 7. 測試實驗3.3 Shell編程實驗進程管理實驗1、實驗目的通過編寫shell程序,了解子進程的創(chuàng)立和父進程與子進程間的協(xié)同,獲得多進程程序的編程經歷。2、實驗內容1設計一個簡單的shell解釋程序,能實現(xiàn)根本的bsh功能。3、實驗原理 將每一條命令分子段壓入argv棧。然后再子進程中調用execvp()來實現(xiàn)該命令的功能。4、代碼源代碼清單#include <stdio.
14、h> #include <string.h> #include <stdlib.h> #define BUFFERSIZE 256 /最簡單的shell,只是簡單的執(zhí)行命令調用,沒有任何的其他功能 int main() char bufBUFFERSIZE,*cmd,*argv100; char inchar; int n,sv,buflength; int result; buflength = 0;for(;) printf("=> "); /處理過長的命令; inchar = getchar();/讀取命令 while (incha
15、r != 'n' && buflength < BUFFERSIZE ) bufbuflength+ = inchar; inchar = getchar(); if (buflength > BUFFERSIZE) printf("mand too long,please enter again!n"); buflength = 0; continue; else bufbuflength = '0' /解析命令行,分成一個個的標記 /char *strtok(char *s,char *delim) /分解字符
16、串為一組字符串。s為要分解的字符串,delim為分隔符字符串。 cmd=strtok(buf," tn"); if(cmd) if(strcmp(cmd,"exit")=0) exit(0); n=0; argvn+=cmd; while(argvn+=strtok(NULL," tn"); if(fork()=0) execvp(cmd,argv); fprintf(stderr,"sxh:%s:mand not found.n",buf);/如果子進程順利執(zhí)行,這段話是不會執(zhí)行的 exit(1); wait(&
17、amp;sv); buflength = 0; 實驗內容2編寫一個帶有重定向和管道功能的Shell1.設計思路通過fork創(chuàng)立子進程,用execvp更改子進程代碼,用wait等待子進程完畢。這三個系統(tǒng)調用可以很好地創(chuàng)立多進程。另一方面,編寫的Shell要實現(xiàn)管道功能,需要用pipe創(chuàng)立管道使子進程進展通信。2.源代碼清單#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ftl.h> #define BUFFERSIZE256 /具有輸入輸出重定向的功能 和管道
18、功能 int main() char buf256,*buf2,*cmd,*cmd2,*argv64,*argv264,*infile,*outfile; char inchar; int n,sv,buflength,fd2; for(;) buflength = 0; printf("=> "); inchar = getchar(); while (inchar != 'n' && buflength < BUFFERSIZE ) bufbuflength+ = inchar; inchar = getchar(); if
19、(buflength > BUFFERSIZE) fprintf(stderr,"mand too long,please enter again!n"); buflength = 0; continue; else bufbuflength = '0' /檢查是否具有管道操作符 /strstr()在字符串中查找指定字符串的第一次出現(xiàn),buf2指向管道符號前端的命令 buf2=strstr(buf,"|"); if(buf2) *buf2+='0' else /否那么查看是否具有重定向的操作符 infile=strs
20、tr(buf,"<"); outfile=strstr(buf,">"); if(infile) *infile='0' infile=strtok(infile+1," tn"); if(outfile) *outfile='0' outfile=strtok(outfile+1," tn"); /解析命令行,分成一個個的標記 cmd=strtok(buf," tn"); /執(zhí)行管道命令 if(buf2) if(strcmp(cmd,"ex
21、it")=0) exit(0); if(!cmd) fprintf(stderr,"mand token error.n"); exit(1); n=0; /管道后端的命令 argvn+=cmd; while(argvn+=strtok(NULL," tn"); /管道前端的命令 cmd2=strtok(buf2," tn"); if(!cmd2) fprintf(stderr,"mand token error.n"); exit(1); n=0; argv2n+=cmd2; while(argv2n+
22、=strtok(NULL," tn"); pipe(fd); if(fork()=0) dup2(fd0,0); /dup2 復制文件句柄,將fd0復制到描述符0。close(fd0); close(fd1); execvp(cmd2,argv2); fprintf(stderr,"* bad mandn"); exit(1); else if(fork()=0) dup2(fd1,1); close(fd0);close(fd1); execvp(cmd,argv); fprintf(stderr,"* bad mandn"); e
23、xit(1); close(fd0); close(fd1); wait(&sv); wait(&sv); buflength = 0; /如果沒有管道命令,如果有重定向就執(zhí)行重定向操作,如果沒有重定向就當作普通shell命令執(zhí)行 else if(cmd) if(strcmp(cmd,"exit")=0) exit(0); n=0; argvn+=cmd; while(argvn+=strtok(NULL," tn"); if(fork()=0) int fd0=-1,fd1=-1; if(infile) fd0=open(infile,
24、O_RDONLY); if(outfile) fd1=open(outfile,O_CREAT|O_WRONLY,0666); if(fd0!=-1) dup2(fd0,0);/dup2 復制文件句柄,將fd0復制到描述符0。 if(fd1!=-1) dup2(fd1,1);/dup2 復制文件句柄,將fd1復制到描述符1。 close(fd0); close(fd1); execvp(cmd,argv); fprintf(stderr,"* Bad mandn"); exit(1); wait(&sv); buflength = 0; /for 實驗4.1 觀察實
25、驗(存儲管理實驗)1.實驗步驟 (1)、安裝GDB (2)、編寫觀測程序(3)、按照指令手冊進展觀察操作2.觀測程序源代碼#include<stdio.h> #include<stdlib.h> char str50 = "Hello Linux." int main() int num = 10; while(num-) printf("%sn",str); /gcc -g -o testing testing.c3.實驗結果及分析(1).Gdb程序觀察一個程序文件的內容和構造結果截圖:(2).GDB觀察程序內存映象的內容和構造
26、(3).在Linux下,用free 和vmstat命令觀察內存使用情況(4).在Linux下,查看/proc與內存管理相關的文件,并解釋顯示結果實驗5.1 觀察實驗進程通信在Linux下,用ipcs()命令觀察進程通信情況,了解Linux根本通信機制實驗結果截圖:實驗6.3 IO系統(tǒng)編程實驗1、實驗目的編寫一個daemon進程,該進程定時執(zhí)行 ps命令,然后將該命令的輸出寫至文件F1尾部。通過此實驗,掌握Linux I/O系統(tǒng)相關內容。2、實驗內容編寫一個daemon進程,該進程定時執(zhí)行 ps命令,然后將該命令的輸出寫至文件F1尾部。3、實驗原理在這個程序中,首先fork一個子程序,然后,關閉
27、父進程,這樣,新生成的子進程被交給init進程接收,并在后臺執(zhí)行。新生成的子進程里,使用system系統(tǒng)調用,將ps的輸出重定向,輸入到f1.txt里面。4、實驗步驟編寫daemon.c代碼如下:#include<stdio.h> #include<stdlib.h> int main(int argc,char* argv) int i,p; p = fork(); if(p > 0) exit(0); else if(p = 0) for(i = 0; i < 100; i+) sleep(100); system("ps > f1.tx
28、t"); else perror("Create new process!"); return 1; 編譯程序# gcc -o daemon daemon.c執(zhí)行程序 # ./daemon實驗7.1 代碼分析(文件系統(tǒng)管理實驗)1.實驗目的了解與文件管理有關的Linux內核模塊的代碼構造。2.實驗結果源代碼分析A. 創(chuàng)立文件模塊分析5780 /*creat system call */ 5781 Creat() 5782 5783 resister *ip; 5784 extern uchar; 5785 5786 ip = namei(&uchar,1)
29、; 5787 if(ip = NULL) 5788 if(u.u_error) 5789 return; 5790 ip = maknode(u.u_arg1&07777&(ISVTX); 5791 if (ip = NULL) 5792 return; 5793 open1(ip,FWRITE,2); 5794 else 5795 open1(ip,FWRITE,1); 5796 第 5786:“namei( 7 5 1 8 )將一路徑名變換成一個“inode指針。“uchar是一個過程的名字,它從用戶程序數據區(qū)一個字符一個字符地取得文件路徑名。 5787:一個空“inode
30、指針表示出了一個錯,或者并沒有具有給定路徑名的文件存在。 5788:對于出錯的各種條件,請見 UMP 的 CREAT(II)。 5790:“maknode( 7455)調用“ialloc創(chuàng)立一內存“ inode,然后對其賦初值,并使其進入適當的目錄。注意,顯式地去除了“粘住位( ISVTX)。 B. 刪除文件 rm 模塊分析3510 unlink() 3511 3512 resister *ip,*pp;3513 extern uchar; 3514 3515 pp = namei(&uchar,2); 3516 if (pp =NULL) 3517 return; 3518 prel
31、e(pp); 3519 ip = iset(pp ->dev,u.u_dent.u_ino); 3520 if (ip = NULL) 3521 panic (*unlink iset *); 3522 if (ip ->i_mode%IFMT) = IFDIR && !suser() 3523 goto out; 3524 u.u_offset1 = - DIRSIZ+2; 3525 u.ubase = &u.u_dent; 3526 u.ucount = DIRSIZE +2; 3527 u.u_dent.u_ino = 0; 3528 writei(p
32、p); 3529 ip ->i_nlink-; 3530 ip->i_flag =! IUPD; 3531 3532 out: 3533 iput(pp); 3534 iput(ip); 3535 新文件作為永久文件自動進入文件目錄。關閉文件不會自動地造成文件被刪除。當內存“ inode項中的“ i _ nlink字段值為 0 并且相應文件未被翻開時,將刪除該文件。在創(chuàng)立文件時,該字段由“ maknode賦初值為 1。系統(tǒng)調用“ link( 5941 )可將其值加1,系統(tǒng)調用“unlink( 3529 )那么可將其值減 1。創(chuàng)立臨時“工作文件的程序應當在其終止前執(zhí)行“ unlink
33、系統(tǒng)調用將這些文件刪除。 注意,“unlink系統(tǒng)調用本身并沒有刪除文件。當引用計數( i _ count )被減為 0 時(7350、7362),才刪除該文件。 為了減少在程序或系統(tǒng)崩潰時遺留下來的臨時文件所帶來的問題,程序員應當遵守以下約定: (1) 在翻開臨時文件后立即對其執(zhí)行“ unlink操作。 (2) 應在“tmp目錄下創(chuàng)立臨時文件。在文件名中包括進程標識數就可構成一惟一文件名 C. 讀寫模塊分析5711 Read( ) 5712 5713 rdwr(FREAD); 5714 5720 Write( )5721 5722 rdwr(FWRITE); 5723 5731 rdwr(m
34、ode) 5732 5733 resister *fp,m; 5734 5735 m = mode; 5736 fp = setf(u.u_argR0); 5737 if (fp =NILL) 5738 return; 5739 if (fp ->f_flag&m =0) 5740 u.u_error = EBADF; 5741 return; 5742 5743 u.u_base = u.u_arg0; 5744 u.u_count = u.u_arg1; 5745 u.u_segflg = 0; 5746 if(fp ->f_flag&FPIPE) 5747 i
35、f(m = FREAD) 5748 readp(fp);else 5749 writep(fp); 5750 else 5751 u.u_offset1 = fp ->f_offset1; 5752 u.u_offset0 = fp ->f_offset0; 5753 if (m = FREAD) 5754 readi(fp ->f_inode);else 5755 writei(fp ->f_inode); 5756 dpadd(fp ->f_offset,u.u_arg1 u.u_count; 5757 5758 u.u_ar0R0 = u.u_arg1 u.u_count; 5759 “read系統(tǒng)調用的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 維生素c課程設計
- 蓋板零件課程設計
- 保險行業(yè)會計職責總結
- 海底動物創(chuàng)意課程設計
- 咨詢行業(yè)的營銷工作總結
- 火葬場衛(wèi)生整治工作總結
- 2024年西雙版納職業(yè)技術學院單招職業(yè)適應性測試題庫含答案
- 水務領域數字經濟發(fā)展的研究計劃
- 2024年認識圖形二教案
- 2024年秋天的信教案模板
- 《紅色家書》讀書分享會主題班會課件
- 2025年廣東省春季高考數學仿真模擬試卷試題(含答案解析+答題卡)
- 新媒體運營工作年終總結
- 【MOOC】電子技術-北京科技大學 中國大學慕課MOOC答案
- 米酒釀造工藝
- 點式高層住宅工程施工組織設計
- 0-3歲嬰幼兒心理發(fā)展知到智慧樹期末考試答案題庫2024年秋杭州師范大學
- 2024年1月福建省普通高中學業(yè)水平合格性考試化學試題(解析版)
- 齊白石介紹課件
- 窺見中華文明之光- 高中語文統(tǒng)編版(2022)必修下冊第一單元整體教學設計
- 2024年安徽省公務員錄用考試《行測》真題及解析
評論
0/150
提交評論