您的第一個問題已在指南中得到解答。
當您在操作系統上加載程序時,您的.data節(基本上非零全局變量)會從「binary」加載到內存中的右側偏移量中,以便當程序啓動那些內存位置代表你的變量有這些值。
unsigned int x=5;
unsigned int y;
作爲一名C程序員,您編寫了上面的代碼,並且您希望x在您第一次使用時是5?那麼,如果從閃存引導,裸機,你沒有一個操作系統將這個值複製到你的RAM,有人必須這樣做。進一步的所有.data的東西都必須在閃存中,數字5必須在閃存的某個地方,以便它可以複製到RAM。所以你需要一個flash地址和一個ram地址。兩個地址爲同一件事。
這就開始回答你的第二個問題,對於你編寫的每一行C代碼,你都假設任何函數都可以調用任何其他函數。你想能夠調用函數是嗎?而且你希望能夠有局部變量,並且你希望上面的變量x爲5,並且你可以假設y將爲零,但是,幸好編譯器開始警告這個問題。通用C的最小啓動代碼設置了堆棧指針,它允許你調用其他函數,並且有局部變量,並且函數的長度超過一行或兩行代碼,它將清零.bss,以便上面的y變量是零,它將值5複製到ram中,以便在運行入口點C函數的代碼時x已準備就緒。
如果你沒有操作系統,那麼你必須有代碼來做到這一點,是的,有許多許多沙箱和工具鏈設置爲已經有啓動和鏈接腳本的各種平臺,以便你可以只是
gcc -O myprog.elf myprog.c
現在,這並不意味着你可以使系統調用沒有... ...系統的printf,FOPEN,等等。但是,如果你下載這些工具鏈的一個它意味着你不確實有寫鏈接器腳本或引導程序。
但它仍然是有價值的信息,請注意啓動代碼和鏈接器腳本也是基於操作系統的程序所必需的,它只是針對您的操作系統的本機編譯器假定您將主要爲該操作系統編寫程序,結果他們在該工具鏈中提供了鏈接器腳本和啓動代碼。