source: ssp_arm_gcc/trunk/arch/arm_gcc/common/core_user.txt@ 92

Last change on this file since 92 was 92, checked in by nmir-saito, 9 years ago

add separate package of SSP kernel for ARM + SkyEye(experimental)

File size: 10.2 KB
Line 
1=====================================================================
2 ARMプロセッサ依存部
3 Last Modified: 2015 Mar 27 15:13:30
4=====================================================================
5
6○概要
7
8ARM にはアーキテクチャーバージョンが幾つか存在する.本カーネルでは,
9ARMv4 以上のアーキテクチャーをサポートすることとする.基本的には,
10ARMv4 を前提として記述している.しかしながら,上位のアーキテクチャでは
11記述方法を変更することによって性能向上を図れる箇所が存在する.そのよう
12な箇所については,条件コンパイルによって対応することにする.
13
14(注)
15本ソフトウェアはASPカーネル向けのARMプロセッサ依存部を元にSSPへポーティング
16したものである.動作確認が十分に行われていないコードやデッドコード等も
17含まれると思われるため,扱いには注意のこと.
18
19
20○開発環境
21
22コンパイラは,GNU Tools for ARM Embedded Processors でリリースされている
23GNU C/C++のバイナリを使用することとする.
24 https://launchpad.net/gcc-arm-embedded
25
26○CPU例外の取り扱い
27
28●例外とPCの関連
29
30例外 モード アドレス 戻り先PC
31リセット Reset svc 0x00000000
32未定義命令 Undefined und 0x00000004 pc(コプロはpc-4)
33SWI Software Int swi 0x00000008 pc(次の命令)
34プリフェッチアボート Prefetch Abort abt 0x0000000C pc-4(再実行)
35データアボード Data Abort abt 0x00000010 pc-4(再実行pc-8)
36IRQ IRQ irq 0x00000018 pc-4(次の命令)
37FIQ FIQ fiq 0x0000001C pc-4(次の命令)
38
39ARMは,例外毎に戻り番地が異なり,例外の要因になった命令を再実行するか
40どうかによっても戻り番地が異なる.そのため,カーネルの例外ハンドラでは,
41戻り先のPCは操作せず.戻り先のPCを設定させる機能を提供する.ユーザは
42CPU例外ハンドラでこれらの機能を用いて戻り先のアドレスを設定する.
43
44 uint32_t x_get_exc_raddr(void *p_excinf);
45
46 void x_set_exc_raddr(void *p_excinf, uint32_t pc);
47
48●CPU例外ハンドラ番号
49
50例外毎に次のようにCPU例外ハンドラ番号を割り付ける.なお,0番,5番にはユ
51ーザーはCPU例外ハンドラを登録できない.
52
53 リセット 0
54 未定義命令 1
55 SWI 2
56 プリフェッチアボート 3
57 データアボード 4
58 IRQ 5
59 FIQ 6
60
61●ベクターテーブル
62
63ARMのベクタ(vector_table)は,ARMのベクタアドレス0x00000000から配置す
64る.vector_ref_tblは,例外発生時のジャンプ先のテーブルで,vector_tble
65の命令から参照される.
66
67 .section .vector,"a"
68 .global vector_table
69vector_table:
70 ldr pc, reset_vector /* リセット */
71 ldr pc, undef_vector /* 未定義命令 */
72 ldr pc, swi_vector /* ソフトウェア割込み */
73 ldr pc, prefech_vector /* プリフェッチアボード */
74 ldr pc, data_abort_vector /* データアボード */
75 ldr pc, reset_vector
76 ldr pc, irq_vector /* IRQ */
77 ldr pc, fiq_vector /* FIQ */
78
79 .align 2
80 .global vector_ref_tbl
81vector_ref_tbl:
82reset_vector:
83 .long start
84undef_vector:
85 .long undef_handler
86swi_vector:
87 .long swi_handler
88prefech_vector:
89 .long prefetch_handler
90data_abort_vector:
91 .long data_abort_handler
92irq_vector:
93 .long IRQ_Handler
94fiq_vector:
95 .long fiq_handler
96
97
98また,vector_ref_tblをRAM上に配置した場合には,カーネル管理外の例外と
99して,vector_ref_tblに直接ユーザーのハンドラを登録する関数を用意する.
100なお,vector_ref_tblをフラッシュメモリに配置した場合は,このシステムコ
101ールは正常に動作しないので,注意が必要である.
102
103 void x_install_exc(EXCNO excno, FP exchdr)
104
105ディフォルトのvector_ref_tblの登録内容は上に示した通りである.startと
106IRQ_Handler以外は,core_support.Sに定義されており,それぞれ,スーパーバ
107イザーモードに移行して,スタック上にコンテキストを積んだ後,元のモード
108に戻り,r0に例外発生時のpc, r1に例外発生時のcsr, r2に例外番号を入れて,
109ターゲット依存部で定義する target_exc_handler へジャンプする.
110
111
112●ベクタの保護
113
114前述の通りARMのベクタ(vector_table)は,0x00000000 に配置する必要があ
115る.通常はこのアドレスにはROMやフラッシュメモリ等の不揮発性のメモリが
116割り当てられるが,ターゲットによっては,RAMをリマップすることが可能で
117ある.RAMを0x00000000 を配置して,ベクタ(vector_table)を配置すると,
118ユーザープログラムでベクタを書き換えることが可能となるので注意が必要で
119ある.特にユーザープログラムによる,NULLポインタによるアクセスにより書
120き換えられる可能性が高い.安全性を高めるためには,ターゲット依存で次の
121対策を行うことを推奨する.
122
123 ・リマップを行わず,不揮発性メモリにベクタを置く.
124 ・MMUによりベクタの領域を書き込み禁止とする.
125 ・High Vector機能を使用し,ベクタを0x00000000以外に配置する.
126
127
128●例外フレーム(CPU例外ハンドラへの引数)
129
130SSPカーネルの仕様では,CPU例外ハンドラの引数には,CPU例外に関する情報
131を記憶している領域(例外フレーム)の先頭番地が渡される.そのため,CPU
132例外発生時のコンテキストを保存したスタックへのポインタを渡す.
133
134例外フレームは,ARMアーキテクチャ毎に異なり,ARMv4/ARMv5では次のように
135なる.このうち,R0,R1,R2,R3,ipに関しては,ARMプロセッサ依存部で設定さ
136れる.その他の値は,ターゲット毎の target_exc_handler で作成する.例外
137前の割込み優先度マスクは,PRI(int_t)型の外部表現である.
138
139 例外フレーム(ARMv4-5) offset
140 ------------------------------
141 | 例外前のネストカウント | 0 <-- p_excinf
142 ------------------------------
143 | 例外前の割込み優先度マスク | 1
144 ------------------------------
145 | 例外前のCPSR | 2
146 ------------------------------
147 | R0 | 3
148 ------------------------------
149 | R1 | 4
150 ------------------------------
151 | R2 | 5
152 ------------------------------
153 | R3 | 6
154 ------------------------------
155 | IP | 7
156 ------------------------------
157 | LR_svc | 8
158 ------------------------------
159 | 例外前のPC(戻り先) | 9
160 ------------------------------
161
162
163○割り込みの取り扱い
164
165●カーネル管理内/外の割込み
166
167IRQをカーネル管理内,FIQをカーネル管理外の割込みとする.
168
169●CPUロックフラグ
170
171CPUロックフラグとして,ステータスレジスタのIRQビットを用いる.すなわち
172,CPUロック状態では,IRQビットをセットし,カーネル管理内の割込みを禁止
173し,CPUロック解除状態では,IRQビットをクリアする.
174
175●割込みロックフラグ
176
177割込みロックフラグとしては,CPSRのFIQビットとIRQビットを用いる.割り込
178みロック状態では,IRQビットとFIQビットをセットする.
179
180
181=====================================================================
182 カーネル開発者向けの情報
183=====================================================================
184○コンテキストの判定
185
186カーネルは,割り込み/例外の入り口で,カーネル内のカウント用の変数(
187excpt_nest_count)をカウントアップし,出口でカウントダウンする.そのた
188め,excpt_nest_count が0の場合はタスクコンテキスト,1以上の場合は非タ
189スクコンテキストと判断する.
190
191
192○例外エントリ処理
193
194本節の説明対象となるエントリ処理は具体的に以下の処理を指す.
195 undef_handler
196 swi_handler
197 prefetch_handler
198 data_abort_handler
199 fiq_handler
200irq_handler はこの説明の対象ではない.
201
202各例外のエントリ処理は要因毎にカーネルで個別に持つ.
203ルーチンを共有化すると,例外発生後,一時的にレジスタを退避させるために
204一時領域を用いる必要があるため,個別に持つように変更した.
205
206各例外のエントリ処理では以下の処理を行う.
207
208 ・タスク動作時のモードに移行(スタックを切り替える)
209 ・r0-r3,ip,lr,pcを保存(PCはダミー)
210 ・元のモードに戻る
211 ・r0にlr,r1にspsrを,r2にCPU例外番号を入れる
212 ・target_exc_handlerへジャンプ
213
214target_exc_handler はターゲット毎に用意する.ターゲット毎に用意するの
215は,前述の例外フレームに例外前の割込み優先度マスクが含まれており,この
216割込み優先度マスクの扱いがターゲット毎に異なるためである.
217
218target_exc_handler では,前述の例外フレームのフォーマットに従って例外
219フレームを作成して,その先頭番地を引数にして,対応するCPU例外ハンドラ
220を呼び出す.
221
222FIQのエントリ処理(fiq_handler)については,ターゲット依存部側で用意す
223る場合には,それぞれ,以下のマクロを定義すれば,ARM依存部側のエントリ
224処理が無効となる.
225
226 TARGET_FIQ_HANDLER
227
228
229○アイドル処理
230
231実行するべきタスクがない場合は,ディスパッチャーで割込みを許可して,割
232込みを待つ(dispatcher_2).ARM依存部のコードでは,次のようになってい
233る.
234
235 割込みを許可
236 nop
237 割り込み禁止
238
239ターゲット依存で,上記の処理の代わりに,省電力モード等に移行する処理を
240記述したい場合には,ターゲット依存部で,TOPPERS_CUSTOM_IDLEを定義し,
241代わりに実行した処理を toppers_asm_custom_idle というアセンブラマクロ
242として記述する.なお,toppers_asm_custom_idle の記述にあたっては,次の
243レジスタは使用できない.
244
245 r0, r1, r2, r3, sp
246
247アセンブラマクロはC言語記述中に展開するとエラーとなる.pr_support.S で
248は,TOPPERS_ASM_MACRO というマクロを定義しているため,ターゲット依存部
249で toppers_asm_custom_idle アセンブラマクロを定義する際には,
250TOPPERS_ASM_MACRO を条件コンパイルの条件として用いること.
251
252
253○CPSRに常にセットする値
254
255CPSRの変更時,常にセットするパターンを CPSR_ALWAYS_SET として,ターゲ
256ット依存部で定義可能である.
257
258
259○Makefileでの定義事項
260
261
262=====================================================================
263 変更履歴
264=====================================================================
2652015/05/27
266・SSP1.3.0への対応
267
2682014/03/18
269・SSP1.2.1用のARM依存部としてコピー
270
2712011/05/09
272・ASP 1.7.0 への追従.
273 ・オフセットファイルの生成方法をコンフィギュレータを用いる方法に変更.
274
2752011/03/10
276・ASP 1.7.0 への追従.
277
2782010/10/04
279・Thumb Mode 用のsrの設定・参照関数の追加.
280
2812010/10/01
282・アセンブラファイル中の分岐命令のAAPCS推奨への変更忘れを修正.
283
2842010/08/01
285・ASP 1.6.0 へ追従.
286
2872010/07/26
288・VECTOR_KERNELの廃止.
289
2902010/07/26
291・アセンブラファイル中の分岐命令を AAPCS推奨に変更.
292
2932010/07/25
294・ASP 1.5.0 へ追従.
295
2962009/07/14
297・例外フレーム入れる例外前の割込み優先度マスクの値をターゲット依存の
298 値から外部表現に変更.
299
3002008/08/27
301・core_support.S
302 ・call_exit_kernel で割込みを許可していた問題を修正
303・共通部 Release 1.3.2への追従.
304 ・特に変更内容なし
305
3062008/05/13
307・共通部 Release 1.3.1への追従.
308
3092008/04/15
310・start.S
311 ・dataセクションの初期化を省略する TOPPERS_OMIT_DATA_INIT を追加
3122008/04/12
313・非依存部 1.3.0 追従
314
3152008/03/20
316・非依存部 1.2 追従
317
3182007/12/25
319・core_support.S
320 ・OMIT_DEFAULT_IDLE を TOPPERS_CUSTOM_IDLE に変更
321 ・idle処理のマクロ名を toppers_asm_custom_idle に変更
322
323・start.S
324 ・bssの初期化を省略する TOPPERS_OMIT_BSS_INIT を追加
325
326以上.
Note: See TracBrowser for help on using the repository browser.