Linuxカーネル読書会 ●システムの起動 □ Linuxカーネルの起動 ☆ エントリポイントとCPUの初期化 ☆ カーネル資源の初期化

Slides:



Advertisements
Similar presentations
九州工業大学 塩田裕司 光来健一.  仮想マシンは必要なときだけ動かす使い方が一般 的 ◦ 一台の計算機上に複数の計算機を仮想的に作成できる ◦ デスクトップ  異なる OS を使用するため作成 ◦ サーバ  最大負荷に合わせた数の仮想マシンを作成  長期間使わない仮想マシンも存在する VM.
Advertisements

Cygwin 上の inetd /etc/inetd.conf /etc/inetd.conf 環境変数 CYGWIN と PATH の確認 環境変数 CYGWIN と PATH の確認 サービスへの登録と起動 サービスへの登録と起動 ftp サービスへのアクセスの確認 ftp サービスへのアクセスの確認.
システムプログラミング 第10回 情報工学科 篠埜 功. 今回の内容 プロセス(続き) – execve システムコール 現在のプロセスを、引数に与えられたファイル(実行 形式ファイルあるいはシェルスクリプト等の実行可能 なファイル)を受け取り、現在のプログラムをそれで 置き換える(変身)。 fork.
Linuxを組み込んだマイコンによる 遠隔監視システムの開発
■プロセスとfileの関係 プロセスが一つファイルをオープンすると以下のようなデータ構造が作られる。
安全なログオン手順 2004/08/26 Port139 伊原 秀明.
PC作業の一時停止 ●「スタンバイ(サスペンド)」: メモリには電源が供給される。実行中のデータがそのままメモリに保持されるため、作業を中断した状態から 数秒で再開ができる。省電力。 操作: 「スタート」→「電源オプション」→「スタンバイ」とクリックする。 ●「休止状態」: メモリの内容をハードディスクに退避してから全デバイスの電源をオフ。作業を中断した状態からの再開ができる。ノートPCでは電池が消耗しない。
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
■パス検索 各種ファイルを操作するには、まずパス名をiノードに変換しなければならない。 以下にパス名をiノードに変換する関数の説明を行う。
Linux インストール      のための基礎知識 物理実験 I 情報実験第9回 2003/12/12 中神 雄一.
物理実験 I 情報実験第9回 2004/12/10 小西 丈予 2003/12/12 中神 雄一
物理実験 I 情報実験第9回 Modified 2005/12/2 徳永 義哉Original 2003/12/12 中神 雄一
システムプログラミング実験 (OS演習) 第9回
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
PCの情報を得る - 「システム情報」 ①「スタート」→「すべてのプログラム」→「アクセサリ」→「システム ツール」→「システム情報」とクリックする。 ②左欄の項目を選択すると、右欄に情報が表示される。
データ構造とアルゴリズム 第10回 mallocとfree
中村孝介(九州工業大学) 光来健一(九州工業大学/JST CREST)
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
バックドア(rootkit&rootshell) vs Tripwire
オペレーティングシステム (OSの機能と構造)
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
Debian GNU/Linux ー Linuxインストールに必要な基礎知識 ー 三上 彩 鈴木 倫太郎
(original Takagi & Saito, 2007)
App. A アセンブラ、リンカ、 SPIMシミュレータ
2006年度 計算機システム演習 第4回 2005年5月19日.
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
Linuxカーネルについて 2014/01.
オペレーティングシステム i386アーキテクチャ(2)
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
VMマイグレーションを可能にするIDSオフロード機構
Linux リテラシ2006 第6回 デーモン CIS RAT.
RT-Linuxを用いた 多入力パルス波高分析システムの開発
全体ミーティング 金田憲二.
マルチスレッド処理 マルチプロセス処理について
実行時情報に基づく OSカーネルのコンフィグ最小化
オペレーティングシステム イントロダクション
Ibaraki Univ. Dept of Electrical & Electronic Eng.
仮想計算機を用いたサーバ統合に おける高速なリブートリカバリ
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
オペレーティングシステム 第2回 割り込みとOSの構成
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
PC作業の一時停止 ●「スタンバイ(サスペンド)」: メモリには電源が供給される。実行中のデータがそのままメモリに保持されるため、作業を中断した状態から 数秒で再開ができる。省電力。 操作: 「スタート」⇒「電源オプション」⇒「スタンバイ」とクリックする。 ●「休止状態」: メモリの内容をハードディスクに退避してから全デバイスの電源をオフ。作業を中断した状態からの再開ができる。ノートPCでは電池が消耗しない。
仮想マシンを用いた 既存IDSのオフロード
画像処理プログラミング 知的画像処理研究室 M2 小林 佳奈美.
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
オペレーティングシステム (OSの機能と構造)
参照されないリテラル 長谷川啓
実装について 前田俊行.
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
オペレーティングシステムJ/K 2004年10月4日
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
ネットワーク・プログラミング デバイスドライバと環境変数.
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
Inline 展開のアルゴリズム 長谷川啓
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
オペレーティングシステム (OSの機能と構造)
全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える
プログラミング演習I 2003年6月11日(第9回) 木村巌.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング プロセスとファイルシステム管理.
L4-Linux のメモリ管理における問題点とその解決策
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
Presentation transcript:

