SlideShare a Scribd company logo
NetBSD/i386 割り込みベクタテーブル
   スタート低レイヤー #4 リベンジの変 #start_printf

                   @kusabanachi
前回のあらすじ
前回のあらすじ

libcのputcharで、gdbで逆アセンブル表示
Dm fasmlrcd o ucinwie
upo sebe oefrfnto rt:
= xbf00<0:  o  $x,ex
>0ba98 +>  mv  04%a
  xbf05<5: it  08
 0ba98 +>  n  $x0
..
.

write関数で int $0x80 を呼んでいた
=>
int $0x80 の先はどこだろうか?
IDTの0x80番を見る

イメージ図
前回のあらすじ

IA32 マニュアルによると

INT n 命令は、割り込みベクタ番号n のハンドラをコールする命令
前回のあらすじ

0x80番の割り込みハンドラコール = システムコールの入口
(ユーザーモードからカーネルモードへの移動)
と予想

割り込みベクタテーブルのソースを見れば何か分かりそう
→ 割り込みベクタテーブルの場所、見つかりませんでした!
(前回終)
i386の割り込みベクタテーブル
前回、ソースコードをgrepしても手掛かりが見つけられなかったので、
CPUのマニュアルを見てみます
i386の割り込みベクタテーブル

IA-32 インテル ® アーキテクチャ ソフトウェア・デベロッパーズ・マニュア
ル 下巻 にそれっぽい内容

IA-32 システムレベルのレジスタおよびデータ構造
i386の割り込みベクタテーブル

関連する箇所だけ、ざっくり抜粋するとこんな感じ
i386の割り込みベクタテーブル

マニュアルの 2.1.4.割り込み / 例外処理 より

外部割り込み、ソフトウェア割り込み、例外は、割り込みディスクリプ
タ・テーブル (IDT)を通じて処理される。
IDT には、割り込みハンドラと例外ハンドラへのアクセスを提供するゲー
ト・ディスクリプタが集められている。
...
IDT のベースのリニアアドレスは、IDT レジスタ(IDTR)に入っている。
=> つまり、、、

IDTがi386の割り込みベクタテーブルのようだ
IDTはゲート・ディスクリプタの集まり
ゲート・ディスクリプタがハンドラへのアクセスを提供する
IDTの場所はIDTRに書いてある
i386の割り込みベクタテーブル

IDTRには LIDT命令で値を入れる

=> LIDT命令を使っている場所を探せば、IDTが見つかりそう
LIDT命令を探す
LIDT命令を探す

