[思考]-32位的应用程序为什么不能跑64位的应用程序
生活随笔
收集整理的這篇文章主要介紹了
[思考]-32位的应用程序为什么不能跑64位的应用程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在ARM文檔中,可以找到如下兩句話:
- When the processor moves from a higher to a lower Exception level, the Execution state can stay the same, or it can switch from AArch64 to AArch32.
- When moving from a lower to a higher Exception level, the Execution state can stay the same or switch from AArch32 to AArch64
翻譯之后就是: - 如果從高的異常級別切換到低的異常級別,執行狀態可以保持不變,也可以從aarch64切換到aarch32;
例如從linux kernel切換到app,如果linux kernel是aarch64,那么app可以是aarch64或aarch32,如果linux kernel是aarch32,那么app只能是aarch32; - 如果從低的異常級別切換到高的異常級別,執行狀態可以保持不變,也可以從aarch32切換到aarch64;
例如從app切換到linux kernel,如果app是aarch64,那么linux kernel可以是aarch64或aarch32,如果app是aarch32,那么linux kernel可以是aarch64或aarch32;
其實也可以這樣總結:高的異常級別的執行狀態,一定要大于等于低的異常級別的執行狀態; 即EL1的執行狀態要大于等于EL0的執行狀態…
那么ARM為什么會有這種設計或約束呢?
我們以linux kernel和app(EL1 <—> EL0)為例來看:
如果linux kernel是aarch64的,那么在linux kernel啟動和運行時修改的ARM系統寄存器(如SCTLR\TTBLRx等),都是以aarch64修改的,這些寄存器的修改當然也會map到aarch32上。
在系統切換app之后,linux kernel中修改的這些寄存器的屬性對aarch32/aarch64依然都生效。 故如果EL1是aarch64,那么EL0可以是aarch64或aarch32;
如果linux kernel是aarch32的,那么在linux kernel啟動和運行時修改的ARM系統寄存器(如SCTLR\TTBLRx等),都是以aarch32修改的,這些寄存器的修改不會map到aarch64上。
在系統切換app之后,linux kernel中修改的這些寄存器的屬性僅對aarch32生效。 故如果EL1是aarch32,那么EL0只能是aarch32;
總結
以上是生活随笔為你收集整理的[思考]-32位的应用程序为什么不能跑64位的应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [实验]-从汇编代码来看volatile
- 下一篇: [register]-ARMV8-aar