Linuxカーネル読書会 ●システムの起動 □ Linuxカーネルの起動 ☆ エントリポイントとCPUの初期化 ☆ カーネル資源の初期化 □ Linuxカーネルの起動 ☆ エントリポイントとCPUの初期化 ☆ カーネル資源の初期化 ☆ initプロセスの起動 ●システムの終了 ☆ システムの正常終了 ☆ システムの異常終了

Linuxカーネルの起動 - ブートに必要なファイル ■システムの起動  Linuxカーネルの起動 - ブートに必要なファイル LILO(LInux LOader)を使用してLinuxをブートするときに必要になるファイル ●プライマリブートローダ ブートセクタまたはパーティションテーブルのブートセクタにある。 ●カーネルイメージ 通常はvmlinuzまたはvzImageという名前になっている。 ●マップファイル デフォルトコマンドライン、ディスクリプタテーブル、RAMディスクイメージとカーネ ルイメージ、イニシャルグリーティングメッセージのセクタ情報、キー変換テーブル などの情報が入っている。 ●LILOブートローダー boot.bという名前で、first.Sとsecond.Sのバイナリコード。 カーネルイメージの内容 カーネルの オリジナルブートローダー フロッピィディスクで起動する 場合のみ使用される。 LILOでは、書き込まれている パラメータだけを使用。 512Byte カーネルの セットアップコード カーネル本体

Linuxカーネルの起動 - LILOブートローダー LILOがインストールされている場合、マシンの電源をONにすると「LILO」と表示される。 ロードが失敗した場合、表示されているメッセージでエラーを判断できる。 メッセージなし LILOがまったくロードされていない。LILOがインストールされていないか LILOが入っている領域がアクティブになっていない。 LI ローダの最初のステップにより、第2ステップをロードできたが、第2ステッ プの処理が失敗している。誤ったジオメトリもしくはローダを再インストール せずに、boot.bファイルを移動したことが考えられる。 LIL ローダの第2ステップが開始されたがマップファイルから記述子テーブル が読み取れない。誤ったジオメトリもしくは物理的な欠陥が考えられる。 LIL? ローダーの第2ステップが誤ったアドレスにロードされた。原因はLIの時と 同じ。 LIL- 記述子テーブルに欠陥がある。誤ったジオメトリもしくはローダーを再イン ストールしないでマップファイルを移動したことが考えられる。 LILO ローダー全てが正常にロードされた。

Linuxカーネルの起動 - エントリポイントとCPUの初期化 LILOによってメモリ上にカーネルが展開されると、カーネルの先頭である stextエントリ に制御が渡る。 arch/i386/kernel/head.s ENTRY(stext) ENTRY(_stext) startup_32: 既知の値にセグメントをセット ページテーブルの初期化 ページングを有効 BSS領域をクリア 32ビットシステムの設定 call SYMBOL_NAME (start_kernel) L6: jmp L6 Init/main.c start_kernel() { : }

