1 linux内核内存空间
Linux 内存管理 对于物理内存大于1g 一般设置固定映射区为800M左右 多的物理内存通过高端映射区使用 这样就可以使用1G虚拟内存空间 访问所有物理内存了。
注2 动态映射区的内存使用vmalloc函数进行分配;该函数只能分配高端虚拟内存;但是虚拟内存对应的物理内存可以是低端物理内存也可以是高端物理内存。
注3 TASK_SIZE=0xbfe00000 PAGE_OFFSET=0x30000000
2 启动流程
3 静态映射:内核提供了在系统启动时通过map_desc结构体静态创建I/O资源到内核地址空间的线性映射表(即page table)的方式;这种映射表是一种一一映射的关系。程序员可以自己定义该I/O内存资源映射后的虚拟地址。创建好了静态映射表;在内核或驱动中访问该I/O资源时则无需再进行ioreamp 动态映射;可以直接通过映射后的I/O虚拟地址去访问它。在paging_init () --> devicemaps_init () --> mdesc->map_io() 调用map_io函数生成静态映射
4 MACHINE_START相关分析
MACHINE_START(MINI2440, ;Mini2440 board;)
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA ; 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = mini2440_map_io,
.init_machine = mini2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
//在include/asm-arm/mach/arch.h中;有定义
#define MACHINE_START(_type,_name) static const struct machine_desc __mach_desc_##_type __used __attribute__((__section__(;.arch.info.init;))) = { .nr = MACH_TYPE_##_type, .name = _name,
#define MACHINE_END };
//按定义展开后;;下面的是一个静态变量;编译后放置在.arch.info.init段;
static const struct machine_desc __mach_desc_MINI2440 __used __attribute__((__section__(;.arch.info.init;))) =
{
.nr = MACH_TYPE_MINI2440,
.name = ;Mini2440 board;,
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA ; 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = mini2440_map_io,
.init_machine = mini2440_machine_init,
.timer = &s3c24xx_timer,
};
(1) MACH_TYPE_MINI2440 是mini2440开发板在linux中的机器号。
(2) ;Mini2440 board;是开发板信息;在终端输入cat /proc/cpuinfo可以查看。
(3) boot_params是bootloader向内核传递的参数位置;这要和bootloader中参数的定义要一致。
(4) init_irq在start_kernel()-->init_IRQ()-->init_arch_irq()中被调用
(5) map_io在setup_arch()-->paging_init()-->devicemaps_init()中被调用 在此函数中映射io空间
(6) init_machine被customize_machine()调用;customize_machine()放在arch_initcall() 段里面;会自动被调用。
(7) timer(系统时钟)在start_kernel()--> time_init()中被调用。
注1;在mini2440_machine_init会将开发板所有的设备添加到总线上。
注2;包含此结构的文件一般位于arch/arm/里面的mach-XXX文件夹下
注3;MACHINE_START定义的变量放在 section(;.arch.info.init;)段
5
Linux内核UDP收包为什么效率低?性能怎么优化(超详细讲解)