1. 程式人生 > 其它 >20191305李天琦七、八章學習筆記

20191305李天琦七、八章學習筆記

20191305李天琦七、八章學習筆記

第七章 檔案操作

摘要:本章討論了多種檔案系統;解釋了作業系統中的各種操作級別,包括為檔案儲存準備儲存裝置、核心中的檔案系統支援函式、系統呼叫、檔案流上的I/0庫函式、使用者命令和各種操作的sh指令碼;系統性概述了各種操作,包括使用者空間的檔案流讀/寫到核心空間的系統呼叫,直到底層的裝置I/O驅動程式級別;描述了低級別的檔案操作,包括磁碟分割槽、顯示分割槽表的示例程式、檔案系統的格式化分割槽以及掛載磁碟分割槽;介紹了 Linux系統的EXT2檔案系統,包括EXT2檔案系統的系統資料結構、顯示超級塊、組描述符、塊和索引節點點陣圖以及目錄內容的示例程式。程式設計專案將本章中討論的EXT2/3檔案系統和程式設計技術集中到一個程式中,將路徑名轉換為索引節點並列印它們的資訊。

7.1檔案操作級別

(1)硬體級別:硬體級別的檔案操作包括:

Fdisk:將磁碟、U盤或SDC盤分割槽。

mkfs:格式化磁碟分割槽,為系統做好準備。

fsck:檢查和維修系統。

碎片整理:壓縮檔案系統中的檔案。

(2)作業系統核心中的檔案系統函式:

每個作業系統核心均可為基本檔案操作提供支援。

(3)系統呼叫

使用者模式程式使用系統呼叫來訪問核心函式

open()、read()、lseek()和close()函式都是c語言庫函式,每個庫函式都會發出一個系統呼叫,使程序進入核心模式來執行相應的核心函式,例如open可以進入kopen(),read可進入kread()函式等。

(4)I/O庫函式

系統呼叫可讓使用者讀/寫多個數據塊,這些資料塊只是一系列位元組。使用者通常需要讀/寫單獨的字元、行或資料結構記錄等。如果只有系統呼叫,使用者模式程式則必須自己從緩衝區執行這些操作。大多數使用者會認為這非常不方便。為此,C語言庫提供了一系列標準的I0函式,同時也提高了執行效率。

I/O庫函式包括:

FILE mode I/O:fopen(),fread();fwrite(),fseek(),fclose(),fflush()

char mode I/O:getc(),getchar() ugetc();putc(),putchar()

line mode I/O:gets(),fgets();puts(),fputs()

formatted I/O:scanf(),fscanf(),scanf();printf(),fprintf(),sprintf()除了讀/寫記憶體位置的sscanf()/sprintf()函式之外,所有其他I/O庫函式都建立在系統呼叫之上,它們會最終通過系統核心發出實際資料傳輸的系統呼叫。

(5)使用者命令

使用者可以使用Unix/Linux命令來執行檔案操作,而不是編寫程式。

(6)sh指令碼

必須要手動輸入命令。sh指令碼是用sh程式語言編寫的程式,可通過命令解釋程式sh來執行。sh語言包含所有的有效Unix/Linux命令,它還支援變數和控制語句,如if、do、for、while、case等。

7.2檔案I/O操作

(1)使用者模式下的程式執行操作

FILE *fp = fopen(“file”,”r”);or FILE *fp = fopen(“file”,”w”);可以開啟一個讀/寫檔案流。

(2)fopen()在使用者(heap)空間中建立一個FILE結構體,包含一個檔案描述符fd、一個fbuf[BLKSIZE]和一些控制變數。

(3)fread(ubuf,size,nitem,fp):將nitem個size位元組讀取到ubuf上。

(4)核心中的檔案系統函式

假設非特殊檔案的read(fd,fbuf[],BLKSIZE)系統呼叫。

(5)在read()系統呼叫中,fd是一個開啟的檔案描述符,它是執行程序的fd陣列中的一個索引,指向一個表示開啟檔案的OpenTable。

(6)OpenTable包含檔案的開啟模式、一個指向記憶體中檔案INODE的指標和讀/寫檔案的當前位元組偏移量。

(7)裝置I/O:

I/O緩衝區上的物理I/O最終會仔細檢查裝置驅動程式,裝置驅動程式由上半部分的start_io()和下半部分的磁碟中斷處理程式組成。

7.3低級別檔案操作

(1)分割槽

一個塊儲存裝置,如硬碟、U盤、SD卡等,可以分為幾個邏輯單元,稱為分割槽。各分割槽均可以格式化為特定的檔案系統,也可以安裝在不同的作業系統上。大多數載入程式,如GRUB\LILO等,都可以配置為從不同的分割槽引導不同的作業系統。分割槽表位於第一個扇區的位元組偏移446(0xLBE)處,該扇區稱為裝置的主引導記錄(MBR)。表有4個條目,每個條目由一個16位元組的分割槽結構體定義。

