1. gzyueqian
      13352868059

      嵌入式開發(fā):使用堆棧保護提高代碼完整性

      更新時間: 2022-08-04 09:38:52來源: 粵嵌教育瀏覽量:8731

        開發(fā)可靠的嵌入式軟件歸結為計劃最壞的情況,并確保嵌入式開發(fā)人員有適當的防護措施和陷阱來處理這些情況。嵌入式軟件中一個被忽視的領域通常是堆棧。堆棧是微控制器用來存儲局部變量、函數調用返回地址、中斷上下文和函數參數等信息的臨時存儲器。

        為給定的應用程序設置堆棧大小完全取決于開發(fā)人員。許多編譯器會提供默認值0x400字節(jié),但這對所有應用程序來說真的足夠了嗎?對于任何給定的應用程序,確定堆棧的大小都很困難。開發(fā)人員需要確定最壞情況的使用,這包括了解最大函數調用深度、將在堆棧上定義多少局部變量,甚至可能需要存儲多少并發(fā)中斷上下文。即使有今天的技術和工具,這也不是一件容易的事。

        

        那么開發(fā)者做什么呢?他只需確定當天的風向,從稀薄的空氣中抽出一個數字,并把這個數字作為堆棧的大小。底線是,如果堆棧溢出了分配給它的內存區(qū)域,最壞的情況會是什么?圖1顯示了典型的內存映射以及堆、堆棧和全局/靜態(tài)區(qū)域的位置。嵌入式開發(fā)隨著堆棧的增長,它將朝著內存映射的全局/靜態(tài)變量區(qū)域增長。如果堆棧溢出,它將開始覆蓋全局和靜態(tài)變量定義!導致存儲在內存中的值被破壞,并有機會對系統(tǒng)的行為造成嚴重破壞。

        

        圖1–內存映射

        一個可靠的系統(tǒng)不能允許堆棧溢出。那么,當這種情況出現時,有什么技術可以檢測到呢?最常見的技術之一是在堆棧和全局/靜態(tài)變量區(qū)域之間創(chuàng)建一個保護區(qū)域。應該選擇足夠大的保護區(qū)域,這樣如果堆棧溢出,它就不能穿透下面的內存區(qū)域。一些常見的值是16和32字節(jié),但這些需要基于一次可以放入堆棧的最大對象。存儲器映射設置示例如圖2所示。

        

        圖2–堆棧保護存儲器映射

        微控制器可以通過兩種方式監(jiān)控保護區(qū)。第一種是使用板載存儲器保護單元(MPU )(如果微控制器上有)。在這種情況下,如果對存儲器的堆棧保護區(qū)有任何寫訪問,MPU將被設置為觸發(fā)中斷。中斷觸發(fā)表明堆棧溢出,可以采取保護措施并記錄錯誤。

        如果MPU不可用,嵌入式開發(fā)人員可以在系統(tǒng)初始化期間用已知的位模式填充存儲器的保護區(qū)。然后可以創(chuàng)建一個任務或函數,定期檢查保護區(qū),并將其與已知的位模式進行比較。如果模式已經改變,那么應用程序可以強制中斷,然后記錄錯誤并開始糾正措施。

        有兩種不同的方法可以用來創(chuàng)建大模式。第一種是使用鏈接器文件在堆棧保護中創(chuàng)建一個填充區(qū)域。該區(qū)域將在啟動時的C復制期間自動初始化。第二種方法是手動寫入位模式,作為系統(tǒng)初始化的一部分,方法是創(chuàng)建一個指向堆棧保護開始的指針,然后將位模式放入內存。

        可以說,在適當的位置設置堆棧保護會降低嵌入式軟件的效率。讓應用程序定期檢查防護是否仍然完好,可能需要一個函數調用、一個循環(huán)和一個取消引用的指針。這種性能影響在現代微控制器上幾乎不明顯,應該是一個靜音點。在創(chuàng)建一個可靠的系統(tǒng)時,嵌入式開發(fā)人員需要進行這些類型的檢查,以確保系統(tǒng)按預期運行。如果發(fā)生災難性故障,如堆棧溢出,系統(tǒng)將能夠檢測到溢出,并在系統(tǒng)發(fā)生可怕的事情或甚至更糟的系統(tǒng)用戶發(fā)生之前采取糾正措施。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 一本一道久久a久久精品 | 原创中文在线激情 | 日韩欧美国产偷 | 亚洲日韩一区二区午夜福利蜜桃 | 欧美亚洲日韩另类中文字幕20 | 久久大香伊蕉在人线免费AV |