狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

中原工學院操作系統實驗報告

| 瀏覽次數:

 計算機操作系統實驗報告 專

 業:

 網絡工程

  班

 級:

 162 班

 學

 號:

  學生姓名:

  指導教師:

  2019/06/06 目 錄 實驗一

 進程控制

 ................................ .............................

 3 3 一、實驗目的: ............................................................ 3 二、實驗平臺: ............................................................ 4 三、實驗內容: ............................................................ 4 實驗結果 ................................................................. 5 單線程執行結果: .......................................................... 7 實驗總結 ................................................................. 8 實驗二

 進程同步

 ................................ .............................

 8 8 一、實驗目的: ............................................................ 8 二、實驗平臺: ............................................................ 8 三、實驗內容: ............................................................ 9 執行結果 ................................................................ 12 實驗總結 ................................................................ 12 實驗三

 添加內核模塊

 ................................ ........................

 12 一、實驗目的: ........................................................... 12 二、實驗平臺: ........................................................... 13 三、實驗內容: ........................................................... 13 readprocess、c 代碼: .................................................... 14 Makefile 代碼: .......................................................... 15 processinfo 文件源代碼: ................................................. 17 Makefile 文件源代碼: .................................................... 18 實驗總結 ................................................................ 20 實驗四

 統計操作系統缺頁次數

 ................................ ................

 20 實驗目的 ................................................................ 20 實驗內容 ................................................................ 21 實驗過程 ................................................................ 21 1、 修改內核源代碼,添加統計變量 ......................................... 21

 2、 配置編譯新內核 ...................................................... 23 3、 編譯內核與模塊 ...................................................... 24 4、 安裝新內核模塊與新內核 .............................................. 24 5、 編寫讀取 pfcount 值的模塊代碼 ........................................ 25 6、編譯、構建內核模塊 ................................................... 26 7、加載模塊到內核中 ..................................................... 26 實驗總結 ................................................................ 27 實驗五

 4 EXT4 文件系統結構分析

 ................................ ...............

 27 一、實驗目的: ........................................................... 27 二、實驗平臺: ........................................................... 27 三、實驗內容: ........................................................... 27 實驗總結 ................................................................ 31 實驗一 進程控制 一、實驗目的: 加深對進程概念的理解,明確進程與程序的區別;掌握 Linux 操作系統的進程創建與終止操作,體會父進程與子進程的關系及進程狀態的變化;進一步認識并發執行的實質,編寫并發程序。

 二、實驗平臺: 虛擬機:VMWare9 以上 操作系統:Ubuntu12、04 以上 編輯器:Gedit | Vim 編譯器:Gcc 三、實驗內容: (1)編寫一段程序,使用系統調用 fork()創建兩個子進程,當此程序運行時,在系統中有一個父進程與兩個子進程活動。讓每一個進程在屏幕上顯示“身份信息”:父進程顯示“Parent process! PID=xxx1 PPID=xxx2”;子進程顯示“Childx process! PID=xxx PPID=xxx”。多運行幾次,觀察記錄屏幕上的顯示結果,并分析原因。

 說明: xxx1 為進程號,用 getpid()函數可獲取進程號; xxx2 為父進程號,用 getppid()函數可獲取父進程號;

 Childx 中 x 為 1 與 2,用來區別兩個子進程; wait()函數用來避免父進程在子進程終止之前終止。

 程序源碼: #include<stdio、h> #include<unistd、h> #include<stdlib、h> #define NUM 2 int main(void) {

  pid_t pid1,pid2;

  if((pid1=fork())<0){

  printf("創建進程 1 失敗");

  }else{

 if(pid1==0){

 //子進程 1 執行

 printf("Child1

 process: ");

 printf("PID=%d

 PPID=%d \n",getpid(),getppid());

  sleep(2);

 }else{

 if((pid2=fork())<0){

 printf("創建進程 2 失敗");

  }else{

 if(pid2==0){

 //子進程 2 執行

 printf("Child2

 process: ");

 printf("PID=%d

 PPID=%d \n",getpid(),getppid());

  }

 else{

 //父進程執行

  wait();

 wait();

  printf("Parent process: ");

  printf("PID=%d

 PPID=%d \n",getpid(),getppid());

  exit(0);

 }

  }

 }

  } } 實驗結果 whtcmiss@whtcmiss-VirtualBox:~/Desktop$ gcc test1、c -o test whtcmiss@whtcmiss-VirtualBox:~/Desktop$ 、/test Child2

 process: PID=2527

 PPID=2525

 Child1

 process: PID=2526

 PPID=2525

 Parent process: PID=2525

 PPID=2127

 whtcmiss@whtcmiss-VirtualBox:~/Desktop$ 、/test Child2

 process: PID=2530

 PPID=2528

 Child1

 process: PID=2529

 PPID=2528

 Parent process: PID=2528

 PPID=2127

 whtcmiss@whtcmiss-VirtualBox:~/Desktop$ 、/test Child2

 process: PID=2533

 PPID=2531

 Child1

 process: PID=2532

 PPID=2531

 Parent process: PID=2531

 PPID=2127 實驗結果分析: 第一次程序運行結果,兩個子進程的 PPID 都就是 2525,就是由同一個進程創建。而父進程 PID 就是 2525,父進程 PPID 就是 2127,說明父進程也就是一系統進程的子進程。

 第二次程序運行結果,父進程 PID 就是 2528,PPID 就是 2127,說明父進程就是由同一進程創建的,父進程也就是以子進程的方式存在,且進程 ID 就是逐漸遞增的。

 (2)fork()與exec()系列函數能同時運行多個程序,利用上述函數將下面單進程順序執行的程序single、c改造成可并發執行3個進程的程序multi_process、c;并用time命令獲取程序的執行時間,比較單進程與多進程運行時間,并分析原因。

  //single、c #include <stdio、h>

 #define NUM 5

 int main(void)

 {

 void print_msg(char *m);

 print_msg("Good ");

 print_msg("Morning

 ");

 print_msg("2\n");

  return 0;

 }

 void print_msg(char *m)

 {

 int i;

 for(i = 0; i<NUM; i++){

 printf("%s",m);

 fflush(stdout);

 sleep(1); } } 編譯運行方法: #gcc single、c –o single #time 、/single 單線程執行結果 :

 多線程代碼: #multi_process、c #include <stdio、h> #include<unistd、h> #include<stdlib、h> #define NUM 5 int main(void)

 {

  pid_t pid[3];

  int i;

  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","2",NULL);

 }

 wait();

  wait();

  wait();

  exit(0);

  }

  }

 return 0; }

  實驗分析:第二個實驗結果,第二個程序的多線程因為就是并發執行,而且就是有三個線程,所以在時間上幾乎就是單線程的 1/3,而且因為就是并發的,所以打印結果就是無序的。

 實驗總結 本次實驗首先要明確 進程與程序的區別,我通過在 Linux 操作系統的進程創建與終止操作,運行父進程與子進程,查瞧運行結果與進程狀態的變化。實驗過程中也了解了父進程與子進程的運行過程及其機制。

 實驗二 進程同步 一、實驗目的: 掌握基本的同步算法,理解經典進程同步問題的本質;學習使用 Linux 的進程同步機制,掌握相關 API 的使用方法;能利用信號量機制,采用多種同步算法實現不會發生死鎖的哲學家進餐程序。

 二、實驗平臺: 虛擬機:VMWare9 以上 操作系統:Ubuntu12、04 以上

 編輯器:Gedit | Vim 編譯器:Gcc 三、實驗內容: (1)以哲學家進餐模型為依據,在 Linux 控制臺環境下創建 5 個進程,用 semget 函數創建一個信號量集(5 個信號量,初值為 1),模擬哲學家的思考與進餐行為:每一位哲學家饑餓時,先拿起左手筷子,再拿起右手筷子;筷子就是臨界資源,為每一支筷子定義 1 個互斥信號量;想拿到筷子需要先對信號量做 P 操作,使用完釋放筷子對信號量做 V 操作。

 偽代碼描述: semaphore chopstick[5]={1,1,1,1,1}; • 第 i 位哲學家的活動可描述為:

  do{

  printf("%d is thinking\n",i);

  printf("%d is hungry\n",i);

  wait(chopstick[i]);

  //拿左筷子

  wait(chopstick[(i+1) % 5]);

 //拿右筷子

 printf("%d is eating\n",i);

  signal(chopstick[i]);

 //放左筷子

 signal(chopstick[(i+1) % 5]);

 //放右筷子

 …

 }while[true];

 運行該組進程,觀察進程就是否能一直運行下去,若停滯則發生了什么現象?并分析原因。

 實驗結果: 源碼如下: #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> union semun {

 int val; struct semid_ds *buf; unsigned short *array; struct seminfo *_buf; }; #define ERR_EXIT(m) \ do { \ perror(m); \ exit(EXIT_FAILURE); \ } while(0) //獲取互斥信號量 void wait_mutex(int mutex) { struct sembuf sb={0,-1,0}; semop(mutex,&sb,1);//對互斥信號量進行操作 } //取得筷子 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); } //釋放互斥變量 mutex void signal_mutex(int semid0) { struct sembuf sb={0,1,0}; semop(semid0,&sb,1); } //ph 函數 void ph(int num,int semid,int semid0) { int left=num; int right=(num+1)%5; for(;;) { printf("%d is thinking\n",num); sleep(1); printf("%d is hungry\n",num);

 sleep(1); //wait 操作,控制哲學家最多 4 人能進餐 wait_mutex(semid0); wait_v(semid,left); wait_v(semid,right); printf("%d is eating\n",num); sleep(1); //signal 操作 signal_p(semid,right);//釋放右筷子 signal_p(semid,left);//釋放左快子 signal_mutex(semid0);//釋放互斥信號量 } } int main(int argc,char *argv[]) { int semid,semid0; //創建兩個信號量集 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;i<5;i++) { //semctl()系統調用在一個信號量集(或集合中的單個信號量)上執行各種控制操作 semctl(semid,i,SETVAL,su); } //設定 semid0 信號量的初始值 union semun su0; su0、val=4; semctl(semid0,0,SETVAL,su0); //創建 4 個子進程 int num=0; pid_t pid; for(i=1;i<5;i++) { pid=fork(); if(pid<0) {ERR_EXIT("fork");} if(pid==0) {num=i;break;} } //第 num 個哲學家要做的事 ph(num,semid,semid0); return 0;

 } 執行結果

 實驗總結

  哲學家進餐的問題就是操作系統信號量同步的經典例題了。這次我通過解決哲學家進餐的哲學問題從而對進程同步有一個更好的理解,解決這個問題書中給出了三種解決方法。我在實驗中也就是用這三種方法去定義信號量解決死鎖問題。通過信號量的獲取與 wait 操作去控制進餐就是通過互斥信號量的獲取,若沒有信號量便不能執行,而且只有四個哲學家能同時進餐也避免了死鎖的出現。

 實驗三 添加內核模塊 一、實驗目的: 學習 Linux 模塊的基本概念與原理,學習內核模塊編程的基本技術,利用內核模塊編程訪問進程描述符,操作內核的基本數據結構,加深對進程的理解;理解 proc 文件系統的作用,學習proc 文件的創建方法,掌握這種用戶態與核心態通信的方法。

 二、實驗平臺: 虛擬機:VMWare9 操作系統:Ubuntu12、04 編輯器:Gedit | Vi 三、實驗內容: (1)閱讀內核模塊實例 hello、c,掌握內核模塊的主要構成;閱讀 Makefile 文件,理解內核模塊的編譯方法及執行過程;掌握模塊安裝、卸載,以及查瞧模塊信息的方法。

 將 hello、o 與 Makefile 文件放在一個文件夾 workspace 中,使用 make 命令使其生成了 hello、ko 等文件,如圖:

 使用命令載入模塊,如圖:

 使用命令顯示載入系統的模塊,如圖:

 使用 dmesg 命令查瞧系統的內核模塊信息如圖:

  使用 sudo rmmod hello 命令卸載該模塊:

 (2)設計一個模塊,功能就是列出系統中所有內核進程的程序名、PID 號與進程狀態。主要步驟: 閱讀內核源代碼,了解進程描述符 task_struct 中與本實驗有關的成員項,以及訪問進程隊列的宏 for_each_process; 編寫 readprocess 模塊,獲取進程信息; 修改 Makefile 文件,編譯、安裝模塊,查瞧輸出信息; 查瞧模塊信息,卸載模塊。

 源代碼如下: readprocess 、c 代碼: #include<linux/init、h>

 #include<linux/module、h>

 #include<linux/sched、h>

 #include<linux/list、h>

  MODULE_LICENSE("GPL");

 static int mod_init_readprocess(void);

 static void mod_exit_readprocess(void); module_init(mod_init_readprocess);

 module_exit(mod_exit_readprocess);

 int mod_init_readprocess(void)

 {

  printk(KERN_INFO"-------start-------\n");

 struct task_struct *p;

  printk("display moudleinfo is :\n");

  for_each_process(p)

  {

 printk("NAME:%s\t\t PID:%d\t\t STATE:%ld\t\t\n",p->comm,p->pid,p->state);

 }

  return 0;

 }

 void mod_exit_readprocess(void)

 {

 printk(KERN_INFO"--------end--------\n");

 } Makefile 代碼: ifneq ($(KERNELRELEASE),)

 obj-m:=readprocess、o else

 KDIR:= /lib/modules/$(shell uname -r)/build

 PWD:= $(shell pwd) default:

 $(MAKE) -C $(KDIR) M=$(PWD) modules clean:

 $(MAKE) -C $(KDIR) M=$(PWD) clean Endif 將 process、c 與 Makefile 文件放在同一個文件夾下使用 make 函數生成后綴為、ko 文件:

  使用命令載入模塊,如圖:

 使用 lsmod 命令顯示載入系統的模塊,如圖:

 使用 dmesg 命令查瞧到系統的內核模塊信息 ,如圖:

  使用 sudo rrmod hello 命令卸載該模塊,如圖:

 (3)利用內核模塊編程,在/proc 目錄下用自己的學號創建一個目錄,如/proc/2 然后在學號目錄下創建一個processinfo文件,如/proc/2/processinfo,此文件為只讀文件,用于顯示所有內核進程的程序名、PID 號與進程狀態。主要步驟: 修改(2)中 readprocess 模塊,在模塊初始化函數中創建目錄及 proc 文件,并定義產生 proc文件內容的函數(獲取進程信息);在卸載模塊函數中刪除相應的 proc 文件及目錄; 修改 Makefile 文件,編譯、安裝模塊; 執行 cat /proc/2/processinfo 命令,查瞧進程信息。

 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"); 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_file; int processinfo_read_procmem(char *page,char **start,off_t offset,int count,int *eof,void *data); int mod_init_readprocess(void)

 {

 printk(KERN_INFO"-------Let"s Go-------\n");

 feeyu_dir=proc_mkdir("2",NULL);

 processinfo_("processinfo",0,cg_dir,processinfo_read_procmem, NULL );

 return 0; } void mod_exit_readprocess(void) {

 remove_proc_entry("processinfo",cg_dir);

 remove_proc_entry("2",NULL);

 printk(KERN_INFO"--------Thank You--------\n"); } 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");

 for_each_process(p)

 {

  len+=sprintf(page+len,"NAME:%sPID:%dSTATE:%ld\n",p->comm,p->pid,p->state);

 }

 return len;

  } Makefile 文件源代碼: ifneq ($(KERNELRELEASE),)

 obj-m:=processinfo、o else

 KDIR:= /lib/modules/$(shell uname -r)/build

 PWD:= $(shell pwd) default:

 $(MAKE) -C $(KDIR) M=$(PWD) modules clean:

 $(MAKE) -C $(KDIR) M=$(PWD) clean Endif 加載模塊:

 查瞧模塊就是否存在:

 查瞧模塊信息:

 查瞧進程信息:

 卸載模塊后

  實驗總結 這次實驗內容較多,重要就是通過一些命令與代碼對內核模塊的進程進行操作。使用命令對系統內核模塊進行操作,通過 processinfo 文件與 makefile 文件對內核中的進程進行讀寫等操作。實驗很繁雜。但思路清晰后也能較完整的把整個實驗做下來。通過這次實驗,我對內核模塊的操作及內核的一些進程上的操作有的一定的了解。

 實驗四 統計操作系統缺頁次數 實驗目的 學習虛擬內存的基本原理與 Linux 虛擬內存管理技術; 深入理解、掌握 Linux 的按需調頁過程; 掌握內核模塊的概念與操作方法,與向/proc 文件系統中增加文件的方法; 綜合運用內存管理、系統調用、proc 文件系統、內核編譯的知識。

 實驗內容 1 1 、原理

 Linux的虛擬內存技術采用按需調頁,當CPU請求一個不在內存中的頁面時,會發生缺頁,缺頁被定義為一種異常(缺頁異常),會觸發缺頁中斷處理流程。每種 CPU 結構都提供一個do_page_fault 處理缺頁中斷。由于每發生一次缺頁都要進入缺頁中斷服務函數do_page_fault 一次,所以可以認為執行該函數的次數就就是系統發生缺頁的次數。因此可以定義一個全局變量 pfcount 作為計數變量,在執行 do_page_fault 時,該變量值加 1。本實驗通過動態加載模塊的方法,利用/proc 文件系統作為中介來獲取該值。

 2 2 、實驗環境

 操作系統:Ubuntu 12、04(內核版本為 3、2、0-23-generic-pae) 內核源碼:linux-3、2、58

 實驗過程 1. 下載一份內核源代碼并解壓

 Linux 受 GNU 通用公共許可證(GPL)保護,其內核源代碼就是完全開放的。現在很多 Linux的網站都提供內核代碼的下載。推薦使用 Linux 的官方網站:、kernel、org。

 在 terminal 下可以通過 wget 命令下載源代碼: $ cd /tmp $ wget 、kernel、org/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 /usr/src 2 、 修改內核源代碼, , 添加統計變量 1、切換到預編譯內核目錄 #cd /usr/src/linux-3、2、58 2、修改處理內存訪問異常的代碼 //用 vi 編輯器打開 fault、c,一般使用 Intel x86 體系結構,則修改 arch/x86/目錄下的文件 #vi arch/x86/mm/fault、c #cd arch/x86/mm #sudo gedit fault、c

 //在 do_page_fault 函數的上一行定義統計缺頁次數的全局變量 pfcount unsigned long volatile pfcount; //將 pfcount 加入到 do_page_fault 中,用以統計缺頁次數

 pfcount++; 3、修改內存管理代碼 //用 vi 編輯器打開頭文件 mm、h

 #vi include/linux/mm、h //在 mm、h 中加入全局變量 pfcount 的聲明,代碼加在 extern int page_cluster;語句之后 extern unsigned long volatile pfcount; 4、導出 pfcount 全局變量,讓整個內核(包括模塊)都可以訪問。方法就是: #cd kernel #sudo gedit kallsyms、c //在文件最后加入一行代碼 EXPORT_SYMBOL(pfcount);

 3. 配置編譯新內核 用編譯 Linux 內核預備實驗中的方法完成新內核的配置、編譯、替換,重啟后驗證就是否完成替換。

 在編譯內核前,一般來說都需要對內核進行相應的配置。配置就是精確控制新內核功能的機會。配置過程也控制哪些需編譯到內核的二進制映像中(在啟動時被載入),哪些就是需要時才裝入的內核模塊(module)。

 首先進入內核源代碼目錄: # cd

 /usr/src/linux-3、2、58 如果不就是第一次編譯的話,有必要將內核源代碼樹置于一種完整與一致的狀態。因此,推薦執行命令 make mrproper。它將清除目錄下所有配置文件與先前生成核心時產生的、o 文件: #make mrproper

 (如果就是第一次可跳過此步) 然后配置編譯選項(此處使用原內核的配置文件,完整的配置命令瞧操作提示): # cp /boot/config-3、2、0-20-generic-pae

 、config 該命令的作用就是將原內核配置文件拷貝的當前目錄下,并命名為、config。若需要進一步修改配置請參照操作提示。

 在編譯前用#uname -r 查瞧原來的版本

 4 、 編譯內核與模塊 編譯內核,就用: #make 編譯內核需要較長的時間,具體與機器的硬件條件及內核的配置等因素有關(采用 VMWare 虛擬機,需要約 60 分鐘)。完成后產生的內核文件 bzImage 的位置在/usr/src/linux/arch/i386/boot目錄下,當然這里假設用戶的 CPU 就是 Intel x86 型的,并且您將內核源代碼放在/usr/src/linux目錄下。

 如果選擇了可加載模塊,編譯完內核后,要對選擇的模塊進行編譯,可用: #make modules 5. 安裝新內核模塊與新內核 首先,用下面的命令將新內核模塊安裝到系統的標準模塊目錄中: #make modules_install

  此處有改動選擇了取消

 然后,用下面的命令將新內核安裝到系統中:

 # make install

 通常,Linux 在系統引導后從/boot 目錄下讀取內核映像到內存中。因此如果想要使用自己編譯的內核,就必須用 make install 命令將啟動文件(內核映像)安裝到/boot 目錄下。

 6 、 編寫讀取 pfcount 值的模塊代碼 系統重啟后,執行如下操作: #mkdir source

 //在當前用戶目錄下創建 source 文件夾,用于存放編寫的用戶程序 #cd source

  //切換到 source 目錄 #vi pf、c

  //新建用于構建模塊的代碼 -------------------------------------------- /*pf、c*/

 /*modules program*/

 #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> 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(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 編譯、構建內核模塊 #vi Makefile

 //在 source 目錄下建立 Makefile 文件 在 Makefile 中添加如下內容: obj-m := pf、o ifneq ($(KERNELRELEASE),)

 obj-m:=pf、o

 else

 KDIR:= /lib/modules/$(shell uname -r)/build

 PWD:= $(shell pwd) default:

 $(MAKE) -C $(KDIR) M=$(PWD) modules clean:

 $(MAKE) -C $(KDIR) M=$(PWD) clean endif 8 加載模塊到內核中 執行加載模塊命令: #insmod pf、ko 查瞧統計缺頁次數: #cat /proc/pf/pfcount

 實驗 總結

 實驗中的更換 linux 內核的實驗我開始沒做出來,后來請教同學才明白過來,但內核更換確實需要多多的練習與學習。內核實驗中也學到了一些關于內核的知識,重要的還就是自己要多多的練習,達到自己能獨立完成內核更換的實驗。

 實驗五 EXT4 文件系統結構分析 一、實驗目的: 掌握文件系統的工作機理;理解文件系統的主要數據結構;學習較為復雜的 Linux 下的編程;了解 EXT4 文件系統的結構。

 二、實驗平臺: 虛擬機:VMWare9 操作系統:Ubuntu12、04 文件系統:EXT4 編輯器:Gedit | Vi

 三、實驗內容: (1)該實驗要求編寫程序,完成以下功能(注意保存截圖): 1、查瞧主硬盤設備名、掛載目錄及文件系統信息

 2、程序編譯 進入 check_ext4fs 目錄,輸入 make clean; make 編譯程序,生成 check_ext4fs 程序:

 獲取 ext4 文件系統超級塊,并顯示超級塊數據結構 ext4_super_block 的字段信息;

 獲取塊組描述符表,并能根據輸入的塊組號顯示該塊組描述符ext4_group_desc的字段信息;

  先獲取組塊描述表

 info groups [1, 33]

 獲取索引節點表,并能根據輸入的索引節點號(比如根目錄文件的索引節點號就是 2),顯示其索引節點數據結構 ext4_inode 的字段信息。

 (2)分析上述實驗代碼,回答下列問題: 大小(單位用字節):邏輯塊、超級塊 ext4_super_block、組描述符 ext4_group_desc、索引

 節點 ext4_inode; 邏輯塊大小 4096 、超級塊大小

 、組描述符 ext4_group_desc 大小 512 塊、索引節點大小 256 字節 個數及位置:塊組 0 中組描述符占用的塊數 708 及所占塊號 1057-1568、inode 個數及inode 表占用的塊數 1057、塊位圖 block bitmap 占用塊數 1025 及所在塊號 1025、索引節點位圖 inode bitmap 占用塊數 1041 及所在塊號 1041; 驗證:執行 sudo dumpe2fs /dev/sda1 | more 命令,驗證上述分析就是否正確。

  實驗總結

 這次實驗中,我了解了文件系統的基本工作原理,也明白了文件系統的主要數據結構,了解了 EXT4 文件系統的結構。實驗過程中也出現過一些錯誤,在最后的數據驗證部分,有一部分文件沒有找到相對應的數據。經同學的指點,最終還就是完成了整個實驗。

推薦訪問: 中原 工學院 操作系統

【中原工學院操作系統實驗報告】相關推薦

工作總結最新推薦

NEW