新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 小型多任務操作系統(tǒng)miniOS的實現(xiàn)

小型多任務操作系統(tǒng)miniOS的實現(xiàn)

作者: 時間:2016-11-20 來源:網(wǎng)絡 收藏
關于miniOS的介紹

http://blog.csdn.net/mr_raptor/article/details/7338051

本文引用地址:http://2s4d.com/article/201611/319035.htm

本實驗源碼包含三部分:

miniOS源碼:miniOS_xxxx(開發(fā)板名)工程目錄下。

miniOS應用程序跑馬燈:miniOS_app_led工程目錄下。

miniOS應用程序打印程序:miniOS_app_print工程目錄下。

# miniOS源碼:http://download.csdn.net/detail/mr_raptor/4179593

# 程序下載:http://download.csdn.net/detail/mr_raptor/4382941

操作步驟:

(1)在ADS下編譯miniOS_xxxx工程,選擇Norflash啟動,然后通過H-Jtag將minios_org.bin燒寫到Norflash中0地址處。

(2)編譯應用程序miniOS_app_led和miniOS_app_print,選擇Norflash啟動,通過H-Jtag將miniOS_app_print.bin燒寫到0x10000地址處,將miniOS_app_led.bin燒寫0x20000地址處。

(3)啟動開發(fā)板,可以看到miniOS啟動信息。miniOS最多同時支持62個進程執(zhí)行(在2440開發(fā)板64M內存上),miniOS啟動完畢之后,默認只有系統(tǒng)內核進程在執(zhí)行,可以通過按K1鍵,新創(chuàng)建進程,最多創(chuàng)建62個,按K2鍵,隨機殺死一個進程,按K6鍵可以啟動跑馬燈進程。

(4)如果讀者想寫一個程序,讓miniOS啟動它,則根據(jù)編寫規(guī)則,編寫程序,如果需要系統(tǒng)調用,還要自己實現(xiàn)系統(tǒng)調用接口。

分析miniOS代碼分為下面章節(jié):

1. miniOS內存分布

2. 重要頭文件說明

3. 啟動代碼分析

4. MMU與內存保護的實現(xiàn)

5. 內核定時器與中斷處理

6. CPU模式切換

7. 進程調度與上下文切換技術

8. 軟件中斷與系統(tǒng)調用

9. 系統(tǒng)調試、優(yōu)化及可改進地方

下面來看下第1節(jié):

miniOS V2.0內存分布圖:

Linux內核中內核地址空間分為:

  • 直接內存映射區(qū)(Direct Memory Region)即:低端物理內存
  • 動態(tài)內存映射區(qū)(VMalloc Region)即:高端物理內存
  • 其它映射區(qū)

miniOS里,虛擬地址空間分為兩大部分:

  • 用戶程序空間:0x0 ~ 0x80000000
  • 內核管理空間:0x80000000 ~ 0xC0000000

>>用戶程序空間每個進程使用其中的32M虛擬地址空間,其空間地址和其PID有如下關系:

PID * 32M = PID的進程空間

其中,0~32M空間為0號進程空間,其實是當前正在運行的地址空間。

之所以這么設計,是因為ARM CPU在開啟了MMU之后,將低于32M的地址作為進程內空間,當?shù)刂犯哂?2M時,MMU會將其進行地址轉換,具體內容,請參考:MMU與內存管理章節(jié)。

每個進程空間為32M,將來進行進程切換時,只需要按照上面定義的關系,線性偏移即可,減少進程切換時的復雜度。

每個進程的實際物理內存空間為1M,也就是說每個進程只有1M的物理地址空間,當用戶程序超過1M時,程序不能運行(當然還沒有超過1M的程序),它們的映射關系如下所示:

0x30000000 ~ 0x34000000 ----> 0x0 ~ 0x80000000

>>內核管理地址空間又可以細分為以下幾個部分:

  • 物理內存完全映射區(qū):0x80000000 ~ 0x84000000
  • 外設寄存器地址映射區(qū):0x98000000 ~ 0xB0000000
  • 啟動ROM映射區(qū):0xC0100000 ~ 0xC0000000

>>物理內存完全映射區(qū),主要用于管理進程實際地址空間,它其實是0x30000000 ~ 0x80000000的一個線性偏移地址(0x50000000),當我們需要在內核空間里操作用戶空間時,使用該完整映射區(qū),非常方便操作,比如:加載程序到進程空間時,只需通過簡單的計算即可知道其虛擬地址。

例如:啟動5號進程時,其物理地址放在0x30000000開始的第5M空間里,那么其虛擬地址為0x30000000 + 5M + 0x50000000(偏移地址)。

>> 外設寄存器地址映射區(qū),用來操作外設寄存器,當使用到外設寄存器時,可以通過簡單的加減運算可以得到其虛擬地址。

>> 啟動ROM映射區(qū),用來映射NOR FLASH。

物理內存空間結構:

由上圖可知,0號進程物理空間里(0x30000000 ~ 0x30100000),其實除了存放os代碼外,還有其它的用途。

  • 頁表放到了內存地址0x30000000處
  • OS代碼放到了0x300F0000,該地址是故意而為之

最開始的1MB物理內存地址0x30000000~0x30100000為0號內核進程地址空間,其實就是OS代碼區(qū)和內核棧區(qū)及頁表區(qū)。

由于OS代碼放到了物理內存0x300F0000處,其被映射到虛擬地址0x800F0000處,所以ADS里設置的OS代碼的運行地址為0x800F0000



評論


技術專區(qū)

關閉