1. 程式人生 > >Linux裝置檔案系統

Linux裝置檔案系統

Linux檔案系統目錄結構

003vPl7Rty6E8kZRlAEdc&690

  • /bin----存放著最經常使用的基本命令,如ls、cp、mkdir 等,這個目錄中的檔案都是可執行的。
  • /boot----啟動Linux時使用的一些核心檔案,包括一些連線檔案以及映象檔案,如vmlinuz、initrd.img 
  • /dev----裝置檔案儲存目錄,應用程式通過對這些檔案的讀寫和控制就可以訪問實際的裝置。
  • /etc----系統管理所需要的配置檔案和子目錄,如使用者賬號及密碼配置檔案。
  • /home----普通使用者的家目錄,每個使用者都有一個自己的目錄,一般該目錄名是以使用者的賬號命名的。
  • /lib----庫檔案存放目錄,系統最基本的動態連線共享庫,類似於Windows裡的DLL檔案。
  • /lost+found----一般情況下是空的,當系統意外崩潰或機器意外關機時會產生一些檔案碎片放在這裡。
  • /mnt----方便使用者臨時掛載別的檔案系統的,如將光碟機掛載在/mnt/上,進入該目錄就可以檢視光碟機裡的內容
  • media----自動識別一些裝置掛載到這個目錄下,例如U盤、光碟機等等。
  • /opt----給主機額外安裝軟體所存放的目錄
  • /proc----作業系統執行時,程序及核心資訊(比如CPU、硬碟分割槽、記憶體資訊等)存放在這裡。它是系統記憶體的對映,存在在記憶體,通過直接訪問這個目錄來獲取系統資訊。
  • /root----超級許可權使用者的家目錄
  • /sbin----超級許可權使用者的可執行命令存放目錄,普通使用者無許可權執行這個目錄下的命令
  • /tmp-----存放臨時檔案。
  • /usr-----系統應用程式和檔案(如命令、幫助檔案)存放程式的目錄,類似於windows下的program files目錄。
  • /var-----經常被修改的目錄放在這個目錄下,如日誌檔案
  • /sys----核心裝置樹的一個直觀反映。當一個核心物件被建立的時候,對應的檔案和目錄也在核心物件子系統中被建立。
  • /initrd---若在啟動過程中使用了initrd 映像作為臨時根檔案系統,則在執行完其上的/linuxrc掛接真正的根檔案系統後,原來的初始RAM檔案系統被對映到/initrd目錄。

在裝置驅動程式的設計中,一般而言,會關心結構體file和inode這兩個結構體。

file結構體 檔案結構體代表一個開啟的檔案(裝置對應於裝置檔案),系統中每個開啟的檔案在核心空間都有一個關聯的struct file。它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的所有例項都關閉後,核心釋放這個資料結構。

1 struct file
2 {
3 union
4 {
5 struct list_head fu_list;
6 struct rcu_head fu_rcuhead;
7 } f_u;

8 struct dentry *f_dentry; /*與檔案關聯的目錄入口(dentry)結構*/
9 struct vfsmount *f_vfsmnt;
10 struct file_operations *f_op; /* 和檔案關聯的操作*/
11 atomic_t f_count;
12 unsigned int f_flags; /*檔案標誌,如O_RDONLY、O_NONBLOCK、O_SYNC*/
13 mode_t f_mode; /*檔案讀/寫模式,FMODE_READ和FMODE_WRITE*/
14 loff_t f_pos; /* 當前讀寫位置*/
15 struct fown_struct f_owner;
16 unsigned int f_uid, f_gid;
17 struct file_ra_state f_ra;
19 unsigned long f_version;
20 void *f_security;

22 /* tty驅動需要,其他的驅動可能需要*/
23 void *private_data; /*檔案私有資料*/

25 #ifdef CONFIG_EPOLL
26 /* 被fs/eventpoll.c使用以便連線所有這個檔案的鉤子(hooks) */
27 struct list_head f_ep_links;
28 spinlock_t f_ep_lock;
29 #endif /* #ifdef CONFIG_EPOLL */

30 struct address_space *f_mapping;
31 };

檢測使用者開啟檔案的讀寫方式

if (file->f_mode & FMODE_WRITE) //使用者要求可寫
{
}
if (file->f_mode & FMODE_READ) //使用者要求可讀
{
}

判斷以阻塞還是非阻塞方式開啟裝置檔案

if (file->f_flags & O_NONBLOCK) //非阻塞
pr_debug("open: non-blocking\n");
else //阻塞
pr_debug("open: blocking\n");

inode結構體 VFS inode 包含檔案訪問許可權、屬主、組、大小、生成時間、訪問時間、最後修改時間等資訊。它是Linux 管理檔案系統的最基本單位,也是檔案系統連線任何子目錄、檔案的橋樑。

struct inode
2 {
3 ...
4 umode_t i_mode; /* inode的許可權*/
5 uid_t i_uid; /* inode擁有者的id */
6 gid_t i_gid; /* inode所屬的群組id */
7 dev_t i_rdev; /* 若是裝置檔案,此欄位將記錄裝置的裝置號*/
8 loff_t i_size; /* inode所代表的檔案大小*/

10 struct timespec i_atime; /* inode最近一次的存取時間*/
11 struct timespec i_mtime; /* inode最近一次的修改時間*/
12 struct timespec i_ctime; /* inode的產生時間*/

14 unsigned long i_blksize; /* inode在做I/O時的區塊大小*/
15 unsigned long i_blocks; /* inode 所使用的block 數,一個block 為512byte*/

17 struct block_device *i_bdev;
18 /*若是塊裝置,為其對應的block_device結構體指標*/
19 struct cdev *i_cdev; /*若是字元裝置,為其對應的cdev結構體指標*/
20 ...
21 };

 成員變數dev_t i_rdev; 表示 若是裝置檔案,將記錄裝置的裝置號,從一個inode中獲得主裝置號和次裝置號:

unsigned int iminor(struct inode *inode);//獲得次裝置號
unsigned int imajor(struct inode *inode);//獲得主裝置號

檢視/proc/devices 檔案可以獲知系統中註冊的裝置。

檢視/dev目錄可以獲知系統中包含的裝置檔案,日期的前兩列給出了對應裝置的主裝置號和次裝置號。