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)