Newlib移植
時(shí)間:2022-02-07 15:20:01 | 來源:信息時(shí)代
時(shí)間:2022-02-07 15:20:01 來源:信息時(shí)代
Newlib的所有庫函數(shù)都建立在20個(gè)樁函數(shù)的基礎(chǔ)上,這20個(gè)樁函數(shù)完成一些newlib無法實(shí)現(xiàn)的功能:
1)級(jí)I/O和文件系統(tǒng)訪問(open、close、read、write、lseek、stat、fstat、fcntl、link、unlink、rename);
2)擴(kuò)大內(nèi)存堆的需求(sbrk);
3)獲得當(dāng)前系統(tǒng)的日期和時(shí)間(gettimeofday、times);
4)各種類型的任務(wù)管理函數(shù)(execve、fork、getpid、kill、wait、_exit);
這20個(gè)樁函數(shù)在語義、語法上與POSIX標(biāo)準(zhǔn)下對(duì)應(yīng)的20個(gè)同名系統(tǒng)調(diào)用是完全兼容的。成功移植newlib的關(guān)鍵是在目標(biāo)系統(tǒng)環(huán)境下,找到能夠與這些樁函數(shù)銜接的功能函數(shù)并實(shí)現(xiàn)這些樁函數(shù)。
Newlib為每個(gè)樁函數(shù)提供了可重入的和不可重入的兩種版本。兩種版本的區(qū)別在于,如果不可重入版樁函數(shù)的名字是xxx,則對(duì)應(yīng)的可重入版樁函數(shù)的名字是_xxx_r,如close和_close_r,open和_open_r,等等。此外,可重入的樁函數(shù)在參數(shù)表中含有一個(gè)_reent結(jié)構(gòu)指針,這個(gè)指針使得系統(tǒng)的實(shí)現(xiàn)者能在庫和目標(biāo)操作環(huán)境之間傳送上下文相關(guān)的信息,尤其是發(fā)生錯(cuò)誤時(shí),能夠便捷的傳送errno的值到適當(dāng)?shù)娜蝿?wù)中。
所謂最小實(shí)現(xiàn)是指,假定將要移植的目標(biāo)系統(tǒng)中沒有文件系統(tǒng),也沒有符合POSIX標(biāo)準(zhǔn)的任務(wù)管理機(jī)制和應(yīng)用編程接口(ApplicationProgrammingInterface,API),僅僅實(shí)現(xiàn)newlib的一個(gè)最小移植。在newlib的移植過程中全功能實(shí)現(xiàn)的樁函數(shù)只有open、close、read、write和sbrk五個(gè),其他樁函數(shù)僅僅實(shí)現(xiàn)一個(gè)返回錯(cuò)誤的空函數(shù)。
任務(wù)管理的execve、fork、getpid、kill、wait和_exit六個(gè)樁函數(shù),僅僅實(shí)現(xiàn)一個(gè)返回-1的空函數(shù),返回之前將errno設(shè)置為ENOTSUP,表示系統(tǒng)不支持該函數(shù)。
與文件相關(guān)的link和unlink樁函數(shù)也僅僅實(shí)現(xiàn)一個(gè)返回-1的空函數(shù),將errno設(shè)置為EMLINK表示連接過多;lseek函數(shù)則不需要返回任何錯(cuò)誤,直接返回0,表示操作成功。
fstat和stat樁函數(shù)在newlib中主要用于判斷流的類型(常規(guī)文件、字符設(shè)備、目錄),將其實(shí)現(xiàn)為不論輸入?yún)?shù)如何,都返回字符設(shè)備類型的空函數(shù)。
times樁函數(shù)返回當(dāng)前進(jìn)程中的各種時(shí)間信息,如果目標(biāo)系統(tǒng)中的任務(wù)不能提供類似的時(shí)間信息,僅僅實(shí)現(xiàn)一個(gè)返回-1的空函數(shù),將errno設(shè)置為ENOTSUP。
由于newlib認(rèn)為在目標(biāo)系統(tǒng)中fcntl、rename和gettimeofday三個(gè)樁函數(shù)缺省是不提供的,所以也不提供這三個(gè)樁函數(shù)的實(shí)現(xiàn)。