Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> 

またはコンパイルし、それを見るのvmlinuxリンクするプロセスから生成され、.oのファイルの束によってリンクが行われ、アームLinuxカーネル

またはコンパイルし、それを見るのvmlinuxリンクするプロセスから生成され、.oのファイルの束によってリンクが行われ、アームLinuxカーネル

  
を入力するプロセスを開始し、最初のものは、カーネル\\アーチ\\アーム\\カーネル\\ヘッド-armvです。 Oが、我々はまた、\\アーチ\\アームの\\ vmlinux.ldsをリンクLDSファイルのカーネルを参照してください、それは最初のエントリ(STEXT)を分析する必要があり//エントリポイントがSTEXTはセクションで頭armv.s {になります。= 0xC0008000; //ベースアドレス、カーネル始まるセクション.initの仮想アドレス:{/*初期化コドとダ TA * /_ STEXT =; __ init_begin =; *(text.init。)__ proc_info_begin = ...;(proc.info)(。arch.info)* __ proc_info_end =;. __ arch_info_begin =;. * __ arch_info_end =;. __ tagtable_begin =;. *(タグリスト)__ tagtable_end =;. *(DA ta.init。 。)= ALIGN(16); __ setup_start =;. *(setup.init)__ setup_end =; .. __ initcall_start =;. *(initcall.init)__ initcall_end =; ... = ALIGN(4096); __ init_end =;.}仮想アドレスと物理アドレスについて:使用後のMMU、システムは、当社の実際の物理アドレスが0x3000の0xC0008000である実際の物理アドレスを指すようにMMUで仮想アドレスを使用します。 8000は、MMUの「ARMアーキテクチャとプログラミング」への具体的な言及を導入しました。 .SECTION入口ヘッドarmv.sはQUOT&プログラムを見つける。.text.init",#1 ALLOC、#1 execinstr.typeのSTEXT、#functionENTRY(STEXT)MOV R12、r0mov R0、#F_BIT |  I_BIT |  MODE_SVCは@ modemsr cpsr_c、R0 @ SVCを確認し、すべてのIRQ disabledbl __lookup_processor_typeteq R10、#0 @無効なプロセッサ?Moveq R0、# 'P' @はい、エラー「p'beq __errorbl __lookup_architecture_typeteq R7、#0 @無効なアーキテクチャ?Moveq R0 、# '' @はい、エラー「a'beq __errorbl __create_page_tablesadr LR、__ret @返すaddressadd PC、R10、__lookup_processor_typeに、R10の値へのジャンプを追求する空想探すために初期化プロセッサ@#12フー__lookup_processor_typeの関数:ADRのR5、アドレスベース2F //R5の符号2は0x30008000ldmiaのR5、{R7、R9、R10} //R7 = __ proc_info_end R9 = __ proc_info_beginsub R5、R5、R10 //R10数字2でありますベースは0xc0008000add R7、R7、R5 @私たちのアドレスにspaceadd R10、R9、R5 //R10ベースアドレスに変換され、リンクアドレスは0x30008000 __proc_info_begin2です:.LONG __proc_info_end.long __proc_info_begin.long 2bは、そのようなR10に格納されます今、我々は、彼らがまだベースアドレス0x30008000に変換する必要がMMUを開く必要はありませんし、我々は__proc_infに行ってきましたので、アドレスを__proc_info_beginそれはこのラベルで上記vmlinux.ldsに気づいo_begin、リンクがダウンしたセグメント.proc.infoで、カーネルに\\アーチ\\アーム\\ミリメートル\\ procを-arm920.sは、最後の段落.SECTION"を見つけました;。 proc.info"、#alloc、#execinstr

.TYPE __arm920_proc_info、#object__arm920_proc_info:.LONG 0x41009200.long 0xff00fff0.long 0x00000c1e @ mmuflagsb __arm920_setupok、我々はPC、R10、#12を追加知っているように、どこジャンプアドレスバーがちょうど相対アドレスをジャンプ文がBの声明に注意して入れているので、行くことが__arm920_setupをジャンプしているので、アドレス変換は、必須ではありませんが、文はADRのLR、__retは、設定されていますLDR LR、__switch_da tamcr P15、0、R0、C1、C0 //:数字ヘッドarmv.s実行__ret戻る__arm920_setup実行後にRET .__続けてアドレスを返す__arm920_setupは、__retですここMMUmov R0、R0 r0mov、r0mov R0、r0mov PC、LR、//ジャンプ__mmap_switched開かれ、ここで、仮想アドレスバー//この命令のLDR LRがあったことに注意してください、__switch_da 負荷TA __mmap_switchedアドレスは__switch_ああ仮想アドレスでありますダは、 taの:このプロセスでは、カーネル\\ INIT \\ main.cの中で//ダウン、C言語のコードBのSYMBOL_NAME(start_kernel)に転送されます__mmap_switchedすべての方法から実行__mmap_switched .LONGは、特に複雑ではありません、慎重に見て(lock_kernelを理解することは難しいことではありませんC言語におそらくまだ私はここでそれらを得ることができない、理解することができ、フローチャートの注釈

があります見て);のprintk(linux_banner); setup_arch(& COMMAND_LINE);のprintk("カーネルコマンドライン:%S \\ N" saved_command_line); parse_options(COMMAND_LINE); trap_init(); init_IRQ(); sched_init(); softirq_init(); time_init()は、初期化がたくさんあります、機能静的な無効rest_init(無効)

start_kernelラストコール{kernel_thread(INIT、NULL、CLONE_FS
楽観的に各機能を追いかけ|  CLONE_FILES |  CLONE_SIGNAL); unlock_kernel();電流 - > need_resched = 1; cpu_idleは();} initプロセスで確立kernel_thread、lock_kernelのmain.cのinit()関数で実行される。do_basic_setupを();コールdo_basic_setup do_initcalls各種駆動の機能がdo_initcallsで行われ(無効)静的な無効__initのdo_initcalls(無効){呼び出す* initcall_t;

コール=& __ initcall_start;やる{(*コール)();を呼び出し++;}(LT&呼び出し;& __ initcall_end);ながら

flush_scheduled_tasks();} __ initcall_startがvmlinux.ldsに割り当てられ、それがセグメント.initcall.iniカーネル\\を見つける必要があるだろうが\\のLinuxを含む\\ init.hの#define __init_call __attribute__で見つけることができます((未使用、__ section__(" .initcall.init")))のtypedef int型(* initcall_t)(ボイド);#定義__initcall(FN)\\静的initcall_t __initcall _ ## FN __init_callそのため、FN =入念な調査の下では、その後の#define module_init(x)は__initcall(x)のMODULEのない定義が存在しない場合は、ドライバを呼び出すために継続できるように、これは初期化関数.initcall.initセグメントへの初期化関数のアドレスです発見しましたあなたがカーネルにドライバーをコンパイルしたい場合は非常に簡単です、それは、init(EXECUTE_COMMAND)はexecve(EXECUTE_COMMAND、argv_init、envp_init)であれば、最後だ。EXECUTE_COMMAND ppcbootパスコマンドライン引数とは関連していますああ、INIT = /linuxrcをしなければならない、我々はそうですlinuxrcスクリプトは、busyboxののbusyboxのを実行するには、このスクリプトのルートに実行し、/usr/etc/rc.local
の実装上で行ってきました/etc/init.d/rcSでスクリプトを実行するために行ってきましたします

Copyright © Windowsの知識 All Rights Reserved