armlinux演艺---第九回
下面就是一个重量级的函数:
%A setup_arch(&command_line); //arm/kernel/setup.c
%A 完成内存映像的初始化,其中command_line是从bootloader中传下来的。
%A
%A void __init setup_arch(char **cmdline_p)
%A {
%A struct param_struct *params = NULL;
%A struct machine_desc *mdesc; //arch structure, for your ads, defined in include/arm-asm/mach/arch.h very long
%A struct meminfo meminfo;
%A char *from = default_command_line;
%A
%A memset(&meminfo, 0, sizeof(meminfo));
%A
%A 首先把meminfo清零,有个背景介绍一下,从linux 2.4的内核开始,支持内存的节点(node),也就是可支持不连续的物理内存区域。这一点在嵌入式系统中很有用,例如对于SDRAM和FALSH,性质不同,可作为不同的内存节点。
%A
%A meminfo结构定义如下:
%A
%A /******************************************************/
%A #define NR_BANKS 4
%A //define the systen mem region, not consistent
%A struct meminfo {
%A int nr_banks;
%A unsigned long end;
%A struct {
%A unsigned long start;
%A unsigned long size;
%A int node;
%A } bank[NR_BANKS];
%A };
%A /******************************************************/
%A
%A 下面是:ROOT_DEV = MKDEV(0, 255);
%A
%A ROOT_DEV是宏,指明启动的设备,嵌入式系统中通常是flash disk.
%A 这里面有一个有趣的悖论:linux的设备都是在/dev/下,访问这些设备文件需要设备驱动程序支持,而访问设备文件才能取得设备号,才能加载驱动程序,那么第一个设备驱动程序是怎么加载呢?就是ROOT_DEV, 不需要访问设备文件,直接指定设备号。
%A
%A 下面我们准备初始化真正的内核页表,而不再是临时的了。
%A 首先还是取得当前系统的内存映像:
%A
%A mdesc = setup_architecture(machine_arch_type);
%A //find the machine type in mach-integrator/arch.c
%A //the ads name, mem map, io map
%A
%A 返回如下结构:
%A mach-integrator/arch.c
%A
%A MACHINE_START(INTEGRATOR, "Motorola MX1ADS")
%A MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
%A BOOT_MEM(0x08000000, 0x00200000, 0xf0200000)
%A FIXUP(integrator_fixup)
%A MAPIO(integrator_map_io)
%A INITIRQ(integrator_init_irq)
%A MACHINE_END
%A
%A 我们在前面介绍过这个结构,不过这次用它可是玩真的了。
%A
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。