SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
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 が呼ばれるしくみを見ました

Weitere ähnliche Inhalte

Was ist angesagt?

エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
Tetsuya Morimoto
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
 
フィボナッチ数列の作り方
フィボナッチ数列の作り方フィボナッチ数列の作り方
フィボナッチ数列の作り方
Tomoya Kawanishi
 

Was ist angesagt? (20)

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

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

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
Yasuhiro Ishii
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
Takuya Matsunaga
 

Ähnlich wie NetBSD/i386 割り込みベクタテーブル (20)

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
4章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 54章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 5
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
Slide
SlideSlide
Slide
 
cp-11. ポインタ
cp-11. ポインタcp-11. ポインタ
cp-11. ポインタ
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
Interrupts on xv6
Interrupts on xv6Interrupts on xv6
Interrupts on xv6
 
Map
MapMap
Map
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
Stager
StagerStager
Stager
 
V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 

Kürzlich hochgeladen

Kürzlich hochgeladen (10)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

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