25. IDTの内容を見る (init386内)
src/sys/arch/i386/i386/machdep.c 1501
vi
od
ii36pdrtfrtaal
nt8(ad_ is_vi)
{
..
.
/
/ 前ページの続き
itii(;
d_nt)
/
/ この関数の中身は空
it=(tutgt_ecitr*itvdr
d src aedsrpo )d_ad;
/
/ さっきマッピングしたアドレスを(キャストして)i t
d 変数に割り当てる
pa_etrp(etu_d_ad,itpdr MPO_ED )
mpkne_apnimitvdr d_ad,V_RTRA,0;
/
/ さっきマッピングした物理アドレス d _ a d ( h s c l
i t p d r p y i a ) を、再度マッピング
/
/ 今度はR a O l 属性
edny
pa_paepa_enl);
mpudt(mpkre()
/
/ 遅延されたマッピングを更新する
pnimit=(no ecitr*pnimitvdr
etu_d uindsrpo )etu_d_ad;
/
/ マッピングしたアドレスを(キャストして)
/ it
/ l d 関数の呼出しでI T
D のベースとして扱われる変数に割り当てる
..
.
IDT中身の設定はReadWrite属性のメモリページから行い、
IDTRにはReadOnly属性のメモリページのアドレスを書いている
29. IDTの0x80番を見る
src/sys/arch/x86/x86/idt.c 83
/
*
* 与えられた範囲内で、I T
D ベクタを1
スロット割り当てる.
* 初期ブート時のシングルスレッドでなければ、c u
p のロックが行われる.
/
*
it
n
itvcalcitlw n ih
d_e_lo(n o,ithg)
{
itvc
n e;
KSETmtxond&p_ok |!poln)
ASR(ue_we(culc)| m_nie;
fr(e o;vc< ih e+){
o vc=lw e =hg;vc+
i italca[e]= ){
f(d_lompvc =0
/ d_e_re)
* i t v c f e ( はロックしないかもしれないので, m m a する. *
ebr
/
mma_yc)
ebrsn(;
italca[e]=1
d_lompvc ;
/ d _ l o m p v c でスロットの割り当てを管理して、
/↑italca[e]
/ 二重の割当てを避ける
/
rtr e;
eunvc
/
/ ↑ 割り当てたベクタ番号を返す
}
}
rtr ;
eun0
}