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
300
用十分鐘《向 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
80
第 7 章、高階語言
ccckmit
0
140
第 9 章、虛擬機器
ccckmit
0
81
第 8 章、編譯器
ccckmit
0
180
數學、程式和機器
ccckmit
1
780
語言處理技術
ccckmit
0
170
微積分
ccckmit
0
460
系統程式 第 1 章 -- 系統軟體
ccckmit
0
480
系統程式 第 2 章 -- 電腦的硬體結構
ccckmit
0
450
Other Decks in Education
See All in Education
今から始める8bits CPU アセンブラ言語
sapi_kawahara
0
400
Course Review - Lecture 12 - Next Generation User Interfaces (4018166FNR)
signer
PRO
0
1.7k
演習問題
takenawa
0
240
Visualisation Techniques - Lecture 8 - Information Visualisation (4019538FNR)
signer
PRO
0
2.3k
教員向け生成AI講座 ~基礎から応用まで~
luiyoshida
0
630
Webリテラシー基礎
takenawa
0
240
SkimaTalk Tutorial for Corporate Customers
skimatalk
0
250
ThingLink
matleenalaakso
28
4k
Human-AI Interaction - Lecture 11 - Next Generation User Interfaces (4018166FNR)
signer
PRO
0
420
技術文章を書くための執筆技術と実践法(パラグラフライティング)
hisashiishihara
17
6k
ふりかえり研修2025
pokotyamu
0
620
著作権と授業に関する出前講習会/dme-2025-05-01
gnutar
0
190
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Fontdeck: Realign not Redesign
paulrobertlloyd
84
5.5k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
5
590
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
Facilitating Awesome Meetings
lara
54
6.4k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.7k
Adopting Sorbet at Scale
ufuk
76
9.4k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.8k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.3k
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 專案!
相信您會有很大的收穫才對!
這就是 •我們今天的十分鐘系列!
我們下回見!