歡迎您光臨本站 登入註冊首頁

arm linux演藝(九)

admin @ 2014-03-25 , reply:0

概述

長篇連載--armlinux演藝---第九回------------------------------------------------------------------------------……

長篇連載--arm linux演藝---第九回
--------------------------------------------------------------------------------
下面就是一個重量級的函數:
setup_arch(&command_line); //arm/kernel/setup.c
完成內存映像的初始化,其中command_line是從bootloader中傳下來的。

void __init setup_arch(char **cmdline_p)
{
struct param_struct *params = NULL;
struct machine_desc *mdesc; //arch structure, for your ads, defined in include/arm-asm/mach/arch.h very long
struct meminfo meminfo;
char *from = default_command_line;

memset(&meminfo, 0, sizeof(meminfo));

首先把meminfo清零,有個背景介紹一下,從linux 2.4的內核開始,支持內存的節點(node),也就是可支持不連續的物理內存區域。這一點在嵌入式系統中很有用,例如對於SDRAM和FALSH,性質不同,可作為不同的內存節點。

meminfo結構定義如下:

/******************************************************/
#define NR_BANKS 4
//define the systen mem region, not consistent
struct meminfo {
int nr_banks;
unsigned long end;
struct {
unsigned long start;
unsigned long size;
int node;
} bank[NR_BANKS];
};
/******************************************************/

下面是:ROOT_DEV = MKDEV(0, 255);

ROOT_DEV是宏,指明啟動的設備,嵌入式系統中通常是flash disk.
這裡面有一個有趣的悖論:linux的設備都是在/dev/下,訪問這些設備文件需要設備驅動程序支持,而訪問設備文件才能取得設備號,才能載入驅動程序,那麼第一個設備驅動程序是怎麼載入呢?就是ROOT_DEV, 不需要訪問設備文件,直接指定設備號。

下面我們準備初始化真正的內核頁表,而不再是臨時的了。
首先還是取得當前系統的內存映像:

mdesc = setup_architecture(machine_arch_type);
//find the machine type in mach-integrator/arch.c
//the ads name, mem map, io map

返回如下結構:
mach-integrator/arch.c

MACHINE_START(INTEGRATOR, "Motorola MX1ADS")
MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
BOOT_MEM(0x08000000, 0x00200000, 0xf0200000)
FIXUP(integrator_fixup)
MAPIO(integrator_map_io)
INITIRQ(integrator_init_irq)
MACHINE_END

我們在前面介紹過這個結構,不過這次用它可是玩真的了。
arm linux 第九回終。。。


[admin via 研發互助社區 ] arm linux演藝(九)已經有3610次圍觀

http://cocdig.com/docs/show-post-42757.html