Linux0.11カーネルソース - スイッチングカーネルモードプロセス改善

カーネル・モード・プロセスLinux0.11モード切替は、TSSのLJMPをジャンプするために使用されているので、効率が悪く、したがって代わりにカーネルスタックバージョンスタックスイッチを使用する、最適化のために考慮

あなたは、タスクを実行する必要があります

  1.書き換えスケジュール、switch_to機能

  2.改変関数一緒に

  3.変更フォーク機能

この次のセグメント記述子を一旦、TSSセグメントを切り替え後の目標を見つけるために使用されるように、現在のスケジュールのLinux 0.11()関数での作業は、第1次の次の処理にアレイ位置を見つけることであり、これはGDT内の次のn (次の)そのswitch_toマクロ展開上記直接呼び出し解析の次の値は、図に示すように、TSSの切り替えを行うことができるが切り替わります。

新しいswitch_toはPCBのPCB、現在のプロセスのターゲット・プロセス、コアカーネルスタック、現在のプロセスのターゲット・プロセスを使用しますので、今、私たちは、スイッチングのプロセスを完了するために、スイッチの代わりにカーネルスタックを使用するのでは、TSSを切り替える必要はありません。スタックおよびその他の情報。カーネルスタックのLinux 0.11プロセスとPCBは、このページメモリ低いアドレスに配置されているメモリの同じページ(4KBのメモリのいずれか)、上のPCBのプロセスので、位置、このページメモリ高いアドレススタック、また、現在のプロセス以来PCBは、グローバル変数の現在のポイントなので、ちょうど新しいswitch_toを伝える()関数は、その上にターゲットプロセスのPCBへのポインタです。しかし、TSSは、(次の)不要になったが、また、それはまた、次の中を通過しないだろうが、それはTSSのプロセスを採用していないようLDTは(次の)まだ必要とされている、と言うことですつまり、各プロセスは今、自分のTSSを持っていません切り替えが、各プロセスは、独自のLDT、アドレスまたはアドレスを分離しなければならない必要があり、切り替え処理がLDTを切り替える関与しなければなりません。

ソースコードの変更をする必要があり、対応するSwitch_to。

もし((* P) - >状態== TASK_RUNNING &&(* P) - >カウンタ> C)
    C =(* P) - >カウンタ、次= I。

// ...... 

switch_to(次の);

変更

もし((* P) - >状態== TASK_RUNNING &&(* P) - >カウンタ> C)
    C =(* P) - >カウンタ、次= I、pnext = * P。

// ....... 

switch_to(pnext、LDT(次))。

 

その後、機能を変更switch_to

switch_to:
    スタックフレームを処理
    PUSHLEBP 
    MOVL%ESP、%EBP
    
    処理プッシュ登録
    PUSHLECX 
    PUSHLEBXを
    PUSHLEAX
    
     :!次PCBにEBX、現在の点を図8(%のEBP)は、2つのグリッドEBPを示しますので、二つのパラメータpNext switch_toとLDT(次の)ので、2つのセルまで正確にpNextことがある
    MOVL 。8(EBPの%)、%EBX 
    CMPLEBX、現在の
    
    JE 1F
ハンドオーバPCB
    ...
カーネルスタックポインタTSSのは、リライト
    ...
ハンドオーバカーネルスタック
    ...
ハンドオーバLDT
    ... 
    MOVL $ 0x17の、%ECX 
    MOV%CX、%FS
そして、コプロセッサに対応するためCLTSの後ろではなく、関係のテーマため、ここでは説明しません
    CMPLeaxに、last_task_used_math 
    JNE 1F 
    CLTS 

1:POPL%EAX 
    POPLEBX 
    POPLECX 
    POPLEBP 
RET

おすすめ

転載: www.cnblogs.com/zsben991126/p/12038747.html