struct partition {

u8 drive;

u8 head;

u8 sector;

u8 cylinder;

u8 sys_type;

u8 end_head;

u8 end_sector;

u8 end_cylinder;

u32 start_sector;

u32 nr_sectors;

};

(2)格式化分割槽

(3)掛載分割槽

(1)用dd命令建立一個虛擬磁碟映像

dd if =/dev/zero of=vdisk bs=1024 count=32768

(2)在vdisk上執行fdisk來建立一個分割槽P1:

Fdisk vdisk

(3)使用扇區數在vdisk的分割槽1上建立一個迴圈裝置:

Losetup -o (1)用dd命令建立一個虛擬磁碟映像

dd if =/dev/zero of=vdisk bs=1024 count=32768

(2)在vdisk上執行fdisk來建立一個分割槽P1:

Fdisk vdisk

(3)使用扇區數在vdisk的分割槽1上建立一個迴圈裝置:

Losetup -o (expr 2048 * 512) --sizelimit $(expr 65535 * 512) /dev/loopl vdisk

(4)格式化/dev/loopl,它是一個EXT2檔案系統:

Mke2fs -b 4096 /dev/loop1 7936

(5)掛載迴圈裝置:

Mount /dev/loop1c/ mnt

(6)訪問作為檔案系統一部分的掛在裝置:

(cd /mnt; mkdir bin boot dev etc user)

(7)裝置使用完畢後,將其解除安裝。

Umount /mnt

(8)迴圈裝置使用完畢後,通過以下命令將其斷開:

Losetup -d /dev/loop1 (expr 2048 * 512) --sizelimit $(expr 65535 * 512) /dev/loopl vdisk

(4)格式化/dev/loopl,它是一個EXT2檔案系統:

Mke2fs -b 4096 /dev/loop1 7936

(5)掛載迴圈裝置:

Mount /dev/loop1c/ mnt

(6)訪問作為檔案系統一部分的掛在裝置:

(cd /mnt; mkdir bin boot dev etc user)

(7)裝置使用完畢後,將其解除安裝。

Umount /mnt

(8)迴圈裝置使用完畢後,通過以下命令將其斷開:

Losetup -d /dev/loop1

7.4EXT2檔案系統簡介

(1)EXT2檔案系統資料結構

(2)超級塊

(3)塊組描述符

(4)點陣圖

第八章 使用系統呼叫進行檔案操作

摘要:本章論述瞭如何使用系統呼叫進行檔案操作;解釋系統呼叫的作用和 Linux的線上手冊頁;展示瞭如何使用系統呼叫進行檔案操作;列舉並解釋了檔案操作中最常用的系統呼叫;闡明瞭硬連結和符號連結檔案;具體解釋了stat系統呼叫基於stat資訊,開發了一個類似於s的程式來顯示目錄內容和檔案資訊;接著,講解了pen- -close-lseek系統呼叫和檔案描述符;然後,展示瞭如何使用讀寫系統呼叫來讀寫檔案內容;在此基礎上,說明了如何使用系統呼叫來顯示和複製檔案;還演示瞭如何開發選擇檔案複製程式,其行為類似於一個化的 Linux dd實用程式。程式設計專案使用 Linux系統呼叫來實現C程式,該程式將目錄遞迴複製到目標中。該專案的目的是讓讀者練習程式的分層結構設計,並利用 statO、openrad()、 writef()系統呼叫進行檔案操作。

8.1系統呼叫

在作業系統中,程序以兩種不同的模式執行,即核心模式和使用者模式,簡稱KMode和UMode。在 UMode中,程序的許可權非常有限。它不能行任何需要特殊許可權的操作。特殊許可權的操作必須在KMode下執行。系統呼叫(簡稱syscall))是一種允許程序進入KMode以執行UMode不允許操作的機制。復刻子程序、修改執行映像,甚至是終止等操作都必須在核心中執行。

8.2系統呼叫手冊頁

8.3使用系統呼叫進行檔案操作

系統呼叫必須由程式發出。他們的用法就像普通函式呼叫一樣。每個系統呼叫都是一個庫函式,它彙集系統呼叫引數,並最終向作業系統核心發出一個系統呼叫。

連結檔案

硬連結檔案命令:

In oldpath newpath

軟連線檔案命令:

in -s oldpath newpath

open-close-lseek系統呼叫

open:開啟一個檔案進行讀、寫、追加

close:關閉開啟的檔案描述符

read:讀取開啟的檔案描述符

write:寫入開啟的檔案描述符

lseek:將檔案描述符的位元組偏移量重新定位成偏移量

umask:設定檔案建立掩碼;檔案許可權(mask&~umask)