在上古時代,確實有純機械指令的檔案,叫.com
直接讀入記憶體然後把IP指標指過去就可以運行了。
不過當時電腦是16位的,記憶體只支援到2^16 = 64k,這也是.com檔案大小的上限。
後來為了突破這個限制,對記憶體實行分段(segment)管理。每64k算一個段,用另外一個暫存器來表示段地址。所以那個時候表示記憶體中的一個位置大概像這樣:AAAA:BBBB
硬體上雖然支援了更多的記憶體,但.com仍然是不行的。因為.com只有純機器碼,超過64k的部分也就是說必須載入到其他段的程式碼程式自己都找不到。
為了解決這個問題設計了.exe格式。.exe主要部分還是機械碼,但是有很多輔助的部分:哪部分程式碼載入到哪一段之類的。說點題外話就是.exe執行時也不是全部載入到記憶體,而是檔案頭怎麼寫的就怎麼載入。所以.exe檔案後面接入其他的檔案不影響原來的.exe執行。
感興趣的童鞋可以自己用檔案工具把其他內容寫到exe檔案後面看看還能不能正常執行。
這一特性其實挺常用的,往好了方面用就是自解壓包,其實就是把壓縮包接到一個自解壓程式後面。往壞了用就是電腦病毒唄,感染exe檔案就是把自己接到原來exe檔案末尾,然後修改檔案頭要求後面的程式碼優先調入,病毒程式碼執行完了再調入原來的exe。
當然這是DOS的exe,跟Windows的exe有那麼一點點不一樣,不過大同小異。你可以粗略的理解成office2009寫出來的文件和office2019寫出來的文件的區別。
那Linux可不可以執行exe格式的檔案呢?當然是可以的,只要按照exe檔案格式把它載入到記憶體然後把IP指標指過去就行了。為難之處在於:exe必然有大~~~量的系統呼叫。Linux自然無法提供這些系統呼叫,那就沒有辦法執行嘍。
如果想執行exe的話,重點其實不在於exe檔案格式,以及怎麼調入記憶體。重點在於可以系統能不能提供這些系統呼叫。可這談何容易?相當於是把整個Windows做了一遍。但即使是這樣的東西也仍然有人做出來了,就是Wine。
那為什麼wine無法執行所有exe呢?大概有兩個原因
第一是因為有人不守規矩,一方面是微軟系統呼叫實現的方式跟手冊上寫的不一樣(最近很少了),一方面是很多中國產廠商傾向於使用各種“未公開的API”或者一些非正常的手段來實現一些罕見的功能來彰顯自己的技術(最近也少了)。
第二則是windows的殺手鐧之一DirectX,這個暫時開源實現還有困難。
這就導致了其實Windows也不能完美的執行所有的exe檔案。比如Win3.1/9x執行DOS的exe就有可能出問題。XP執行9x的exe也可能出問題。要不咋有那麼多人賴著不升級呢。
所以總體來說就是越守規矩的exe越容易拿到Linux下執行。
國內那些不太守規矩的玩意(比如QQ),在對wine針對性最佳化之後也是可以執行的。比如deepin版的wine。
最後
Wine已經做的很好了,如果未來有一天Windows開源了或者Windows下的軟體都守規矩了,你就能看到Linux直接執行Windows的程式了。其實微軟也在做這方面的努力,尤其是換了掌門人之後。比如.net core和uwp。
所以我們等等看吧,沒準就等到了呢。
在上古時代,確實有純機械指令的檔案,叫.com
直接讀入記憶體然後把IP指標指過去就可以運行了。
不過當時電腦是16位的,記憶體只支援到2^16 = 64k,這也是.com檔案大小的上限。
後來為了突破這個限制,對記憶體實行分段(segment)管理。每64k算一個段,用另外一個暫存器來表示段地址。所以那個時候表示記憶體中的一個位置大概像這樣:AAAA:BBBB
硬體上雖然支援了更多的記憶體,但.com仍然是不行的。因為.com只有純機器碼,超過64k的部分也就是說必須載入到其他段的程式碼程式自己都找不到。
為了解決這個問題設計了.exe格式。.exe主要部分還是機械碼,但是有很多輔助的部分:哪部分程式碼載入到哪一段之類的。說點題外話就是.exe執行時也不是全部載入到記憶體,而是檔案頭怎麼寫的就怎麼載入。所以.exe檔案後面接入其他的檔案不影響原來的.exe執行。
感興趣的童鞋可以自己用檔案工具把其他內容寫到exe檔案後面看看還能不能正常執行。
這一特性其實挺常用的,往好了方面用就是自解壓包,其實就是把壓縮包接到一個自解壓程式後面。往壞了用就是電腦病毒唄,感染exe檔案就是把自己接到原來exe檔案末尾,然後修改檔案頭要求後面的程式碼優先調入,病毒程式碼執行完了再調入原來的exe。
當然這是DOS的exe,跟Windows的exe有那麼一點點不一樣,不過大同小異。你可以粗略的理解成office2009寫出來的文件和office2019寫出來的文件的區別。
那Linux可不可以執行exe格式的檔案呢?當然是可以的,只要按照exe檔案格式把它載入到記憶體然後把IP指標指過去就行了。為難之處在於:exe必然有大~~~量的系統呼叫。Linux自然無法提供這些系統呼叫,那就沒有辦法執行嘍。
如果想執行exe的話,重點其實不在於exe檔案格式,以及怎麼調入記憶體。重點在於可以系統能不能提供這些系統呼叫。可這談何容易?相當於是把整個Windows做了一遍。但即使是這樣的東西也仍然有人做出來了,就是Wine。
那為什麼wine無法執行所有exe呢?大概有兩個原因
第一是因為有人不守規矩,一方面是微軟系統呼叫實現的方式跟手冊上寫的不一樣(最近很少了),一方面是很多中國產廠商傾向於使用各種“未公開的API”或者一些非正常的手段來實現一些罕見的功能來彰顯自己的技術(最近也少了)。
第二則是windows的殺手鐧之一DirectX,這個暫時開源實現還有困難。
這就導致了其實Windows也不能完美的執行所有的exe檔案。比如Win3.1/9x執行DOS的exe就有可能出問題。XP執行9x的exe也可能出問題。要不咋有那麼多人賴著不升級呢。
所以總體來說就是越守規矩的exe越容易拿到Linux下執行。
國內那些不太守規矩的玩意(比如QQ),在對wine針對性最佳化之後也是可以執行的。比如deepin版的wine。
最後
Wine已經做的很好了,如果未來有一天Windows開源了或者Windows下的軟體都守規矩了,你就能看到Linux直接執行Windows的程式了。其實微軟也在做這方面的努力,尤其是換了掌門人之後。比如.net core和uwp。
所以我們等等看吧,沒準就等到了呢。