preload
十二月 12

搞了兩天, 我的超小型RTOS, 在linux(FC5) 下用gcc -O2 的option compile完後, 執行總是會出現segmentation fault. 但是-O0 就ok了. 本以為是我的multi-thread 出問題了, 查了好久, 才發現是在我的RTOS中的context switch(for x86)中會死掉, 跳到不知名的地方去了. 當初context switch 中的code 是參考eCos 改過來的. 想了一想, eCos 似乎只支援i386相容的PC. 難道gcc -O2 的option 會使用i386以外的暫存器, 來做最佳化嗎??
果真, 在Makefile 中gcc 的option 中加入-march=i386 就解決了. 後來測試-march=i486 或i586 也都可以, 但用i686 就會segmentation fault. 嗯嗯, 自從學校學過i386 組合語言後, 再也不知道486 以上的CPU到底多了哪些功能. 只知道變快了, 且i386相容. 看來要最佳化自己的程式, 還是得多了解一下CPU 已經改到啥地步了. 尤其是在我的RTOS, 裡面有部份的code 是跟CPU有關的

Comments are closed.