如何移植Linux到晶心平臺(tái)
4.2.3. Kernel 解壓縮與software breakpoint
在進(jìn)行kernel 調(diào)試時(shí),如果在低地址處,例如:head.S中進(jìn)行調(diào)試,當(dāng)設(shè)定 software breakpoint時(shí),會(huì)有breakpoint無法停下來與AICE 斷線的情況發(fā)生。原因是當(dāng)使用者設(shè)定software breakpoint時(shí),breakpoint處的instruction會(huì)修改并加入break instruction。但kernel解壓縮時(shí)會(huì)將調(diào)試的程序代碼覆蓋造成與GDB調(diào)試不一致性而產(chǎn)生錯(cuò)誤。解決的方法就是原設(shè)定software breakpoint改為hardware breakpoint,這樣就可以避免因kernel解壓縮所造成調(diào)試的錯(cuò)誤,降低調(diào)試時(shí)的困難度。
4.2.4. PA/VA 觀念說明與調(diào)試要領(lǐng)
在原始碼arch/nds32/kernel/head.S中
la $lp, __mmap_switched
mtsr $lp, $IPC
iret
執(zhí)行完iret后,系統(tǒng)就會(huì)從PA轉(zhuǎn)成VA,MMU translation status從translation off轉(zhuǎn)為translation on在此分界處調(diào)試規(guī)則如下所述,如果觀念不清楚及容易產(chǎn)生調(diào)試時(shí)的錯(cuò)誤,請(qǐng)務(wù)必牢記。
4.2.4.1. MMU translation off 時(shí)期調(diào)試
在這個(gè)時(shí)期調(diào)試,VA是不存在的。所有的IO address與memory都是PA沒有VA,如果調(diào)試地址設(shè)成VA,容易hit illegal address 而造成exception。
4.2.4.2. MMU translation on 時(shí)期調(diào)試
在這個(gè)時(shí)期調(diào)試,PA是不存在的。所有的IO address與memory都是VA沒有PA,如果調(diào)試地址設(shè)成PA,容易hit illegal address 而造成exception.
MMU translation on后,很快就會(huì)進(jìn)入start_kernel 函數(shù),接下來移植的重點(diǎn)就是移植Linux基礎(chǔ)組件,那就是interrupt,timer and UART。當(dāng)這3個(gè)device移植成功后,Linux的架構(gòu)就建立起來了,printk也可以用了,Linux已經(jīng)可以正常的運(yùn)作。如果沒有意外,可以執(zhí)行完kernel甚至將filesystem帶起來。接下來用戶可以將自己的周邊組件一個(gè)一個(gè)的device driver移植入系統(tǒng)。當(dāng)周邊組件移植完成后,Linux系統(tǒng)移植到晶心平臺(tái)就完成了。
5. 結(jié)語
Linux操作系統(tǒng)運(yùn)作在晶心平臺(tái)已有多年的時(shí)間。各式各樣的Linux軟件運(yùn)作在晶心平臺(tái)不計(jì)其數(shù)。皆可證明Linux操作系統(tǒng)運(yùn)作結(jié)合晶心平臺(tái)是一個(gè)穩(wěn)定與成熟的產(chǎn)品,只要能明了熟悉Linux 移植的技巧與重點(diǎn),使用晶心平臺(tái)開發(fā)Linux的產(chǎn)品將是一件愉快與簡(jiǎn)單的工作。
評(píng)論