Welcome 微信登录

首页 / 操作系统 / Linux / ARM Linux选择语句应用实例

1、区的基本概念由于硬件的限制,Linux内核并不能对所有页面都一视同仁。有些页面位于内存中特定的物理地址上,所以不能将其用于一些特定的任务。由于存在这种限制,所以内核把页划分为不同的区(zones)。内核使用区对其具有一些相似的特性页进行分组,Linux中把页面分成了3种。ZONE_DMA:这个区包含的页能用来执行DMA操作ZONE_NORMAL:这个区包含的都是正常映射的页ZONE_HIGHEM:这个区包含“高端内存”,其中的页并不能永久地映射到内核地址空间用户可以查看<includelinuxmmzone.h>,里面有相关的定义:#define ZONE_DMA               0#define ZONE_NORMAL         1#define ZONE_HIGHMEM       2ZONE_DMA位于低端的内存空间,用于某些旧的ISA设备。ZONE_NORMAL的内存直接映射到Linux内核线性地址空间的高端部分,许多内核操作只能在ZONE_NORMAL中进行。由于通常一个页面还有其他属性,如等待调用、I/O操作等,而在分配页面的时候,只要获得区(zone)属性就可以了,所以需要一种映射,将页中的区(zone)属性提取出来,www.linuxidc.com这就是zonelist映射,它可以方便地获得该页所属地区地址。2、区得分配为了确定内存分配时获得区域倾向顺序,Linux内核中有函数build_zonelists_node,其位于<mm/page_alloc.c>中:static int _init build_zonelists_node(pg_data_t *pgdat,struct zonelist *zonelist,int j,int k){        switch(k){                  struct zone *zone;                   /*打印出错信息*/                  default:                           BUG();                   /*ZONE_HIGHMEM的入口*/                   case ZONE_HIGHMEM:                           zone = pgdat->node_zone + ZONE_HIGHMEM;                           if(zone->present_pages){                                      zonelist->zones[j++] = zone;                           }                   /*ZONE_NORMAL的入口*/                   case ZONE_NORMAL:                           zone =  pgdat->node_zone + ZONE_NORMAL;                           if(zone->present_pages)                                      zonelist->zones[j++] = zone;                   /*ZONE_DMA的入口*/                           case ZONE_DMA:                           zone =  pgdat->node_zone + ZONE_DMA;                            if(zone->present_pages)                                      zonelist->zones[j++] = zone;                    /*无break*/                          }                   return j;}在这个函数里,使用了switch语句,在此处可以看出switch语句的几个注意要点。switch语句中各个case的顺序可以调换,如在此处中将default放在了最上面。switch语句的各个case后可以跟多条语句,且不需要括号。在这个switch语句中没有break语句,这时由于这些语句需要顺序执行,此外,在这个switch语句中还包括if条件语句。