fl2440開發板作業系統的進度已經進行了將近一半,一小半吧。。。遇到不少問題,抓緊在的過程中總結,恐怕等到完成的時候也不能全部回想起來了。。
下午本來是來測試剛完成的buddy分配功能的,可是將可執行檔案燒到板子上總是不能按預期執行(當然這也是所有寫程式的人遇到的最多的問題了,呵呵)現象是:如果將動態記憶體管理模組編譯、鏈結,那麼板子上電就會沒反應,如果不編譯鏈結動態記憶體管理模組,就沒有問題。最初以為是該模式下(當時cpu是在svc32模式下)的堆疊空間不夠,後來想想不是,堆疊是向下增長的,對於我的程式來說,僅僅呼叫了幾層函式,區域性變數幾乎都能挨個數過來,應該不是堆疊的問題。繼續尋找問題的根源:可能是**段不夠長,不能容納所有的**?檢視鏈結指令碼,也排除了這種可能。對於啟動部分,也就是bootloader部分確實有這個問題,**段、資料段、bss段都要限制在4k以內,這部分當系統上電時會交給硬體載入到cpu去執行,但是對於啟動後的核心**,是沒有這個限制的,在鏈結指令碼中和核心**部分相關的鏈結是這樣寫的:.kernel 0x30000000 : at(0x1000) ,也就是說,從4k開始往後,有多少就存多少,fl2440板子相對於我的不到10k的程式而言,幾乎不存在空間限制問題。所以,問題也不在這裡。然後又接著往下找,懷疑是記憶體的問題,一般的,如果裸板程式不能正常執行,記憶體沒有正確初始化是有著很大嫌疑的。檢視初始化**,當然都是彙編,首先查到的是,初始化記憶體控制器時,設定的對sdram的重新整理率為8e07a3,這個數字是對於cpu跑在12m赫茲下的記憶體重新整理率,現在cpu在400mhz,當然是不對的,應該設定成8e04f5。但是這應該也不是主要原因,因為如果是這個原因,之前所有的程式也不會正常執行的(其實設定成這個重新整理率是由於當初初始化cpu的時候遇到麻煩,由於始終不能把cpu頻率拉到400mhz,所以就先把記憶體也設定成外部晶振的12mhz頻率滿足暫時使用需要的,當然後來cpu初始化成功了,但是這裡卻忘了改回來了,直到現在才發現)。所以改掉這個小bug繼續找。最後終於在拷貝**的部分找到的造成這個問題的真正元凶:在從nand拷貝**到記憶體時,只拷貝了4k的**,在最初的時候,寫的程式還比較短,4k足夠了,但是現在,編譯完看看二進位制檔案大小:9084位元組!前4k是屬於bootloader的,由硬體替我載入到cpu內部的stepstone中執行,我從4k+1開始拷貝4k到記憶體,也才拷到8096而已,很多**或者資料都還靜靜地躺在nand中沒被載入到記憶體,被載入的程式在記憶體中缺胳膊少腿,當然不能跑起來了。最後,將載入大小改為8k,滿足需求就ok。 終於解決了問題,雖然原因很簡單,但是卻著實費了一番功夫
到目前為止,還有兩個待解決的問題:先說第乙個,輕量級的,初始化buddy煉表頭陣列時,對鍊表頭不能正常初始化,總是卡在init_list_hand巨集上邊,其實這個巨集就乙個簡單功能:把傳入的鍊錶元素的兩個指標都指向自身。為什麼不能初始化?不解。第二個問題,困擾了我將近3個禮拜了,不能初始化中斷,就是在使能中斷時,不能將清除了irq位的cpsr值寫會cspr_c中。費解啊,之前就是這個坎實在是邁步過去才先做動態記憶體管理的。。。努力解決中。
為什麼系統呼叫消耗更多時間
參考 understanding unix linux programming a guide to theory and practice 之2.7 使用者程序位於使用者空間,核心程序位於系統空間,磁碟只能被核心直接訪問。在執行核心 時,cpu工作在管理員模式,這對應於一些特殊的堆疊和記憶體環境,...
為什麼系統呼叫消耗更多時間
參考 understanding unix linux programming a guide to theory and practice 之2.7 使用者程序位於使用者空間,核心程序位於系統空間,磁碟只能被核心直接訪問。在執行核心 時,cpu工作在管理員模式,這對應於一些特殊的堆疊和記憶體環境,...
系統呼叫 函式呼叫
linux下對檔案操作有兩種方式 提供了庫函式,如open close read write ioctl 等,需包含標頭檔案unistd.h。以write 函式為例 其函式原型為size t write int fd,const void buf,size t nbytes 其操作物件為檔案控制代碼...