中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > uclinux啟動過程詳細分析

        uclinux啟動過程詳細分析

        作者: 時間:2018-08-31 來源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.antipu.com.cn/article/201808/388126.htm

        void __init start_kernel(void)

        {

        char * command_line;

        unsigned long mempages;

        extern char saved_command_line[];

        /*

        * Interrupts are still disabled. Do necessary setups, then

        * enable them

        */

        lock_kernel();

        printk(linux_banner);

        setup_arch(command_line);

        printk(“Kernel command line: %s/n”, saved_command_line);

        parse_options(command_line);

        trap_init();

        init_IRQ();

        sched_init();

        softirq_init();

        time_init();

        /*

        * HACK ALERT! This is early. We‘re enabling the console before

        * we’ve done PCI setups etc, and console_init() must be aware of

        * this. But we do want output early, in case something goes wrong.

        */

        console_init();

        #ifdef CONFIG_MODULES

        init_modules();

        #endif

        if (prof_shift) {

        unsigned int size;

        /* only text is profiled */

        prof_len = (unsigned long) _etext - (unsigned long) _stext;

        prof_len 》》= prof_shift;

        size = prof_len * sizeof(unsigned int) + PAGE_SIZE-1;

        prof_buffer = (unsigned int *) alloc_bootmem(size);

        }

        kmem_cache_init();

        sti();

        calibrate_delay();

        #ifdef CONFIG_BLK_DEV_INITRD

        if (initrd_start !initrd_below_start_ok initrd_start 《 min_low_pfn 《《 PAGE_SHIFT)

        {

        printk(KERN_CRIT “initrd overwritten (0x%08lx 《 0x%08lx) - ”

        “disabling it./n”,initrd_start,min_low_pfn 《《 PAGE_SHIFT);

        initrd_start = 0;

        }

        #endif

        mem_init();

        kmem_cache_sizes_init();

        pgtable_cache_init();

        mempages = num_physpages;

        fork_init(mempages);

        proc_caches_init();

        vfs_caches_init(mempages);

        buffer_init(mempages);

        page_cache_init(mempages);

        #if defined(CONFIG_ARCH_S390)

        ccwcache_init();

        #endif

        signals_init();

        #ifdef CONFIG_PROC_FS

        proc_root_init();

        #endif

        #if defined(CONFIG_SYSVIPC)

        ipc_init();

        #endif

        check_bugs();

        printk(“POSIX conformance testing by UNIFIX/n”);

        /*

        * We count on the initial thread going ok

        Like idlers init is an unlocked kernel thread,which will

        * make syscalls (and thus be locked)。

        */

        smp_init();

        rest_init();

        }

        內(nèi)核啟動之后需要執(zhí)行的第一個函數(shù)是start_kernel()(在linux/init/main.c文件中)。

        start_kernel()

        完成下面一系列初始化的工作。

        ◆printk(1inux_banner),顯示Linux內(nèi)核的版本信息。

        ◆ setup_arch(command_line),做與體系結(jié)構(gòu)相關(guān)的初始化工作。

        ◆ parse_options(command_line),解釋系統(tǒng)參數(shù)。

        ◆ trap_init(),設(shè)置系統(tǒng)異常的入口點。

        ◆ init_IRQ(),初始化系統(tǒng)中斷服務(wù)。

        ◆ sched_init(),系統(tǒng)調(diào)度器的初始化。

        ◆ time_init(),時鐘、定時器初始化。

        ◆ softirq_init(),系統(tǒng)軟中斷的初始化。

        ◆console_init(),控制臺初始化。

        ◆kmem_cache_init(),內(nèi)核cache的初始化。

        ◆calibrate_delay(),校準時鐘。

        ◆mem_init(),內(nèi)存初始化。

        ◆kmem_cache_sizes_init(),創(chuàng)建及設(shè)置通用cache。

        ◆fork_init(mempages),建立uidcache,并且根據(jù)系統(tǒng)內(nèi)存大小來確定最大進程數(shù)目。

        ◆buffer_init(mempages),塊設(shè)備緩沖區(qū)的初始化。初始化一系列的cache。

        ◆check_bugs(),檢查體系結(jié)構(gòu)漏洞。

        ◆kernel_thread(init NULL,CLONE_FS | CLONE_FILES | CLONE_SIGNAL),創(chuàng)建第一個核心進程,啟動init進程。

        _idle(),運行idle進程

        接下去做的工作由init()函數(shù)來完成。init()首先要鎖定內(nèi)核,然后調(diào)用do_basic_setup( )來完成外部設(shè)備以及驅(qū)動程序的初始化。外設(shè)的初始化要根據(jù)內(nèi)核的配置來決定,一般需要做下面的初始化工作:

        ◆PCI總線初始化。

        ◆網(wǎng)絡(luò)初始化。

        ◆一系列其他設(shè)備的初始化。

        ◆start_context_thread()創(chuàng)建事件管理核心進程keventd。

        ◆通過do_initcalls()函數(shù)來啟動任何使用__initcall標識的函數(shù)。

        ◆文件系統(tǒng)初始化。

        ◆加載文件系統(tǒng)。

        在do_basic_setup()調(diào)用完成之后,init()會釋放初始化函數(shù)所用的內(nèi)存,并且打開/dev/console設(shè)備重新定向控制臺,讓系統(tǒng)調(diào)用execve來執(zhí)行程序init。

        到這里為止,Linux 內(nèi)核的初始化工作已經(jīng)完成。然后開始用戶態(tài)進程的初始化。

        =============================================================

        中內(nèi)存模塊的啟動初始化

        arch/armnommu/kernel/entry_armv.S是一個匯編文件,他包含了一個kernel_entry的定義,這是整個內(nèi)核的進入點。在完成某些平臺相關(guān)的初始化工作之后,執(zhí)行流程跳轉(zhuǎn)到start_kerne()處。從這里開始考察的內(nèi)存模塊啟動初始化是如何實現(xiàn)的。

        start_kernel()中與內(nèi)存模塊相關(guān)的函數(shù)調(diào)用流程如下:

        setup_arch() paging_init() free_area_init() mem_init()

        下面分別分析這些函數(shù)各自的功能以及對他們的改造。

        (1) setup_arch()

        setup_arch()首先根據(jù)目前內(nèi)核所配置的平臺向某些特定地址寫入特殊字符序列,以完成對特定硬件的初始化,比如工作狀態(tài)發(fā)光二極管、錯誤和報警發(fā)光二極管。



        關(guān)鍵詞: uClinux cpu 控制器

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