第5章MIPS Linux Kernel分析 1

2021-04-13 00:57:10 字數 4260 閱讀 4602

mips kernel introduction
1.硬體知識
* cpu 手冊: http://www.mips.com等.
* 主機板資料,找你的賣家.
* 背景知識:如pci協議,中斷概念等.
2.軟體資源
* http://oss.sgi.com/linux,ftp://oss.sgi.com
* http://www.mips.com
* mailing lists:
[email protected]
[email protected]
* kernel cvs
sgi:
cvs -d :pserver:[email protected]:/cvs login
(only needed the first time you use anonymous cvs, the password is "cvs")
cvs -d :pserver:[email protected]:/cvs co linux

另外sourceforge.net也有另乙個核心樹,似乎不如sgi的版本有影響.

* 經典書籍:
* "mips r4000 microprocessor user's manual",by joe heinrich
* "see mips run",by dominic sweetman
* jun sun's mips porting guide: http://linux.junsun.net/porting-howto/
* 交叉編譯指南:http://www.ltc.com/~brad/mips/mips-cross-toolchain.html
* debian mips port: http://www.debian.org/ports/mips
* 系統雜誌**: http://www.xtrj.org
3. mips kernel的一般介紹
(下面一些具體**基於2.4.8的核心)

我們來跟隨核心啟動執行的過程看看mips核心有什麼特別之處.

加電後,mips kernel從系統韌體程式(類似bios,可能燒在eprom,flash中)得到控制

之後(head.s),初始化核心棧,呼叫init_arch初始化硬體平台相關的**.

init_arch(setup.c)首先監測使用的cpu(通過mips cpu的cp0控制暫存器prid)

確定使用的指令集和一些cpu引數,如tlb大小等.然後呼叫prom_init做一些底層

引數初始化. prom_init是和具體的硬體相關的.

使用mips cpu的平台多如牛毛, 所以大家在arch/mips下面可以看到很多的子目錄,

每個子目錄是乙個或者一系列相似的平台.這裡的平台差不多可以理解成一塊主機板

加上它的系統韌體,其中很多還包括一些專用的顯示卡什麼的硬體(比如一些工作站).

這些目錄的主要任務是:

1. 提供底層板子上的一些重要資訊,包括系統韌體傳遞的引數,io的對映基位址
,記憶體的大小的分布等.多數還包括提供早期的資訊輸入輸出介面(通常是乙個

簡單的串列埠驅動)以方便除錯,因為pmon往往不提供鍵盤和顯示卡的支援.?

2. 底層中斷**,包括中斷控制器程式設計和中斷的分派,應答等
3. pci子系統底層**. 實現pci配置空間的讀寫,以及pci裝置的中斷,io/mem

空間的分配

4. 其它,特定的硬體.常見的有實時時鐘等

這裡關鍵是要理解這些硬體平台和熟悉的x86不同之處.我印象較深的有幾個:

* item mips不象x86有很標準的硬體軟體介面,而是五花八門,每個廠家

有一套,因為它們很多是嵌入式系統或者專門的工作站.不象pc中,有了

bios後用同一套的程式,就可以使用很多不同的主機板和cpu.
mips中的'bios'常用的有pmon和yamon,都是開放源**的軟體。

很多開發板帶的韌體功能和pc bios很不一樣,它們多數支援串列埠顯示,

硬碟,沒有一般的基本'輸入輸出'功能.

* pci系統和位址空間,匯流排等問題.

在x86中,io空間用專門的指令訪問,而pci裝置的記憶體空間和物理記憶體

空間是相同的,也就是說,在cpu看來物理記憶體從位址0開始的話,在pci裝置

看來也是一樣的.反之,pci裝置的基位址暫存器設定的pci儲存位址,cpu用

相同的實體地址訪問就行了.

而在mips中就很不一樣了,io一般是memory map的,map到**就倚賴具體

平台了.而pci裝置的位址空間和cpu所見的物理記憶體位址空間往往也不一樣

(bus address & physical address).所以mips kernel的iob/outb,以及
bus_to_virt/virt_to_bus,phys_to_virt/virt_to_phys,ioremap等就

要小心考慮.這些問題有時間我會對這些問題做專門的說明.

pci配置空間的讀寫和位址空間對映的處理通常都是每個平台不一樣的.

因為缺乏統一介面的bios,核心經常要自己做pci裝置的列舉,空間分配,

中斷分配.

* 中斷系統.
pc中中斷控制器先是有8259,後來是apic,而cpu的中斷處理386之後好像

也變化不大,相對統一.

mips cpu的中斷處理方式倒是比較一致,但是主機板上的控制器就亂七八糟了

怎麼鑑別中斷源,怎麼程式設計控制器等任務就得各自實現了.

總的說來,mips cpu的中斷處理方式體現了risc的特點:軟體做事多,硬體盡量

精簡. 程式設計控制器,提供中斷控制介面,dispatch中系?這一部分原來很混亂,

大家各寫各的,現在有人試圖寫一些比較統一的**(實際上就是原來x86上

用的controller/handler 抽象).

* 儲存管理.
mips 是典型的risc結構,它的儲存管理單元做的事情比象x86這種機器少得多.

例如,它的tlb是軟體管理的,cache常常是需要系統程式干預的.而且,過多的

cpu和主機板變種使得這一部分非常複雜,容易出錯.儲存管理的**主要在include/
a**-mips和arch/mips/mm/目錄下.
* 其它.

如時間處理,r4k以上的mips cpu提供count/compare暫存器,每隔幾拍count增加,

到和compare相等時發生時鐘中斷,這可以用來提供系統的時鐘中斷.但很多板子

自己也提供其它的可程式設計時鐘源.具體用什麼就取決於開發者了.

init_arch後是loadmmu,初始化cache/tlb.**在arch/mips/mm裡.有人可能會問,

在cache和tlb之前cpu怎麼工作的?

在x86裡有實模式,而mips沒有,但它的位址空間是特殊的,分成幾個不同的區域,

每個區域中的位址在cpu裡的待遇是不一樣的,系統剛上電時cpu從位址bfc00000

開始,那裡的位址既不用tlbmso-ascii-font-family:"courier new";mso-hansi-font-fa

5 第 5 章 迴圈

1.可以用迴圈來驗證輸入。在迴圈前的第一次讀取操作,稱為啟動讀取,如果後續還需要繼續讀取,則語句應該在迴圈中。2.在實際程式設計應用中,不建議在 cout 語句中放置遞增或遞減運算子 因為容易出錯 3.需要計數時使用計數器,需要累計彙總時使用累加器。4.標記符號是乙個特殊值,指示著值列表的結尾。一般...

第5章 方法

方法的結構 方法是一塊具有名稱的 可以使用方法的名稱從別的地方執行 也可以把資料傳入方法並接受資料輸出。方法是類的函式成員。方法有兩個主要部分,方法頭和方法體。方法頭指定方法的特徵,包括 方法是否返回資料,如果返回,返回什麼型別 方法的名稱 哪種型別的資料可以傳遞給方法或從方法返回,以及應如何處理這...

第5章 雜湊

5.1 一般想法 雜湊主要需要解決衝突發生時如何處理 5.2 雜湊函式 對於關鍵字為字串時,若將字串所有的字元相加得到雜湊值,則對於大表而言,其值過小,使關鍵字集中於表的前面,分布不均。若只是取前面少數字元構造多項式,則實際組合數過少,對於大表的利用率低。最好的方法是對字串的所有字元均使用多項式,提...