📄 core_user.txt
字号:
===================================================================== ARMプロセッサ巴赂婶 Last Modified: 13 May 2008 12:13:45=====================================================================←车妥ARM にはア〖キテクチャ〖バ〖ジョンが傣つか赂哼するˉ塑カ〖ネルでは·ARMv4 笆惧のア〖キテクチャ〖をサポ〖トすることとするˉ答塑弄には· ARMv4 を涟捏として淡揭しているˉしかしながら·惧疤のア〖キテクチャでは淡揭数恕を恃构することによって拉墙羹惧を哭れる舱疥が赂哼するˉそのような舱疥については·掘凤コンパイルによって滦炳することにするˉ←倡券茨董コンパイラは·CodeSourceryでリリ〖スされているGNU C/C++のバイナリを蝗脱することとするˉ←CPU毋嘲の艰り胺い↑毋嘲とPCの簇息毋嘲 モ〖ド アドレス 提り黎PCリセット Reset svc 0x00000000 踏年盗炭吾 Undefined und 0x00000004 pc(コプロはpc-4)SWI Software Int swi 0x00000008 pc(肌の炭吾)プリフェッチアボ〖ト Prefetch Abort abt 0x0000000C pc-4(浩悸乖)デ〖タアボ〖ド Data Abort abt 0x00000010 pc-4(浩悸乖pc-8)IRQ IRQ irq 0x00000018 pc-4(肌の炭吾)FIQ FIQ fiq 0x0000001C pc-4(肌の炭吾)ARMは·毋嘲髓に提り戎孟が佰なり·毋嘲の妥傍になった炭吾を浩悸乖するかどうかによっても提り戎孟が佰なるˉそのため·カ〖ネルの毋嘲ハンドラでは·提り黎のPCは拎侯せずˉ提り黎のPCを肋年させる怠墙を捏丁するˉユ〖ザはCPU毋嘲ハンドラでこれらの怠墙を脱いて提り黎のアドレスを肋年するˉ uint32_t x_get_exc_raddr(void *p_excinf); void x_set_exc_raddr(void *p_excinf, uint32_t pc);↑ CPU毋嘲ハンドラ戎规毋嘲髓に肌のようにCPU毋嘲ハンドラ戎规を充り烧けるˉなお·0戎,5戎にはユ〖ザ〖はCPU毋嘲ハンドラを判峡できないˉ リセット 0 踏年盗炭吾 1 SWI 2 プリフェッチアボ〖ト 3 デ〖タアボ〖ド 4 IRQ 5 FIQ 6↑ベクタ〖テ〖ブルARMのベクタ∈vector_table∷は·ARMのベクタアドレス0x00000000から芹弥するˉvector_ref_tblは·毋嘲券栏箕のジャンプ黎のテ〖ブルで·vector_tbleの炭吾から徊救されるˉSoCによっては·ベクタアドレスがフラッシュメモリ惧にあり·vector_tableはモニタプログラムが积ち·カ〖ネルで毋嘲を脱いる眷圭は·vector_ref_tblを今き垂える涩妥がある眷圭があるˉ .section .vector,"a" .global vector_tablevector_table: ldr pc, reset_vector /* リセット */ ldr pc, undef_vector /* 踏年盗炭吾 */ ldr pc, swi_vector /* ソフトウェア充哈み */ ldr pc, prefech_vector /* プリフェッチアボ〖ド */ ldr pc, data_abort_vector /* デ〖タアボ〖ド */ ldr pc, reset_vector ldr pc, irq_vector /* IRQ */ ldr pc, fiq_vector /* FIQ */ .align 2 .global vector_ref_tblvector_ref_tbl:reset_vector: .long startundef_vector: .long undef_handlerswi_vector: .long swi_handlerprefech_vector: .long prefetch_handlerdata_abort_vector: .long data_abort_handlerirq_vector: .long IRQ_Handlerfiq_vector: .long fiq_handlerそのため·カ〖ネル极咳で vector_table を积つかどうかを扩告する·VECTOR_KERNEL というマクロを脱罢するˉVECTOR_KERNELを年盗すると·カ〖ネルの积つvector_tableが铜跟になるˉVECTOR_KERNELが年盗されていない眷圭は·CPU毋嘲のハンドラの判峡箕にカ〖ネルの积つ毋嘲ハンドラの掐り庚のアドレスをモニタプログラムの瓷妄するvector_ref_tblに判峡するˉベクタ〖アドレスの黎片戎孟を回年するVECTOR_STARTも脱罢するまた·カ〖ネル瓷妄嘲の毋嘲として·vector_ref_tblに木儡ユ〖ザ〖のハンドラを判峡する簇眶を脱罢するˉなお·vector_ref_tblをフラッシュメモリに芹弥した眷圭はこのシステムコ〖ルは赖撅に瓢侯しないので·庙罢が涩妥であるˉ void x_install_exc(EXCNO excno, FP exchdr)ディフォルトのvector_ref_tblの判峡柒推は惧に绩した奶りであるˉstartとIRQ_Handler笆嘲は·core_support.Sに年盗されており·それぞれ·ス〖パ〖バイザ〖モ〖ドに败乖して·スタック惧にコンテキストを姥んだ稿·傅のモ〖ドに提り·r0に毋嘲券栏箕のpc, r1に毋嘲券栏箕のcsr, r2に毋嘲戎规を掐れて·タ〖ゲット巴赂婶で年盗する target_exc_handler へジャンプするˉ↑ベクタの瘦割涟揭の奶りARMのベクタ∈vector_table∷は·0x00000000 に芹弥する涩妥があるˉ奶撅はこのアドレスにはROMやフラッシュメモリ霹の稍带券拉のメモリが充り碰てられるが·タ〖ゲットによっては·RAMをリマップすることが材墙であるˉRAMを0x00000000 を芹弥して·ベクタ∈vector_table∷を芹弥すると·ユ〖ザ〖プログラムでベクタを今き垂えることが材墙となるので庙罢が涩妥であるˉ泼にユ〖ザ〖プログラムによる·NULLポインタによるアクセスにより今き垂えられる材墙拉が光いˉ奥链拉を光めるためには·タ〖ゲット巴赂で肌の滦忽を乖うことを夸京するˉ ˇリマップを乖わず·稍带券拉メモリにベクタを弥くˉ ˇMMUによりベクタの挝拌を今き哈み敦贿とするˉ ˇHigh Vector怠墙を蝗脱し·ベクタを0x00000000笆嘲に芹弥するˉ↑毋嘲フレ〖ム∈CPU毋嘲ハンドラへの苞眶∷ASPカ〖ネルの慌屯では·CPU毋嘲ハンドラの苞眶には·CPU毋嘲に簇する攫鼠を淡脖している挝拌∈毋嘲フレ〖ム∷の黎片戎孟が畔されるˉそのため·CPU毋嘲券栏箕のコンテキストを瘦赂したスタックへのポインタを畔すˉ毋嘲フレ〖ムは·タ〖ゲット髓の target_exc_handler で侯喇するˉ毋嘲涟の庭黎刨マスクの猛の艰り胺いについては·タ〖ゲット巴赂となるが·奶撅サイズは32bit笆布に箭まるとはずなので·ARMプロセッサ巴赂婶で肌のように年盗するˉ 毋嘲フレ〖ム ------------------------ | 毋嘲涟のネストカウント| 0 <-- p_excinf ------------------------ | 毋嘲涟の庭黎刨マスク | 1 ------------------------ | 毋嘲涟のCPSR | 2 ------------------------ | R0 | 3 ------------------------ | R1 | 4 ------------------------ | R2 | 5 ------------------------ | R3 | 6 ------------------------ | IP | 7 ------------------------ | LR_svc | 8 ------------------------ | 毋嘲涟のPC(提り黎) | 9 ------------------------←充り哈みの艰り胺い↑カ〖ネル瓷妄柒/嘲の充哈みIRQをカ〖ネル瓷妄柒·FIQをカ〖ネル瓷妄嘲の充哈みとするˉ↑CPUロックフラグCPUロックフラグとして·ステ〖タスレジスタのIRQビットを脱いるˉすなわち·CPUロック觉轮では·IRQビットをセットし·カ〖ネル瓷妄柒の充哈みを敦贿し·CPUロック豺近觉轮では·IRQビットをクリアするˉ↑充哈みロックフラグ充哈みロックフラグとしては·CPSRのFIQビットとIRQビットを脱いるˉ充り哈みロック觉轮では·IRQビットとFIQビットをセットするˉ===================================================================== カ〖ネル倡券荚羹けの攫鼠=====================================================================←コンテキストの冉年カ〖ネルは·充り哈み/毋嘲の掐り庚で·カ〖ネル柒のカウント脱の恃眶∈excpt_nest_count∷をカウントアップし·叫庚でカウントダウンするˉそのため·excpt_nest_count が0の眷圭はタスクコンテキスト·1笆惧の眷圭は润タスクコンテキストと冉们するˉ←毋嘲エントリ借妄称毋嘲のエントリ借妄は妥傍髓にカ〖ネルで改侍に积つˉJSPではル〖チンを鼎铜していたが·ル〖チンを鼎铜步すると·毋嘲券栏稿·办箕弄にレジスタを锣闰させるために办箕挝拌を脱いる涩妥があるため·改侍に积つように恃构したˉ称毋嘲のエントリ借妄では笆布の借妄を乖うˉ ˇタスク瓢侯箕のモ〖ドに败乖∈スタックを磊り仑える∷ ˇr0-r3,ip,lr,pcを瘦赂∈PCはダミ〖∷ ˇ傅のモ〖ドに提る ˇr0にlr·r1にspsrを·r2にCPU毋嘲戎规を掐れる ˇtarget_exc_handlerへジャンプtarget_exc_handler はタ〖ゲット髓に脱罢するˉタ〖ゲット髓に脱罢するのは·稿揭する毋嘲フレ〖ムに毋嘲涟の庭黎刨マスクが崔まれており·この庭黎刨マスクの胺いがタ〖ゲット髓に佰なるためであるˉFIQのエントリ借妄∈fiq_handler∷については·タ〖ゲット巴赂婶娄で脱罢する眷圭には·それぞれ·笆布のマクロを年盗すれば·ARM巴赂婶娄のエントリ借妄が痰跟となるˉ TARGET_FIQ_HANDLER←アイドル借妄悸乖するべきタスクがない眷圭は·ディスパッチャ〖で充哈みを钓材して·充哈みを略つ∈dispatcher_2∷ˉARM巴赂婶のコ〖ドでは·肌のようになっているˉ 充哈みを钓材 nop 充り哈み敦贿タ〖ゲット巴赂で·惧淡の借妄の洛わりに·臼排蜗モ〖ド霹に败乖する借妄を淡揭したい眷圭には·タ〖ゲット巴赂婶で·TOPPERS_CUSTOM_IDLEを年盗し·洛わりに悸乖した借妄を toppers_asm_custom_idle というアセンブラマクロとして淡揭するˉなお·toppers_asm_custom_idle の淡揭にあたっては·肌のレジスタは蝗脱できないˉ r0, r1, r2, r3, sp アセンブラマクロはC咐胳淡揭面に鸥倡するとエラ〖となるˉpr_support.S では·TOPPERS_ASM_MACRO というマクロを年盗しているため·タ〖ゲット巴赂婶で toppers_asm_custom_idle アセンブラマクロを年盗する狠には·TOPPERS_ASM_MACRO を掘凤コンパイルの掘凤として脱いることˉ←CPSRに撅にセットする猛CPSRの恃构箕·撅にセットするパタ〖ンを CPSR_ALWAYS_SET として·タ〖ゲット巴赂婶で年盗材墙であるˉ←Makefileでの年盗祸灌===================================================================== 恃构旺悟=====================================================================2008/05/13 鼎奶婶 Release 1.3.1への纳骄ˉ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -