Embedded 版 (精华区)
发信人: snows (花自飘零水自流), 信区: Embedded
标 题: 长篇连载--arm linux演艺---第九回
发信站: 哈工大紫丁香 (2004年03月16日12:53:23 星期二), 站内信件
ZZ
长篇连载--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
我们在前面介绍过这个结构,不过这次用它可是玩真的了。
--
-
╭────────────────────────────╮
│ 风萧传瑟声,叶落根深处,青阶入野无归途,他乡不知顾 │
│ 泣下问和谁,叹者行已暮,寒眉傲骨今尚在,奈何入凡土 │
╰────────────────────────────╯
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
※ 修改:·snows 於 03月16日12:55:29 修改本文·[FROM: 202.118.229.154]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.161毫秒