2013年10月14日 星期一

作業系統之前的程式 for stm32f4discovery (0.5) - newlib

https://github.com/jsnyder/arm-eabi-toolchain 這個 toolchain 會使用 newlib 來當作 standard c library, 我的版本是這個:
arm-eabi-toolchain/newlib-2013.05/

如何證明有使用 c lib 呢? 試著使用 setjmp/longjmp 並編譯程式, 可以參考以下範例:
https://github.com/descent/stm32f4_prog/tree/master/myjmp
執行後, 運作正確。我實在很驚訝, 作業系統之前的程式怎麼有 standard c library 可用, 我一直以為無法使用 standard c library, 雖然我知道有些和平台無關的 function 是可以拿來用的, ex: memset, strcpy ... 但我沒想到有這麼好的運氣可以使用 standard c library。當然有些底層的東西得要自己補完, 例如令人害怕的 printf。

我非常不建議寫 os kernel 的人使用 standard c library, 每行程式都儘可能由自己完成才是, 否則你就會在 os 技術拼圖上缺了一角, 都搞到這麼底層了, 把所有秘密掀開來, 知道所有一切的結果, 會讓人很充實、開心。

要怎麼完全不用 library 全部都自己手工寫呢? 加上 -nostdlib -nodefaultlibs 即可, 或不是使用任何不是你寫的 function, 這樣就要自己把 setjmp/longjmp 生出來, 成就感十足。

相關 gcc options:
  • -nodefaultlibs
  • -nostdlib
  • -ffreestanding
  • -nostartfiles

newlib 提供了很好的範例讓我們參考一個 standard c library 是怎麼做出來的, 不用和 glibc 這種大怪物奮鬥, 若能自己編譯起來執行, 相信底層功力會大增。newlib/newlib/libc/machine/i386/ 下有我們熟悉的 memcmp, memset 的 source code; arm 的部份在 newlib/newlib/libc/machine/arm, 當然, 有可能缺東缺西, 可參考 ref 5 裡的 Howto: Porting newlib A Simple Guide 補上自己所需要的 funcion。不過開發 os 倒不需要用上 standard c library, 相關所需要的 library 本來就要自己打造。

Bionic 是 Android C Library, 也可參考裡頭的實作。

newlib ref:
  1. http://sourceware.org/newlib/
  2. ftp://sourceware.org/pub/newlib/index.html
  3. http://blog.csdn.net/qb_2008/article/details/8228061
  4. http://wenku.baidu.com/view/e85042fa941ea76e58fa04ae.html
  5. Howto: Porting newlib A Simple Guide

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。