Linuxカーネルの起動 - カーネル資源の初期化 start_kernel () は、カーネルの様々な機能やデータ構造の初期化を行うルーチンであり、 初期化プロセスのコンテキストで実行される。初期化処理が終了すると init プロセスを生成 し、アイドルプロセスとなる。 ブートから渡されたパラメータの解析を行う。 Linuxカーネル自体が受け付けるパラメタ以外 の解析は、各種ドライバが以下の形式で登録 した関数を呼び出すことで実現する。 これらで解決できないオプションは、/etc/initを 起動する時の引数として渡す。 Setup_baa(char *line) { lineに渡されたオプションの解析 } __setup (“hoge=“, setup_baa); start_kernel () Linux起動メッセージの出力 <各種初期化処理> trap_init (); init_IRQ (); sched_init (); time_init (); : parse_options (); smp_init (); init プロセス起動 kernel_thread (init) アイドルプロセスになる cpu_idle ()

Linuxカーネルの起動 - initプロセスの起動 即座に /etc/init が動作を開始するわけではなく、以下の関数を実行するカーネルスレッド として実行される。init はファイルシステム上の init コマンドを実行する前に、カーネル初期 化処理の続きである do_basic_setup () を実行する。 init () カーネルの初期化処理 do_basic_setup () 標準入出力用にコンソール /dev/console をオープンする。 if (BOOTでコマンドが指定されている) BOOTで指定されたコマンドをexecする initコマンドのexec if (init コマンドのexecに失敗)シェル /bin/sh をexecする do_basic_setup () (各種初期化処理) バスの初期化(PCIバスなど) ネットワークデータ初期化 sock_init () 各種機能の初期化(各種デバイスドライバの初期化) do_initcalls() 各種ファイルシステムの登録 filesystem_setup () PCカードの初期化 init_pcmcia_ds() rootファイルシステムのマウント mount_root () devfsのマウント mount_devfs_fs() ※devfsはinodeとdentryだけの実態の無いファイルシステム) if (RAMディスクがROOTの場合) スレッドで /linuxrc を実行 本物のrootをマウントし直す

初期化 プロセス idleプロセス /boot/vmlinuz 起動 initプロセス exec /etc/init IPL /etc/inittab rcファイル実行

__initcall (init_foo); 各種初期化関数を do_initcalls() で呼び出されるようするには、以下のようにする必要が ある。例えば、システムコール起動時に init_foo() という関数が呼び出されるようにするに は、その機能の中で以下のように宣言する。自動的に __initcall_start テーブルに登録され システム起動時に do_initcalls () から呼び出される。 init_foo () { foo 機能の初期化; } __initcall (init_foo); ただし、モージュールとしてコンパイルできるものは、__initcall (init_foo) の代わりに、 module_init (init_foo) と宣言する。 ※Linux カーネルへのスタティックリンクとしてコンパイルする場合には、__initcall (init_foo)  として置き換えられる。 ※モジュールとしてコンパイルする場合には、init_module () に置き換えられ、モジュールの  ロード時に初期化関数として呼び出される。

初期化 プロセス idleプロセス /boot/vmlinuz 起動 linuxrc initプロセス inirrdマウント exec IPL /boot/vmlinuz 起動 linuxrc initプロセス 起動とexec inirrdマウント exec 本当のroot再マウント /etc/init /etc/inittab rcファイル実行

/etc/inittabの例 id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 ud::once:/sbin/update 1:12345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2