i386のディレクトリ下に以下のLIDT命令を呼び出す関数の定義が見つかりま
す (以降、lidt関数と呼ぶ)
src/sys/arch/i386/i386/cpufunc.S 68
ETYld)
NR(it
  m v   4 % s )   e x   * 第一引数をe x
 ol (ep,%a / 
a に入れる  /
*
 ld (ex     *ex
  i t   % a )         /   a の参照先をI T へ  /
DR *
  r t                   * 戻る  /
 e         / 
*
EDld)
N(it

上記lidt関数の呼び出し元で見つかるのは、src/sys/arch/i386/i386/machdep.c
内の

1140行 cpu_init_idt() の中
1696行 cpu_reset() の中
システムの起動時とリセット時にIDTを設定しているようだ
LIDT命令を探す

本当にlidt関数がシステム起動時に呼ばれているか、
スタート低レイヤーのWikiページの
backtraceを調べるコードを真似て確認しました

lidtの名前でダミーの関数を作り、呼出し元の情報を得る
vi itsrc eindsrpo rgo)
odld(tutrgo_ecitr*ein
{
  src 36fae*rm;
  tuti8_rm fae
 
  / it
    / l d 関数の呼出し元を調べる
  amvltl(mv %b,%":"r fae)
  s oaie"ol%ep 0  ="(rm);
  ld_ead1=fae>_ead;
  itrtdr  rm­frtdr
  fae=fae>_rm;
  rm  rm­ffae
  ld_ead2=fae>_ead;
  itrtdr  rm­frtdr
  fae=fae>_rm;
  rm  rm­ffae
  ld_ead3=fae>_ead;
  itrtdr  rm­frtdr
 
  / it
    / l d 関数が呼び出された回数も調べてみる
  +ld_on;
  +itcut
 
  / 
    / 本来のl d 関数を呼ぶ  i t l にリネームしてある)
it
(l d _ l
  ld_lrgo)
  itl(ein;
}
LIDT命令を探す

ビルドしたカーネルを起動して、ddbを使って、システム起動時に取得して
いるはずの値を見る

lidt_countの値より、lidt関数は1度だけ呼ばれている
lidt_retaddr1-3 の値より呼出し元のアドレスが分かる
begin -> init386 -> cpu_init_idt -> lidt の順でcallされている

($ objdump -S --start-address 0xc05a4000 kernel_file でアドレスから対応する関数を調べる)
LIDT命令を探す

システムの起動時にIDTを設定していることと、その関数が確認できました

lidt関数の呼出し元を追い、IDTの中身を見ます
IDTの内容を見る
begin -> init386 -> cpu_init_idt -> lidt の中の
" init386 -> cpu_init_idt " の間で、IDTの設定に関係ある箇所を見ます
IDTの内容を見る (cpu_init_idt内)

lidt関数から遡って見ていきます
src/sys/arch/i386/i386/machdep.c 1135
vi p_ntitvi)
odcuii_d(od
{
#fdfXN
ine E
  src eindsrpo ein
  tutrgo_ecitrrgo;
  stein&ein etu_d,ND  iefit0)­1;
  ergo(rgo,pnimit IT*szo(d[]  )
  ld(rgo)
  it&ein;
#le/ E /
es *XN*
  ..
  .
    / 
        / こっちは今回追わない
#ni *!E /
edf/ XN*
}

struct region_descriptor のポインタが lidt関数の引数
IDTの内容を見る (cpu_init_idt内)
src/sys/arch/i386/include/segments.h 177
src eindsrpo 
tutrgo_ecitr{
  usge dlmt1;   / emn xet*
  nindr_ii:6    *sgetetn /
  usge dbs:2    / aeades /
  nindr_ae3;    *bs drs *
}_pce;
 _akd

lidt関数の引数の構造体

CPUマニュアルより、IDTRに入る値
16bitのリミットは、IDTのバイト数 - 1
32bitのベースは、IDT先頭のリニアアドレス(仮想アドレス)
lidt関数の引数は、IDTRに書き込む値の形式になっている
IDTの内容を見る (cpu_init_idt内)
src/sys/arch/i386/i386/machdep.c 1135 (さっき見た関数)
vi p_ntitvi)
odcuii_d(od
{
#fdfXN
ine E
  src eindsrpo ein
  tutrgo_ecitrrgo;
  stein&ein etu_d,ND  iefit0)­1;
  ergo(rgo,pnimit IT*szo(d[]  )
  ld(rgo)
  it&ein;
#le/ E /
es *XN*
  ..
  .
#ni *!E /
edf/ XN*
}
src/sys/arch/i386/i386/machdep.c 1096
vi
od
steinsrc eindsrpo r,vi bs,sz_ ii)
ergo(tutrgo_ecitr*d od*ae ietlmt
{
 
  r­r_ii  itlmt
  d>dlmt=(n)ii;
  r­r_ae=(n)ae
  d>dbs  itbs;
}

setregion は2つの引数を、IDTRに書き込む構造体に代入するだけ
limit値 = NIDT * sizeof(idt[0]) - 1; // IDTのサイズ-1
base値 = pentium_idt;      // pentium_idt が IDT先頭のアドレス
IDTの内容を見る (init386内)

cpu_init_idt() の呼出し元の init386() を見る
src/sys/arch/i386/i386/machdep.c 1497
vi
od
ii36pdrtfrtaal
nt8(ad_ is_vi)
{
..
.
  pa_etrp(d_ad,itpdr MPO_EDV_RTWIE )
  mpkne_aitvdr d_ad,V_RTRA|MPO_RT,0;
  pa_paepa_enl);
  mpudt(mpkre()
  mme(vi )d_ad,0 AESZ)
  est(od*itvdr ,PG_IE;
 
#fdfXN
ine E
  itii(;
  d_nt)
 
  it=(tutgt_ecitr*itvdr
  d  src aedsrpo )d_ad;
  pa_etrp(etu_d_ad,itpdr MPO_ED )
  mpkne_apnimitvdr d_ad,V_RTRA,0;
  pa_paepa_enl);
  mpudt(mpkre()
  pnimit=(no ecitr*pnimitvdr
  etu_d  uindsrpo )etu_d_ad;
..
.

pmapに関連する関数が呼ばれている
IDTの内容を見る (init386内)

pa_etrp(d_ad,itpdr MPO_EDV_RTWIE )
mpkne_aitvdr d_ad,V_RTRA|MPO_RT,0;
pa_paepa_enl);
mpudt(mpkre()

PMAP(9) より 意訳
 -- 仮想メモリシステムのマシン依存部
void pmap_kenter_pa
(vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags)
物理アドレス pa を仮想アドレス va に prot の保護属性で"unmanaged" マッピ
ングする。
void pmap_update(pmap_t pmap)
pmap モジュールに、正しい物理マッピングが必要なタイミングを通知す
る。
これにより、全ての遅延されていた仮想-to-物理マッピングは更新される。
IDTの内容を見る (init386内 "unmanaged" マッピングとは)

引き続き PMAP(9) より 意訳

pmapモジュールは仮想記憶のページ毎の変更/参照の情報を記録する
この情報はページデーモンがページをスキャンした際に使う
参照情報は、ページが再配置対象か否か
変更情報は、ページを記憶装置に書き戻す必要があるか
"unmanaged" マッピングのページは、変更/参照の情報の記録対象外
"unmanaged" マッピングの使用は限定されるべき
割り込みコンテキストの中での使用
仮想記憶システムで管理しない物理アドレスのマッピング
"unmanaged" マッピングはカーネルの仮想アドレスにのみマッピング可
つまり、pmap_kenter_pa は、IDTを配置するメモリのために
再配置の対象から外れるページをマッピングしているようだ
IDTの内容を見る (init386内)
src/sys/arch/i386/i386/machdep.c 1497 (もう一度戻って)
..
.
vdrtitvdr
ad_ d_ad;
pdrtitpdr
ad_ d_ad;
..
.
vi
od
ii36pdrtfrtaal
nt8(ad_ is_vi)
{
..
.
  pa_etrp(d_ad,itpdr MPO_EDV_RTWIE )
  mpkne_aitvdr d_ad,V_RTRA|MPO_RT,0;
        /   d _ a d ( i t a )  i t p d r p y i a ) を 
        / i t v d r v r u l と  d _ a d ( h s c l   マッピング
        /   e d r t 属性
    /RaWie
  pa_paepa_enl);
  mpudt(mpkre()
    / 
        / 遅延されたマッピングを更新する
  mme(vi )d_ad,0 AESZ)
  est(od*itvdr ,PG_IE;
    / 
        / マップしたページはゼロクリアする
..
.

マッピングされるidt_vaddrとidt_paddrは、
それぞれ、仮想メモリと物理メモリの
利用できるメモリページのアドレスが入っている変数
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属性のメモリページのアドレスを書いている
IDTの内容を見る (init386内)
src/sys/arch/i386/i386/machdep.c 1537
vi
od
ii36pdrtfrtaal
nt8(ad_ is_vi)
{
..
.
  / xetos*
  *ecpin /
  fr(  ;x<3;x+ 
  o x=0   2 +){
    itvcrsrex;
    d_e_eev()
    stae&d[] DVCecpin)x,0 D_Y36G,
    egt(itx,ITE(xetos[] ,STSS8IT
      ( =3|  =4  E_P  E_P,
      x=  |x= )?SLUL:SLKL
      GE(CD_E,SLKL)
      SLGOESL E_P);
  }
  
            /     ~ 2 番の例外
      /↑03 
 
  / e­tl nerp aefrssal /
  *nwsyeitrutgt o ycls*
  itvcrsre18;
  d_e_eev(2)
  stae&d[2] ITE(ycl) ,STSS8IT E_P,
  egt(it18,&DVCssal,0 D_Y36G,SLUL
    GE(CD_E,SLKL)
    SLGOESL E_P);
              / ↑ 1 8 → これが  x 0 !
            /     2 番   
08 !
  itvcrsre0d)
  d_e_eev(x2;
  stae&d[x2,&DVCsr_atrp,0 D_Y36G,
  egt(it0d] ITE(v4fsta) ,STSS8IT
    SLUL SLGOESL E_P);
    E_P,GE(CD_E,SLKL)
       /↑0d番
      /  x2
..
.
    c u i i _ d ( ;     / ← I T にI T
    p _ n t i t )     /     D R D のアドレスを書く

idt_vec_reserve(ベクタ番号) → setgate() の流れ
IDTの0x80番を見る
idt_vec_reserve(0x80) → setgate() を見ます
IDTの0x80番を見る

idt_vec_reserve() を見ます
itvcrsre18;
d_e_eev(2)
stae&d[2] ITE(ycl) ,STSS8IT E_P,
egt(it18,&DVCssal,0 D_Y36G,SLUL
  GE(CD_E,SLKL)
  SLGOESL E_P);
src/sys/arch/x86/x86/idt.c 105
vi
od
itvcrsreitvc
d_e_eev(n e)
{
  itrsl;
  n eut
 
  KSETmtxond&p_ok |!poln)
  ASR(ue_we(culc)| m_nie;
    /  
        / ↑ 現在のL P
W またはC U u e を保持している
P がm t x
        /     または 
    /  
マルチプロセッサでない(m _ n i e が  a s )ので排他不要
poln  fle
 
  rsl  d_e_lo(e,vc;
  eut=itvcalcvc e)
    /  
        / ↑ ベクタ番号を引数にa l c
l o を呼ぶ
  i rsl =vc 
  f(eut! e){
    pnc"s aldt eev e d,_fn_,vc;
    ai(%:fie orsrevc%" _uc_ e)
  }
  
}
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
}
IDTの0x80番を見る

setgate() を見ます
itvcrsre18;
d_e_eev(2)
stae&d[2] ITE(ycl) ,STSS8IT E_P,
egt(it18,&DVCssal,0 D_Y36G,SLUL
  GE(CD_E,SLKL)
  SLGOESL E_P);
src/sys/arch/x86/x86/idt.c 1082
vi
od
staesrc aedsrpo g,vi fn,itag,ittp,itdl
egt(tutgt_ecitr*d od*uc n rs n ye n p,
  itsl
  n e)
{
 
    / 
        / 第一引数のi t
d のスロット(ゲート)の構造体に値を入れていく
  g­g_ofst=(n)uc
  d>dlofe  itfn;
  g­g_eetr=sl
  d>dslco  e;
  g­g_tcy=ag;
  d>dskp  rs
  g­g_x=0
  d>dx  ;
  g­g_ye=tp;
  d>dtp  ye
  g­g_p  p;
  d>ddl=dl
  g­g_  ;
  d>dp=1
  g­g_ifst=(n)uc> 6
  d>dhofe  itfn >1;
}
src/sys/arch/i386/include/segments.h 229
#eieSTSS8IT 1 / ytm36itrutgt /
dfn D_Y36G  4 *sse 8 nerp ae*

type は 14 (interrupt gate) が指定されている
IDTの0x80番を見る

CPUマニュアルより、IDTのゲートは3タイプあり、
type 14(0x1110) の割り込みゲートが 0x80番のベクタには使われている
IDTの0x80番を見る

itvcrsre18;
d_e_eev(2)
stae&d[2] ITE(ycl) ,STSS8IT E_P,
egt(it18,&DVCssal,0 D_Y36G,SLUL
  GE(CD_E,SLKL)
  SLGOESL E_P);
src/sys/arch/i386/i386/machdep.c 1121
#eieITE(ae  _CNA(,nm)
dfn DVCnm)  _OCTX ae

&IDTVEC(syscall) は &Xsyscall
src/sys/arch/i386/include/segments.h 98
#eieSLUL  3   / srpiieelvl*
dfn E_P       *ue rvlg ee /

SEL_UPL はユーザー特権レベル
src/sys/arch/i386/include/segments.h 93,109,304
#eieGE(,) (()< )|r   /  lblslco /
dfn SLsr  (s <3  )   *agoa eetr*
#eieGOESL 1 / enlcd ecitr*
dfn CD_E    *Kre oedsrpo /
#eieSLKL  0   / enlpiieelvl*
dfn E_P       *kre rvlg ee /

GSEL(GCODE_SEL, SEL_KPL)) はセグメント・セレクタ(次ページで説明)
カーネルのコードセグメントに、カーネル特権レベルを指定してアクセスす
る
IDTの0x80番を見る (セグメントについて)

i386ではメモリがセグメントと呼ばれる複数のアドレス空間に割り当てられ
ていて、
セグメントとセグメント内のオフセットを指定してメモリアクセスすること
ができる。
セグメントのアドレスやアクセス権などはGDT(グローバル・ディスクリ
プタ・テーブル)が持っている
セグメント・セレクタはGDTのインデックス。セグメントの指定に使う
セグメント・セレクタの 3ビット以降がGDTのインデックスを示す。0-1ビ
ットはセグメントで要求される特権レベル
IDTの0x80番を見る

セグメント指定のメモリアクセス
IDTの0x80番を見る (セグメントについて)

GDTもIDTと同様に初期化を行うが、
GDTの初期化に関係するコードは今回詳しく見ません
src/sys/arch/i386/i386/machdep.c 1158
/ aegtgtsadmmr emns*
*mk d ae n eoysget /
stemn(gtGOESL.d ,0fff D_EEA E_P,1 )
esget&d[CD_E]s,0 xff,STMMR,SLKL ,1;
   /↑
    /    カーネルのコードセグメントのセット。ベースアドレス  。リミット  G y e
0
4Bt
stemn(gtGAASL.d ,0fff D_ERA E_P,1 )
esget&d[DT_E]s,0 xff,STMMW,SLKL ,1;
   /↑
    /    カーネルのデータセグメントのセット。ベースアドレス  。リミット  G y e
0
4Bt

セグメントのベースがゼロなので、
アクセス先のアドレスとセグメントの先頭からのオフセットは同じ値
IDTの0x80番を見る

仮想アドレス空間全体をセグメントにしている
IDTの0x80番を見る

itvcrsre18;
d_e_eev(2)
stae&d[2] ITE(ycl) ,STSS8IT E_P,
egt(it18,&DVCssal,0 D_Y36G,SLUL
  GE(CD_E,SLKL)
  SLGOESL E_P);
src/sys/arch/x86/x86/idt.c 1082 (再度確認)
vi
od
staesrc aedsrpo g,vi fn,itag,ittp,itdl
egt(tutgt_ecitr*d od*uc n rs n ye n p,
  itsl
  n e)
{
 
  g­g_ofst=(n)uc
  d>dlofe  itfn;
    / 
        / セグメント内の下位1 b t
6 i オフセット: X y c l  
  s s a l の下位アドレス
  g­g_eetr=sl
  d>dslco  e;
    / 
        / セグメント・セレクタ: カーネルのコードセグメント
 
  g­g_tcy=ag;
  d>dskp  rs
    / 
        / 移動前のスタックから移動後のスタックにコピーするデータサイズ: 0
  が入る
  g­g_x=0
  d>dx  ;
    / 
        / 使用されない3 i
bt
  g­g_ye=tp;
  d>dtp  ye
    / 
        / ゲートのタイプ: 割り込みゲート
 
  g­g_p  p;
  d>ddl=dl
    / 
        / 特権レベル: ユーザー特権レベル
 
  g­g_  ;
  d>dp=1
    / 
        / このゲートが存在することを示すフラグ
  g­g_ifst=(n)uc> 6
  d>dhofe  itfn >1;
    / 
        / セグメント内の上位1 b t
6 i オフセット: X y c l の上位アドレス
 ssal
}
IDTの0x80番を見る

0x80番の設定を見たので、戻ります
src/sys/arch/i386/i386/machdep.c 1537
vi
od
ii36pdrtfrtaal
nt8(ad_ is_vi)
{
..
.
  / xetos*
  *ecpin /
  fr(  ;x<3;x+ 
  o x=0   2 +){
    itvcrsrex;
    d_e_eev()
    stae&d[] DVCecpin)x,0 D_Y36G,
    egt(itx,ITE(xetos[] ,STSS8IT
      ( =3|  =4  E_P  E_P,
      x=  |x= )?SLUL:SLKL
      GE(CD_E,SLKL)
      SLGOESL E_P);
  }
  
 
  / e­tl nerp aefrssal /
  *nwsyeitrutgt o ycls*
  itvcrsre18;
  d_e_eev(2)
  stae&d[2] ITE(ycl) ,STSS8IT E_P,
  egt(it18,&DVCssal,0 D_Y36G,SLUL
    GE(CD_E,SLKL)
    SLGOESL E_P);
  itvcrsre0d)
  d_e_eev(x2;
  stae&d[x2,&DVCsr_atrp,0 D_Y36G,
  egt(it0d] ITE(v4fsta) ,STSS8IT
    SLUL SLGOESL E_P);
    E_P,GE(CD_E,SLKL)
 
    /  
        / ↑ ここまでI T ~ 2
D の0 3 番、0 8 番、0 d 番のゲートを設定
x0
x2
..
.
  cuii_d(;
  p_ntit)
    /  
        / ↑ この中で設定したI T
D の先頭アドレスとリミットをI T に書き込む
DR
まとめ
まとめ

システム起動時のIDT設定 1
IDTに使うページをマップする
まとめ

システム起動時のIDT設定 2
IDTのベクタの割り当て・設定
まとめ

システム起動時のIDT設定 3
IDTRへの書き込み
まとめ

アプリ実行時
まとめ

libc内の int 0x80 から Xsyscall が呼ばれるしくみを見ました

More Related Content

PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
PDF
Emcpp item31
PPT
shared_ptr & weak_ptr (ppt 初版, DL 専用)
PDF
Boost Fusion Library
PDF
詳解Dexファイルフォーマット
PPT
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
PDF
クロージャデザインパターン
PDF
Dps143 ruo ando
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Emcpp item31
shared_ptr & weak_ptr (ppt 初版, DL 専用)
Boost Fusion Library
詳解Dexファイルフォーマット
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
クロージャデザインパターン
Dps143 ruo ando

What's hot (20)

PPT
Impractical Introduction of Boost Spirit Qi [PPT]
PDF
エキ Py 読書会02 2010/9/7
PDF
C++ Template Meta Programming の紹介@社内勉強会
PDF
Dalvikバイトコードリファレンスの読み方 改訂版
PDF
templateとautoの型推論
PDF
Unity2015_No10_~UGUI&Audio~
PDF
すごいConstたのしく使おう!
KEY
core dumpでcode golf
PDF
怠惰なRubyistへの道 fukuoka rubykaigi01
PDF
C++14 Overview
PDF
I phoneアプリ入門 第5回
PDF
第1回勉強会スライド
PDF
Python physicalcomputing
PDF
boost::shared_ptr tutorial
PDF
第2回勉強会スライド
PPT
Uart受信設計2013
PDF
constexpr idioms
PDF
C++0x 言語の未来を語る
PDF
フィボナッチ数列の作り方
PPTX
Visual C++で使えるC++11
Impractical Introduction of Boost Spirit Qi [PPT]
エキ Py 読書会02 2010/9/7
C++ Template Meta Programming の紹介@社内勉強会
Dalvikバイトコードリファレンスの読み方 改訂版
templateとautoの型推論
Unity2015_No10_~UGUI&Audio~
すごいConstたのしく使おう!
core dumpでcode golf
怠惰なRubyistへの道 fukuoka rubykaigi01
C++14 Overview
I phoneアプリ入門 第5回
第1回勉強会スライド
Python physicalcomputing
boost::shared_ptr tutorial
第2回勉強会スライド
Uart受信設計2013
constexpr idioms
C++0x 言語の未来を語る
フィボナッチ数列の作り方
Visual C++で使えるC++11
Ad

Similar to NetBSD/i386 割り込みベクタテーブル (20)

PDF
4章 Linuxカーネル - 割り込み・例外 5
PDF
PWNの超入門 大和セキュリティ神戸 2018-03-25
PDF
0章 Linuxカーネルを読む前に最低限知っておくべきこと
PDF
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
PPTX
x86-64/Linuxに独自メモリ空間を勝手増設
PPTX
x86-64/Linuxに独自メモリ空間を勝手増設
PDF
デバドラを書いてみよう!
PDF
いでよ、電卓!
PDF
システムコールフックを使用した攻撃検出
PDF
Exploring the x64
PDF
あるキャッシュメモリの話
PDF
ただのリンカを書いた話.pdf
PDF
仮想記憶の構築法
PDF
仮想化技術によるマルウェア対策とその問題点
PDF
あるmmapの話
PDF
MMIO on VT-x
PDF
あなたの知らないnopたち@ラボユース合宿
PDF
Spectre/Meltdownとその派生
PPTX
Interrupts on xv6
PDF
Page frame management
4章 Linuxカーネル - 割り込み・例外 5
PWNの超入門 大和セキュリティ神戸 2018-03-25
0章 Linuxカーネルを読む前に最低限知っておくべきこと
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
デバドラを書いてみよう!
いでよ、電卓!
システムコールフックを使用した攻撃検出
Exploring the x64
あるキャッシュメモリの話
ただのリンカを書いた話.pdf
仮想記憶の構築法
仮想化技術によるマルウェア対策とその問題点
あるmmapの話
MMIO on VT-x
あなたの知らないnopたち@ラボユース合宿
Spectre/Meltdownとその派生
Interrupts on xv6
Page frame management
Ad

NetBSD/i386 割り込みベクタテーブル