3 2 4 RAM Linux Linux Linux 2

  • Slides: 23
Download presentation

 • • • • • • • • 3. 2. 4 設置內核的啟動參數 應該說,在將內核映射和根檔案系統映射拷貝到

• • • • • • • • 3. 2. 4 設置內核的啟動參數 應該說,在將內核映射和根檔案系統映射拷貝到 RAM 空間中後,就可以準備啟動 Linux 內核了。但是在調用內核之前,應該作一步準備 作,即:設置 Linux 內核的啟動參數。 Linux 2. 4. x 以後的內核都期望以標記清單(tagged list)的形式來傳遞啟動參數。啟動參數標記清單以標記 ATAG_CORE 開始,以標記 ATAG_NONE 結束。每個標 記由標識被傳遞參數的 tag_header 結構以及隨後的參數值資料結構來組成。資料結構 tag 和 tag_header 定義在 Linux 內核源碼的include/asm/setup. h 標頭檔 中: /* The list ends with an ATAG_NONE node. */ #define ATAG_NONE 0 x 0000 struct tag_header { u 32 size; /* 注意,這裡size是字數為單位的 */ u 32 tag; }; …… struct tag { struct tag_header hdr; union { struct tag_core; struct tag_mem 32 mem; struct tag_videotext; struct tag_ramdisk; struct tag_initrd; struct tag_serialnr; struct tag_revision; struct tag_videolfb; struct tag_cmdline; /* * Acorn specific */ struct tag_acorn; /* * DC 21285 specific */ struct tag_memclk; } u; };

 • • • • • • 在嵌入式 Linux 系統中,通常需要由 Boot Loader 設置的常見啟動參數有:ATAG_CORE、ATAG_MEM、 ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。

• • • • • • 在嵌入式 Linux 系統中,通常需要由 Boot Loader 設置的常見啟動參數有:ATAG_CORE、ATAG_MEM、 ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。 比如,設置 ATAG_CORE 的代碼如下: params = (struct tag *)BOOT_PARAMS; params->hdr. tag = ATAG_CORE; params->hdr. size = tag_size(tag_core); params->u. core. flags = 0; params->u. core. pagesize = 0; params->u. core. rootdev = 0; params = tag_next(params); 其中,BOOT_PARAMS 表示內核啟動參數在記憶體中的起始基底位址,指標 params 是一個 struct tag 類 型的指標。巨集 tag_next() 將以指向當前標記的指標為參數,計算緊臨當前標記的下一個標記的起始位 址。注意,內核的根檔案系統所在的設備ID就是在這裡設置的。 下面是設置記憶體映射情況的示例代碼: for(i = 0; i < NUM_MEM_AREAS; i++) { if(memory_map[i]. used) { params->hdr. tag = ATAG_MEM; params->hdr. size = tag_size(tag_mem 32); params->u. mem. start = memory_map[i]. start; params->u. mem. size = memory_map[i]. size; } } params = tag_next(params); 可以看出,在 memory_map[]陣列中,每一個有效的記憶體段都對應一個 ATAG_MEM 參數標記。

 • • • • • • • 下面是設置 ATAG_INITRD 的示例代碼,它告訴內核在 RAM 中的什麼地方可以找到 initrd

• • • • • • • 下面是設置 ATAG_INITRD 的示例代碼,它告訴內核在 RAM 中的什麼地方可以找到 initrd 映象(壓縮格式) 以及它的大小: params->hdr. tag = ATAG_INITRD 2; params->hdr. size = tag_size(tag_initrd); params->u. initrd. start = RAMDISK_RAM_BASE; params->u. initrd. size = INITRD_LEN; params = tag_next(params); 下面是設置 ATAG_RAMDISK 的示例代碼,它告訴內核解壓後的 Ramdisk 有多大(單位是KB): params->hdr. tag = ATAG_RAMDISK; params->hdr. size = tag_size(tag_ramdisk); params->u. ramdisk. start = 0; params->u. ramdisk. size = RAMDISK_SIZE; /* 請注意,單位是KB */ params->u. ramdisk. flags = 1; /* automatically load ramdisk */ params = tag_next(params); 最後,設置 ATAG_NONE 標記,結束整個啟動參數列表: static void setup_end_tag(void) { params->hdr. tag = ATAG_NONE; params->hdr. size = 0; }