在Linux中某些程序无法运行,为何linux下的程序不能在windows下运行,不是“废话”那么简单...
大家好,近期我發的文章都比較底層,過些天再發Linux基礎方面的內容,多謝大伙兒的支持,回到正題。
您看,linux和windows都是運行在x86體系架構cpu上的操作系統,也就是指令的機器碼都是一樣的,為什么linux系統下的應用程序不能在windows系統下運行呢?其實,windows下的程序也無法直接在linux下運行,也許您在想,這不是廢話嗎。對于這個問題,很多同學都會馬上給出答案:格式不同!其實。。。。答對啦,哈哈,確實是格式不同,不過這只是一方面,還有另一方面,系統API不同,API即Application Programming Interface,應用程序編程接口。
先說說格式,格式也可稱為協議,協議是指:在某個固定的位置有固定意義的數據。比如偏移量為A字節、連續大小為B字節的空間中,存放的是數據C,像mysql協議、http協議都是類似這樣的組織形式。一般特定于某個應用程序的文件只能被那個應用程序打開,原因是只有那個程序懂這個文件,如何懂呢?應用程序在生成文件時,一般都會在文件的開始部分寫一段固定格式的數據,也就是元信息,這段數據稱為文件頭,故文件頭是某個應用程序為自己埋下的伏筆,應用程序需要從文件頭中獲取文件的信息以方便它解析該文件。比如視頻播放軟件可通過讀取視頻文件的文件頭來提前了解視頻的信息,以選擇合適的播放模式。這種應用程序和被解析文件的關系同樣適用于操作系統和可執行程序,可執行程序是被操作系統識別并加載的。
Linux下的可執行程序格式是elf,也就是 “Executable and Linking Format。平時咱們用readelf命令可以查看elf文件頭,里面有節(section)信息,段(segment)信息,程序入口(entry_point),哪個段由哪些節組成等等信息。而windows下的可執行程序是PE格式(portableexecutable,可移植的可執行文件),因為我沒了解過,所以具體文件頭咱們就不關注了,有興趣的同學自行查看。說到這您也懂了,如果文件可以被多種應用程序解析的話,這個文件的格式必須被多種應用程序接受,即所有的應用程序都要認得這種格式的文件,比如一個視頻文件可以被多種播放器播放原因正是如此。linux程序不能在windows下運行,說白了就是人家windows不認linux文件的格式。如果windows肯支持elf文件格式,那么linux程序在windows下運行也是可能的,但是…,還沒完,還有另外一個硬傷,這就是操作系統API不同。
操作系統是通過API為應用程序提供功能支持的,一般是通過軟中斷指令int,再加上一個中斷向量號來實現,這也稱為系統調用。Linux是通過int 0x80來實現系統調用的,而windows是通過int 0x2e來實現的,也就是說,兩個操作系統下的應用程序獲得操作系統功能的方式不同,同樣一句機器指令int 0x80,在linux下就是進入內核以獲得操作系統的功能支持,結果是符合預期的,而在windows下卻是另一翻景象,獲得的結果也許是災難性的。所以,雙方的應用程序顯然是不能在對方的系統中運行。
除以上原因外,這還和編譯器、標準庫有關,不再列舉。
先到這。
舉報/反饋
總結
以上是生活随笔為你收集整理的在Linux中某些程序无法运行,为何linux下的程序不能在windows下运行,不是“废话”那么简单...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux ubuntu安装教程6,64
- 下一篇: 号称无形杀手的声波武器威力究竟有多强?