歡迎您光臨本站 註冊首頁
小知識  >  Unix >

在unix中open系統調度絕對需要嗎

admin @ 2017-11-21 reply:0
←手機掃碼閱讀

1. 找到一個本進程沒有使用的文件描述符fd(int型)

2. 分配一個全新的struct file結構體

3. 根據傳人的pathname查找或建立對應的dentry

4. 建立fd到這個struct file結構體的聯繫 WORD裡面的目錄複製過來似乎不能直接用。。

還是放在這裡當主線看吧.. 用戶空間的Open函數在內核裡面的入口函數是sys_open 通過grep open /usr/include/asm/unistd_64.h查找到的 #define __NR_open 2 __SYSCALL(__NR_open, sys_open) 觀察unistd_64.h,我們可以猜測用戶空間open函數最終調用的系統調用號是2來發起的sys_open系統調用(畢竟glibc一般的做法都會做,用戶空間的函數名字和內核空間中調用的很像,如果需要得到非常準確的,請查看glibc源碼找到對應的系統調用號,再和內核裡面的系統調用號去一一對比)。這裡我們不糾結。 Sys_open函數內容 通過前面的Linux 編程中的API函數和系統調用的關係 我們得知,sys_open實際就是下面這個函數(fs/open.c中) SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) { long ret; if (force_o_largefile()) flags |= O_LARGEFILE; ret = do_sys_open(AT_FDCWD, filename, flags, mode); /* avoid REGPARM breakage on x86: */ asmlinkage_protect(3, ret, filename, flags, mode); return ret; } 其中先調用force_o_largefile()來判斷是否需要設置大文件標識,然後調用do_sys_open來完成具體的工作。其中 force_o_largefile() 在IA64系統中 arch/ia64/include/asm/fcntl.h,定義如下 #define _ASM_IA64_FCNTL_H #define force_o_largefile() (personality(current->personality) != PER_LINUX32) #include #endif /* _ASM_IA64_FCNTL_H */ 而其餘的在include/linux/fcntl.h中 #ifndef force_o_largefile #define force_o_largefile() (BITS_PER_LONG != 32) #endif 所以,在非32位的OS上,force_o_largefile()都為true,而32位的OS則為false 另外,我們可以查看我們的OS位數: # grep CONFIG_64BIT /boot/config-2.6.32-220.el6.x86_64 CONFIG_64BIT=y //64位 #ifdef CONFIG_64BIT #define BITS_PER_LONG 64 #else #define BITS_PER_LONG 32 #endif /* CONFIG_64BIT */ 所以:只有在32位的OS上此處才為false(這裡不考慮IA64架構,我們考慮的是x86架構),所以64位的系統上flags會自動加上O_LARGEFILE,32位的則沒有,所以文件最大大小受索引節點中表示文件大小的32位的i_size的影響,只能訪問2的32次方位元組,即4GB(實際高位一般不用,所以通常只有2G)。加上O_LAGEFILE之後啟用索引節點的i_dir_acl欄位也可以一起表示文件的大小了,這樣位數就變成了64位,2的64位就4GB*4GB,單個文件這麼大已經很大了16T了


[admin via ] 在unix中open系統調度絕對需要嗎已經有779次圍觀

http://coctec.com/room/show-108.html