{eval=Array;=+count(Array);}
這是個(gè)很古老的話題。Linux設(shè)計(jì)之初內(nèi)核層和用戶層是嚴(yán)格分離的,用戶層要訪問內(nèi)核就要調(diào)用兩個(gè)系統(tǒng)調(diào)用,read和write,比如訪問串口,就是讀寫/dev/com設(shè)備,read接收數(shù)據(jù),write發(fā)送數(shù)據(jù),那么這個(gè)串口設(shè)備就相當(dāng)于一個(gè)文件了。
后來隨著硬件設(shè)備性能越來高,這種copy to user 的方式效率實(shí)在是有點(diǎn)捉襟見肘,就出現(xiàn)了內(nèi)核內(nèi)層直接map到用戶空間的捷徑,用戶層可以zero copy方式訪問內(nèi)核數(shù)據(jù),效率也就大大提升了。
所以現(xiàn)在的Linux對(duì)設(shè)備的訪問并不是單純的read write和ioctl,還有map方式,像著名的uio框架,就可以把內(nèi)核內(nèi)存映射到用戶空間讓應(yīng)用程序直接讀寫。
看了下這里的回答,本質(zhì)上都沒有回答到點(diǎn)子上。這個(gè)如果你做過一些底層系統(tǒng)維護(hù)工作,又或者做過點(diǎn)linux開發(fā),就會(huì)理解了。
舉兩個(gè)例子,如何在linux中列舉所以開啟了的進(jìn)程?除了系統(tǒng)api以外,其實(shí)你還可以ls一下/proc目錄,那里每一個(gè)進(jìn)程會(huì)對(duì)應(yīng)一個(gè)文件夾,文件夾的名字是pid,在每個(gè)進(jìn)程的文件夾下還會(huì)有這個(gè)進(jìn)程的詳細(xì)信息,比如cmdline文件指的是這個(gè)進(jìn)程的啟動(dòng)命令和參數(shù)。再比如如何得到當(dāng)前系統(tǒng)的硬件信息?你可以直接查看/dev目錄,里面會(huì)分門別類地給到你所有硬件信息。而且很多都是可以直接當(dāng)做txt文件打開的。系統(tǒng)會(huì)把很多硬件直接模擬成文件,這樣你可以在沒有具體系統(tǒng)api調(diào)用文檔的情況下,通過讀寫文件來完成操作硬件。比如一些簡(jiǎn)單系統(tǒng)顯示,就可以直接讀寫fbcon文件來完成,以及以前打印機(jī),掃描儀等等的操作,就可以通過寫入打印機(jī)文件,以及讀取掃描儀文件來完成。
除了這些以外,因?yàn)槭侨f(wàn)物文件的系統(tǒng),可以通過編寫簡(jiǎn)單的編寫各種shell,或者說類似于windows的bat文件來完成復(fù)雜的系統(tǒng)api操作,因?yàn)樗麄冎皇俏募?。舉個(gè)例子,通過命令行可以直接裸寫/dev/sda的二進(jìn)制內(nèi)容來完成分區(qū)和格式化工作。又比如mount命令本質(zhì)上也是一種轉(zhuǎn)換器,把硬件文件轉(zhuǎn)換成分區(qū)文件夾。你對(duì)于分區(qū)內(nèi)文件的操作,最后就變成了對(duì)硬件文件的操作,最后通過驅(qū)動(dòng)變成實(shí)際的硬件指令。又比如我可以通過直接讀寫/dev內(nèi)部的文件控制筆記本背板a面的呼吸燈顏色。
本質(zhì)上,萬(wàn)物皆文件做的事情是,把你不熟悉的系統(tǒng)api,驅(qū)動(dòng),變成固定路徑下的文件操作。這樣你隨便用任何一個(gè)編程語(yǔ)言和環(huán)境都可以驅(qū)動(dòng)和控制系統(tǒng)表現(xiàn)。再比如你可以直接用nodejs,python,c,java,等等各種語(yǔ)言來裸寫控制,而不用到處尋找各種支持庫(kù)和系統(tǒng)包。這也是當(dāng)初為什么類unix系統(tǒng)喜歡用管道的原因,因?yàn)槎妓麐尩氖俏募僮?,想怎么玩就怎么?/p>
0
回答0
回答0
回答0
回答10
回答0
回答0
回答1
回答0
回答0
回答