Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
用十分鐘《向 jserv 學習作業系統設計》
Search
陳鍾誠
November 11, 2016
Education
1
260
用十分鐘《向 jserv 學習作業系統設計》
十分鐘系列:
http://ccc.nqu.edu.tw/wd.html#ccc/slide.wd
陳鍾誠
November 11, 2016
Tweet
Share
More Decks by 陳鍾誠
See All by 陳鍾誠
第 6 章、巨集處理器
ccckmit
0
65
第 7 章、高階語言
ccckmit
0
110
第 9 章、虛擬機器
ccckmit
0
68
第 8 章、編譯器
ccckmit
0
130
數學、程式和機器
ccckmit
1
750
語言處理技術
ccckmit
0
150
微積分
ccckmit
0
380
系統程式 第 1 章 -- 系統軟體
ccckmit
0
390
系統程式 第 2 章 -- 電腦的硬體結構
ccckmit
0
360
Other Decks in Education
See All in Education
セキュリティ・キャンプ全国大会2024 S17 探査機自作ゼミ 事前学習・当日資料
sksat
3
850
AWS All Certが伝える 新AWS認定試験取得のコツ (Machine Learning Engineer - Associate)
nnydtmg
1
570
Nodiレクチャー 「CGと数学」講義資料 2024/11/19
masatatsu
2
190
勉強する必要ある?
mineo_matsuya
2
1.6k
Introduction - Lecture 1 - Web Technologies (1019888BNR)
signer
PRO
0
4.9k
Medicare 101 for 2025
robinlee
PRO
0
240
謙虚なアジャイルコーチ__アダプティブ_ムーブ_による伴走支援.pdf
antmiyabin
0
270
JavaScript - Lecture 6 - Web Technologies (1019888BNR)
signer
PRO
0
2.5k
cbt2324
cbtlibrary
0
110
1030
cbtlibrary
0
300
Kaggle 班ができるまで
abap34
1
190
"数学" をプログラミングしてもらう際に気をつけていること / Key Considerations When Programming "Mathematics"
guvalif
0
570
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Code Review Best Practice
trishagee
64
17k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Producing Creativity
orderedlist
PRO
341
39k
4 Signs Your Business is Dying
shpigford
180
21k
Rails Girls Zürich Keynote
gr2m
94
13k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Optimizing for Happiness
mojombo
376
70k
Transcript
用十分鐘 向 jserv 學習作業系統設計 陳鍾誠 2016 年 9 月 21
日 程式人《十分鐘系列》 程式人《十分鐘系列》 本文衍生自維基百科
我是金門大學資工系的老師
這學期 • 有組專題學生說要寫作業系統!
好樣的!
那當然好啊!
但是學生說 • 我們先各自看《怎麼寫作業系統》 的書,看完之後再開始寫!
我想想
感覺不太妙!
等你們看完
搞不好這學期就過完了!
到時候
你們被當了!
我也過意不去!
所以
我建議學生們
直接從 jserv 的 700 行系列開始
看看高手怎麼寫
先瞭解怎麼寫出第一個
然後再來寫自己的作業系統
這樣感覺比較可行!
現在 •就讓我們來看看!
Jserv 的 700 行系列吧!
我曾經研究過 • 這系列中的 Rubi JIT compiler
寫得很棒!
又清楚 •又簡短 •執行速度又超快!
現在要研究作業系統
我想從 jserv 的 700 行系列開始 •應該是個不錯的選擇!
我們研究的標的物 • 是 jserv 的 Mini ARM OS https://github.com/embedded2015/mini-arm-os
讓我們從第一個 • 00-HelloWorld 開始
主程式 main.c • 看來是用 UART 傳回一 個 hello World! 字串
• 傳回到 UART 接收電腦 上! ( 這電腦通常就是 你用來編譯程式的那一 台 )
main.c 的其他部分 • 基本上就是用 記憶體映射的 方式,進行設定 和輸出操作! 設定 輸出操作
但是、這只是一般的嵌入式寫法 • 啟動程式在哪裡呢? 我想應該是這裡吧?
點進去看看 • 挖! • 連啟動程式 都是用 C 寫的 • 竟然不需要
半行組合語言 中斷向量表
然後用 連結的 ld 檔 • 指定中斷向量 必須放在程式 的前面。 中斷向量 放前面
中斷向量 程式內容
當然 • 還需要 寫 makefile 用 arm-none-eabi-gcc 交叉型編譯器,將系統 編成 ARM
的映像檔 然後用 qemu 來試跑
而那些 • 和板子有關的記 憶體映射位址 • 則是放在 reg.h 當中!
這樣 •我們就看完了,第一個 Hello World! 的專案了!
只是、這還不能算一個作業系統 • 只能算是可以開機印字的程式而已!
但是看完後 •已經學到不少東西了!
接著看 01-HelloWorld 吧! • 奇怪的是,怎麼有兩個 HelloWorld 呢? – 00-HelloWorld –
01-HelloWorld – ???
比較一下,會發現 • 01 版的 HelloWorld , 包含了 data 段 與
BSS 段的內容
其 startup.c 裏 • 也多了這方面的定義與處理
接著讓我們開始進入 比較令人興奮的主題 • 那就是 ContextSwitch ( 內文切換 )
所謂的內文切換 • 就是 multi-tesking 的多工作業系統,要 切換 task 時,所需要做的動作。 • 這個動作通常需要儲存原
task 的暫存器, 然後切換成新 task 的暫存器。
先看 02-ContextSwitch-1 • 使用者任務 usertask • 切換動作 https://github.com/embedded2015/mini-arm-os/blob/master/02-ContextSwitch-1/os.c 問題是: activate
到底是甚麼呢?
原來定義在 context_switch.S 這個組合語言檔裡面 問題是: activate 到底是甚麼呢? 答案是:這一段組合語言程式 這一段特別重要,是內文切換的 重點程式! 但是也特別難懂
… XD
要理解 context_switch.S • 必須對 STM32 的 ARM Cotex M3 系列有所瞭解才行
想瞭解必須參考下列文件 • The Definitive Guide To ARM Cortex M3 http://tinymicros.com/mediawiki/images/7/75/Definitive_Guide_To_The_ARM_Cortex_M3.pdf
ARM Cortex M3 的通用暫存器如下
特用暫存器如下
記憶體映射配置如下
堆疊暫存器 MSP,PSP 的功能
特殊暫存器的用途
狀態暫存器的存取方式
控制暫存器的位元與用途
這樣我們就找到了 context_switch.S 裡的關鍵資訊,整理如下:
再重新看一次 context_switch.S
把每一行的意義寫上 // 儲存核心暫存器 // 包含在 ip 中的 psr // ip
<= psr ( 狀態暫存器 ) // psp <= r0, r0 裡放的是 task 的堆疊,因為 activate(stack) // control <= #3=0x011, 切換到使用者堆疊 (process stack) // 載入行程的暫存器 // 跳到剛剛取出的 lr 暫存器,也就是行程的指令位址上開始執行
現在我們已經確定 • context_switch.S 的 activate 函 數,確實完成了行程切換的動作了!
接著就可以看下一個 • 03-ContextSwitch-2 專案了! https://github.com/embedded2015/mini-arm-os/tree/master/03-ContextSwitch-2 多了 syscall.S 應該是系統呼叫
syscall.S 的內容 // 這軟體中斷是幹嘛的 ??? // 返回
我們得查查 svc 0 是做甚麼的?
本來我查到的是 svc 0 會印 R0 所指向的字串
但是我誤會了 • 那段只是舉 例,不是真的 • Jserv(Jim Huang) 跳出 來解說!
所以 syscall.S 的內容 • 主要是切換模式,回到 OS 控制下 // 從 user
mode 切換到 kernel mode // 返回 http://infocenter.arm.com/help/index.jsp?topic=%2Fcom.arm.doc.dai0179b%2Far01s02s07.html
於是 os.c 裡也可以進行系統呼叫了 // 會從 user mode 切換到 kernel mode
交還控制權給 OS // 原本只會用 UART 傳回給主電腦印出的 // 會從 user mode 切換到 kernel mode 交還控制權給 OS
為了處理系統呼叫 syscall context_switch.S 也多了中斷處理 // 中斷時先儲存使用者行程狀態 ( 暫存器群 ) //
然後再恢復核心的狀態 ( 暫存器群 )
以上就是《內文切換》的範例
接著要進入《多工》 multitasking 的世界
檔案名稱幾乎沒改變
但顯然加入了 task 的概念 https://github.com/embedded2015/mini-arm-os/blob/master/04-Multitasking/os.c
然後寫了兩個 task
並且啟動了這兩個 task
還寫了大輪迴的排程法 以大輪迴方式選擇下一個行程
但是這個大輪迴排程是有缺陷的 • 因為沒有強制時間中斷,所以使用者 task 如果當掉了,那系統也會因此當掉。 • 只有在使用者 task 都正常地以 syscall
呼 叫交還控制權給 OS 時,系統才能持續正 常運作
這讓我想到很久以前 • Windows 3.1 的那個協同式多工 ( 這個故事應該至少要四十歲以上的人才會知道了 )
所以我們需要先學習 •如何加入強制時間中斷!
這就是專案 05-TimerInterrupt 的目的
在專案的 hello.c 裏有這段 // 因為系統頻率為 72M ,所以設定 7.2M 的話 //
每 0.1 秒會時間中斷一次!
當然、這些變數的記憶體映射 •都定義在 reg.h 檔案裏了!
學會強制時間中斷之後 • 我們就可以把那個《不夠好的排程 系統》,加入《強制時間中斷》的 功能了!
這就是下一個專案的任務了
專案 06-preemtive 一樣啟動兩個 task
而且一樣用大輪迴排班
而且每 0.1 秒觸發一次時間中斷 每秒觸發十次
然後開始放下兩個死賴很久的行程 讓他們會常常被中斷
這種大輪迴排程 • 就是所謂的 round-robin scheduler 了!
現在我們看完一個 • 完整的《嵌入式作業系統》了!
不過目前的寫法 • 模組化還不夠好! • 另外功能也還太弱!
所以接下來的專案 •所以我們需要進一步模組化 •然後加入像《記憶體管理》 之類的功能!
這就是專案 07-Threads 的任務了
這專案包含了 malloc 記憶體管理 以及 threads 的管理
每個模組都有適當的 API
還不錯的資料結構
還有相當精簡的實作
並且把組合語言全改內嵌式寫法
於是只剩下了 C 語言的檔案
這些就是 • 我從 jserv 的 Mini-ARM OS 專案 上,所學到的作業系統設計實務!
歡迎直接到下列網址 • https://github.com/embedded2015/mini-arm-os
閱讀並執行那個寫得非常棒的 •mini-arm-os 專案!
相信您會有很大的收穫才對!
這就是 •我們今天的十分鐘系列!
我們下回見!