initコマンド /etc/inittabを参照し、定義された処理を実行 fsck /etc/rc.sysinit mount Level 1 /etc/rc.d/rc1.d/* Level 2 /etc/rc.d/rc2.d/* Level 3 /etc/rc.d/rc3.d/* Level 5 /etc/rc.d/rc5.d/* mingetty /dev/ttyS1 mingetty /dev/ttyS2 mingetty /dev/ttyS3

CPU起動 CPU 0 CPU 3 CPU 2 CPU 1 マルチプロセッサシステムの起動 マルチプロセッサシステムであっても、システムの起動は、シングルプロセッサマシンとして 動作している。2つめ以降のCPUの起動は、1つめのCPUがカーネル初期化関数である start_kernel () の最後に呼び出す smp_init () で行われる。 最初はシングルプロセッサ マシンとして起動する CPU 0 CPU 3 start_kernel() smp_init() CPU 2 CPU 1 CPU起動

smp_init () では、各CPU専用の初期化プロセスを生成する。これらの各CPU専用の初期化 プロセスは、start_secondary () から実行を開始するようにコンテキストを初期化する。 各CPUの初期化プロセスを生成後、ハード的に各CPUの起動を行う。 start_kernel () (各種初期化処理)      : smp_init (); init プロセスを起動(kernel_thread (init,) ) smp_init () 他のCPU初期化処理用にプロセスを生成(task_structを初期化して init_tasksテーブルに登録)し、他CPUをsmp_boot_cpus () で起動する。 2つめのCPUの初期化処理と smp_commence () で同期をとる。 起動された2つめ以降のCPUも、1つめのCPUと同様に、Linuxカーネルテキストの 先頭stextから実行を開始する。 1つめのCPUの場合は、start_kernel () を呼び出すが、2つめ以降のCPUは initialize_secondary () を呼び出す。 initialize_secondary () は、1つめのCPUが、smp_boot_cpus () で生成した初期化 プロセスのコンテキストをロードする。

コンテキストのロードを行った直後、2つめ以降のCPU上では、初期化プロセスが start_secondary () から実行を開始する。初期化プロセスの処理が終了すると、そのまま アイドルプロセスへと変化する、その後、スケジューラからプロセスが割り当てられるのを 待ち続ける。 stext () { : if (2つめ以降のCPUの場合) initialize_secondary (); else /* 1つめのCPUの場合 */ start_kernel (); } /* ここには戻ってこない */ start_secondary () { CPUコンテキストの初期化 cpu_init () CPU固有の初期化処理 smp_callin () (ローカルタイマの起動なども、ここで行う) 1つめのCPUの初期化完了と同期をとる(ビジーウェイト) このCPU上で動くアイドルプロセスとなる cpu_idle ()

CPU 0 CPU 1 CPU 2 start_kernel () smp_init () warm start initialize_secondary () initialize_secondary () start_secondary () start_secondary () idle.. idle.. idle..

システムの終了 - システムの正常終了 Linuxシステムは、rebootシステムコール によりシステムを停止させることができる。 システムの終了 - システムの正常終了 Linuxシステムは、rebootシステムコール によりシステムを停止させることができる。 システムの停止もしくはリブート処理時には、各種デバイスドライバの終了処理ルー チン notifier_call_chain () が呼び出される。終了処理の必要なデバイスは、デバイスドライバ の初期化時に register_reboot_notifier () を利用してドライバ処理ルーチンを登録しておく。 sys_reboot () switch (コマンド) case システム停止(LINUX_REBOOT_CMD_HALT): ドライバ終了処理 notifier_call_chain () システム停止処理 machine_power_off () case システム電源断(LINUX_REBOOT_CMD_POWER_OFF): ドライバ終了処理 notifier_call_chain () case システム再起動処理(LINUX_REBOOT_CMD_RESTART) : システム再起動処理 machine_restart () ※システム再起動要求では、再起動時に実行するコマンドを指定することも可能 ※CTRL+ALT+DELによるリブートと同様な動作を行う仕組みは ctrl_alt_del ()   として提供されている。

システムの終了 - システムの異常終了 なんらかの原因により、Linuxカーネルがフリーズ(処理継続不可能)すると、panic () が システムの終了 - システムの異常終了 なんらかの原因により、Linuxカーネルがフリーズ(処理継続不可能)すると、panic () が 呼び出され、システムを停止させる。この場合、ドライバの終了処理は呼び出されない。 panic () パニックメッセージの表示 可能であれば、バッファキャッシュの書き出しを試みる sys_sync () SMPの場合、他CPUを強制終了させる smp_send_stop () if (再起動指定の場合) システム再起動 machine_restart () システム停止