OK6410A 开发板 (八) 11 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 mem

发布者:耿高良最新更新时间:2022-09-16 来源: csdn关键字:OK6410A  开发板  11  start_kernel  mem 手机看文章 扫描二维码
随时随地手机看文章

该阶段完成了

1. 根据 memblock 的 reserved 成员  reserve 不需要填充的页表 // reserve_bootmem_region


2. 通过 在 全物理内存内 互补 memblock 的 reserved,得到未使用的物理内存,填充需要填充的页表 // __free_memory_core


3. 至此 , buddy 初始化完成


4. 用(内存地址,内存大小,申请块大小)填充 kmalloc_caches[type([0-1])][idx([6-d])]


5. 至此 , slab 初始化完成


6. 将 在vmalloc区间的 已经使用的虚拟内存地址A(主要是io设备) 注册到 vmap_area_root


7. 通过 在 全虚拟内存(非vmalloc区间)内 互补 A , 得到虚拟地址空间,注册到 free_vmap_area_root


8. 至此 , vmalloc 初始化完成


// 现在已经不打印 虚拟内存布局 了 

// 请查看 1c31d4e96b8c205fe3aa8e73e930a0ccbf4b9a2b


其实 setup_arch 中也有 关于 mem 的部分


setup_arch 中 与mem 相关的部分


2. 匹配 板级 mdesc , 并解析 atags(包括core cmdline mem)

5. 初始化 各种类型的 描述符表

6. 添加 各种(kernel/initrd/设备树/atags/设备树中预留的/)预留的内存到 memblock

7. 对 即将存储页表的地址 清0

8. 针对 多项内容(lowmem/设备树/vectors/各项设备)填充页表

10. 申请内存,用于存储 很多个struct  page 

11. 初始化所有的 struct page



可以这么说 , setup_arch  中完成了

1. 虚拟页表的创建(lowmem/设备树/vectors/各项设备)

2. memblock 的初始化 // 在 setup_arch 的末尾,已经可以 通过 memblock_alloc 来 申请内存了

3. buddy初始化的第一部分 // 所有低端内存的 struct page 已经准备好了


在这篇文章中,主要关注下面的函数

page_address_init

// null

setup_arch

// 之前已经讨论过

build_all_zonelists

// 打印信息

// Built 1 zonelists, mobility grouping on.  Total pages: 65024

mm_init

// 打印信息

// mem auto-init: stack:off, heap alloc:off, heap free:off

// Memory: 243936K/262144K available (5120K kernel code, 6569K rwdata, 732K rodata, 1024K init, 2134K bss, 18208K reserved, 0K cma-reserved)

// SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1


build_all_zonelists

build_all_zonelists

build_all_zonelists_init

__build_all_zonelists

for_each_online_node(nid) build_zonelists(pgdat);

zonerefs = pgdat->node_zonelists[ZONELIST_FALLBACK]._zonerefs;

nr_zones = build_zonerefs_node(pgdat, zonerefs);

zone = pgdat->node_zones + zone_type;

zoneref_set_zone(zone, &zonerefs[nr_zones++]);

zoneref->zone = zone;

zoneref->zone_idx = zone_idx(zone);

zonerefs += nr_zones;

for_each_possible_cpu(cpu) pageset_init(&per_cpu(boot_pageset, cpu));

mminit_verify_zonelist

cpuset_init_current_mems_allowed

vm_total_pages = nr_free_zone_pages(gfp_zone(GFP_HIGHUSER_MOVABLE)); // fe00

page_group_by_mobility_disabled = 0;


mm_init

mm_init

page_ext_init_flatmem

// null

init_mem_debugging_and_hardening

// TODO

report_meminit

// pr_info

mem_init

set_max_mapnr(pfn_to_page(max_pfn) - mem_map);

max_mapnr = pfn_to_page(max_pfn) - mem_map;

/* this will put all unused low memory onto the freelists */

memblock_free_all

free_unused_memmap // 稀疏内存相关,释放不存在的地址

free_memmap

reset_all_zones_managed_pages

pages = free_low_memory_core_early

// reserve all the struct page

for_each_reserved_mem_range(i, &start, &end) reserve_bootmem_region(start, end); // reserve_bootmem_region 执行了 16次

for (; start_pfn < end_pfn; start_pfn++) 

init_reserved_page(start_pfn);

INIT_LIST_HEAD(&page->lru);

__SetPageReserved(page);

/*

// 这 16 个 是 memblock 中的 reserved 成员

为 kernel/页表/struct page/vectors   预留的

还有 io map/request_standard_resources 过程中申请的内存

reserve_bootmem_region // 16次,之所以是16次,是因为之前调用了 memblock_alloc 16次

start_pfn:50004,end_pfn:50008 // 标记这段地址已经被使用,用作页表

page:cfdf5080

page:cfdf50a0

page:cfdf50c0

page:cfdf50e0

start_pfn:50100,end_pfn:51081 // 标记这段地址已经被使用,用作 kernel中的 (__pa(KERNEL_START), KERNEL_END - KERNEL_START)

page:cfdf7000

...

page:cfe16000

start_pfn:5fdbc,end_pfn:5fdf4

page:cfff0780

...

page:cfff0e60

start_pfn:5fdf5,end_pfn:5fffc // 标记这段地址已经被使用,用作 struct page

page:cfff0ea0

...

page:cfff4f60

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:5fffd

page:cfff4f80

start_pfn:5fffc,end_pfn:60000 // 标记这段被 vectors 和 其他等 占用

page:cfff4f80

...

page:cfff4fe0

*/

// free mem

for_each_free_mem_range __free_memory_core(start, end);

__free_pages_memory(start_pfn, end_pfn); // __free_pages_memory 执行了 4次

memblock_free_pages(pfn_to_page(start), start, order);

__free_pages_core

__free_pages_ok

free_one_page

__free_one_page

add_to_free_list(page, zone, order, migratetype);

/*

__free_pages_memory 执行了4次

// 之所以是4次,是因为 总的内存 减去  memblock_alloc 的内存 ,只剩下4块连续的 free 内存

start_pfn:50000,end_pfn:50004 // 标记这段内存没被使用

pfn_to_page(start):cfdf5000, start:50000, order:2

start_pfn:50008,end_pfn:50100 // 标记这段内存没被使用,虽然这段是属于kernel的,但是不属于 kernel 的 (__pa(KERNEL_START), KERNEL_END - KERNEL_START)

pfn_to_page(start):cfdf5100, start:50008, order:3

pfn_to_page(start):cfdf5200, start:50010, order:4

pfn_to_page(start):cfdf5400, start:50020, order:5

pfn_to_page(start):cfdf5800, start:50040, order:6

pfn_to_page(start):cfdf6000, start:50080, order:7

start_pfn:51081,end_pfn:5fdbc

pfn_to_page(start):cfe16020, start:51081, order:0

pfn_to_page(start):cfe16040, start:51082, order:1

pfn_to_page(start):cfe16080, start:51084, order:2

pfn_to_page(start):cfe16100, start:51088, order:3

pfn_to_page(start):cfe16200, start:51090, order:4

pfn_to_page(start):cfe16400, start:510a0, order:5

pfn_to_page(start):cfe16800, start:510c0, order:6

pfn_to_page(start):cfe17000, start:51100, order:8

pfn_to_page(start):cfe19000, start:51200, order:9

pfn_to_page(start):cfe1d000, start:51400, order:a

pfn_to_page(start):cfe25000, start:51800, order:a

pfn_to_page(start):cfe2d000, start:51c00, order:a

pfn_to_page(start):cfe35000, start:52000, order:a

pfn_to_page(start):cfe3d000, start:52400, order:a

pfn_to_page(start):cfe45000, start:52800, order:a

pfn_to_page(start):cfe4d000, start:52c00, order:a

pfn_to_page(start):cfe55000, start:53000, order:a

pfn_to_page(start):cfe5d000, start:53400, order:a

pfn_to_page(start):cfe65000, start:53800, order:a

pfn_to_page(start):cfe6d000, start:53c00, order:a

pfn_to_page(start):cfe75000, start:54000, order:a

pfn_to_page(start):cfe7d000, start:54400, order:a

pfn_to_page(start):cfe85000, start:54800, order:a

pfn_to_page(start):cfe8d000, start:54c00, order:a

pfn_to_page(start):cfe95000, start:55000, order:a

pfn_to_page(start):cfe9d000, start:55400, order:a

pfn_to_page(start):cfea5000, start:55800, order:a

pfn_to_page(start):cfead000, start:55c00, order:a

pfn_to_page(start):cfeb5000, start:56000, order:a

pfn_to_page(start):cfebd000, start:56400, order:a

pfn_to_page(start):cfec5000, start:56800, order:a

pfn_to_page(start):cfecd000, start:56c00, order:a

pfn_to_page(start):cfed5000, start:57000, order:a

pfn_to_page(start):cfedd000, start:57400, order:a

pfn_to_page(start):cfee5000, start:57800, order:a

pfn_to_page(start):cfeed000, start:57c00, order:a

pfn_to_page(start):cfef5000, start:58000, order:a

pfn_to_page(start):cfefd000, start:58400, order:a

pfn_to_page(start):cff05000, start:58800, order:a

pfn_to_page(start):cff0d000, start:58c00, order:a

pfn_to_page(start):cff15000, start:59000, order:a

pfn_to_page(start):cff1d000, start:59400, order:a

pfn_to_page(start):cff25000, start:59800, order:a

pfn_to_page(start):cff2d000, start:59c00, order:a

pfn_to_page(start):cff35000, start:5a000, order:a

pfn_to_page(start):cff3d000, start:5a400, order:a

pfn_to_page(start):cff45000, start:5a800, order:a

pfn_to_page(start):cff4d000, start:5ac00, order:a

pfn_to_page(start):cff55000, start:5b000, order:a

pfn_to_page(start):cff5d000, start:5b400, order:a

pfn_to_page(start):cff65000, start:5b800, order:a

pfn_to_page(start):cff6d000, start:5bc00, order:a

pfn_to_page(start):cff75000, start:5c000, order:a

pfn_to_page(start):cff7d000, start:5c400, order:a

pfn_to_page(start):cff85000, start:5c800, order:a

pfn_to_page(start):cff8d000, start:5cc00, order:a

pfn_to_page(start):cff95000, start:5d000, order:a

pfn_to_page(start):cff9d000, start:5d400, order:a

pfn_to_page(start):cffa5000, start:5d800, order:a

pfn_to_page(start):cffad000, start:5dc00, order:a

pfn_to_page(start):cffb5000, start:5e000, order:a

pfn_to_page(start):cffbd000, start:5e400, order:a

pfn_to_page(start):cffc5000, start:5e800, order:a

pfn_to_page(start):cffcd000, start:5ec00, order:a

pfn_to_page(start):cffd5000, start:5f000, order:a

pfn_to_page(start):cffdd000, start:5f400, order:a

pfn_to_page(start):cffe5000, start:5f800, order:a

pfn_to_page(start):cffed000, start:5fc00, order:8

pfn_to_page(start):cffef000, start:5fd00, order:7

pfn_to_page(start):cfff0000, start:5fd80, order:5

pfn_to_page(start):cfff0400, start:5fda0, order:4

pfn_to_page(start):cfff0600, start:5fdb0, order:3

pfn_to_page(start):cfff0700, start:5fdb8, order:2

start_pfn:5fdf4,end_pfn:5fdf5 // 标记这段内存没被使用

pfn_to_page(start):cfff0e80, start:5fdf4, order:0

*/



/*

至此,50000000 - 60000000 已经被 struct page 记录完毕


50000 000 - 50004 000 : free // 0x5000 0100 应该有 atags ,但是memblock 没预留这段内存,因为 atags 已经解析完了,没用了

50004 000 - 50008 000 : reserved // 页表/段表

50008 000 - 50100 000 : free 

50100 000 - 51081 000 : reserved // kernel 的 (__pa(KERNEL_START), KERNEL_END - KERNEL_START)

51081 000 - 5fdbc 000 : free

5fdbc 000 - 5fdf4 000 : reserved // 过程中 memblock_alloc 过的内存

5fdf4 000 - 5fdf5 000 : free 

5fdf5 000 - 5fffc 000 : reserved // struct page

5fffc 000 - 60000 000 : reserved // vectors等

*/



totalram_pages_add(pages);

_totalram_pages = _totalram_pages + pages ; // _totalram_pages 初始化为0

free_highpages

// null

mem_init_print_info

pr_info("Memory: %luK/%luK available (%luK kernel code


// 这个过程初始化 好的 内存管理器 是 buddy

// 怎么向 buddy 申请内存

// alloc_pages/alloc_page

[1] [2]
关键字:OK6410A  开发板  11  start_kernel  mem 引用地址:OK6410A 开发板 (八) 11 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 mem

上一篇:OK6410A 开发板 (八) 12 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 irq
下一篇:OK6410A 开发板 (八) 10 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 setup_arch

推荐阅读最新更新时间:2024-11-20 00:06

小米双11官方保障服务:手机碎屏、延保8折起
近日,小米服务那些事官微表示,小米上线双11官方保障服务,全系8折起。   活动时间从11月1日起至11月11日结束。   此次保障活动涵盖,手机碎屏、延保,电视延保,生态链产品换新保,笔记本延保四大类目。   其中碎屏保包括:小米MIX 4 279元、小米11 Ultra 319元、小米Civi 143元、Redmi Note 11 Pro 103元、Redmi K40 Pro 199元,延保分别为,159元、199元、79元、55元、95元。   当然,电视延保同样也是8折。   具体来看,小米电视 ES65 2022款延保2年 135元,小米电视 EA55 2022款延保2年 79元,小米电视 6 55 英寸 OLED
[手机便携]
小米双<font color='red'>11</font>官方保障服务:手机碎屏、延保8折起
2011年度通信业十大新闻事件
1.TD-LTE六城市规模试验启动 1月18日,工信部宣布正式启动TD-LTE规模技术试验,该试验于上海、深圳、广州、南京、厦门、杭州六城市进行,每座城市部署100~200个基站,室外使用2.6GHz频段,室内为2.3GHz,试验分为单模、多模两个阶段推进。包括大唐、中兴、华为、诺基亚西门子、阿尔卡特朗讯、爱立信等企业在内的国内外主流系统厂家以及大唐、联芯、展讯、ST-E(T3G)、创毅视讯、华为海思等在内的终端芯片企业参与了此次试验。8月9日,中国移动宣布六城市核心网和无线网已基本建成,大部分基站设备已安装并开通。 2.设备商掀起专利混战 2011年或许成为ICT领域专利纷争最多最复杂的一年,各大设备商纷纷以专利为筹码,掀起了多轮
[手机便携]
LCD1602+DTH11+MQ-135空气污染检测 温湿度程序
1602的温湿度程序 #include LiquidCrystal.h LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int temp;//温度 int humi;//湿度 int tol;//校对码 int j; unsigned int loopCnt; int chr = {0};//创建数字数组,用来存放40个bit unsigned long time; #define pin 7 int Aout=A0 ;//MQ-135 AO 接 Arduino Uno A0 int temp1 = 0; //临时变量,存储A0读取的数据 void setup() { Seria
[单片机]
在TMS320C6711 DSP上实现H.263视频编码器的EDMA数据存取策略
摘要:提出了在TMS320C6711 DSP平台上实现H.263视频编码器的过程中,如何使用EDMA优化数据存取的策略,从而减少了CPU花费在数据搬移上的开销。 关键词:H.263 DSP EDMA QDMA 数据存取策略 目前,将H.263算法在DSP芯片上实现,已成为一种越来越广泛的应用趋势。采用DSP实现H.263算法,相对于以往的方案,具有更好的扩展性,可以很容易地将声音编解码和复用、通信协议添加进来,综合在一起DSP芯片中,具有很强的实用性。 本文采用TI公司的TMS320C6711 DSP实现H.263的编码,提出一种在DSP平台上充分合理使用片上EDMA控制器,进行数据存取优化的策略。 1 TMS320C6
[嵌入式]
预估:2012年LED照明产值达到110亿美元
  研调组织拓墣工业研究所表明,由于 LED 照明 产物受限于灯具无法通用、球泡灯亮度缺乏、LED光形有别于传统照明产物、产物单价过高级要素,招致2011年全球全体 LED照明 (包括LED光源、LED灯具及关联零组件)产量生长缓慢,估量仅有87亿美元,2012年可望生长至110亿美元,年增26%;而2015年上看192亿美元,年复合生长率近20%。   近年来LED照明生长速度缓慢,但从2012年开端,跟着各国政府连续推广禁用白炽灯方针,LED照明工业远景建立。拓墣以为,后白炽灯时期曾经降临,使用商场将从野外照明优先开展,商用照明、工业照明、车用照明居次,最终再浸透进家用商场,将来4年内为LED规划照明商场的最终关键期。  
[电源管理]
苹果最晚今年11月发布iPhone 12:四款机型均支持5G
据外媒报道称,苹果最晚会在今年11月发布iPhone 12系列,其包含了四款机型,都支持5G网络。   国外投行Cowen的报告显示,苹果公司第2季度生产量预计为3500万部,比第一季度下降了5%,比去年同期下滑了13%。该分析师表示,生产供应链大体上已经恢复到正常的产出率,但下游需求仍不确定。Cowen预测,苹果第2季度的iPhone出货量将达到3000万部。   根据此前消息,苹果公司今年预计会发布四款iPhone:一款5.4英寸的iPhone、一款6.7英寸的iPhone,以及两款6.1英寸的iPhone。这四款iPhone机型预计都将支持5G网络,且都配备OLED(有机发光二极管)面板。   据悉,四款iPhone
[手机便携]
小米POCO M3将于11月24日发布,为Redmi Note 10 4G重塑版
外媒 gizchina 报道,在推出了非常成功的 POCO X3 之后,该品牌将推出新的智能手机。现在,小米 POCO 品牌正式确认 11 月 24 日将发布 POCO M3。POCO 最近的品牌重塑策略一直为人所知。到目前为止,POCO X3 是该公司发布的唯一一款原创设计设备。显然,POCO M3 也将是尚未正式上市的 Redmi Note 10 4G 重塑版。   据悉,M2010J19SG 和 M2010J19SI 是这款 Redmi Note 10 4G 智能手机的全球版和印度版。小米预计将在印度和全球市场销售 POCO M3 手机。   IT之家获悉,根据工信部的上市信息,POCO M3 又名 Redmi N
[手机便携]
基于ADSP-21160的液晶驱动电路设计及系统软件实现
薄膜晶体管液晶显示器(TFT-LCD)具有重量轻、平板化、低功耗、无辐射、显示品质优良等特点,其应用领域正在逐步扩大,已经从音像制品、笔记本电脑等显示器发展到台式计算机、工程工作站(EWS)用监视器。对液晶显示器的要求也正在向高分辨率、高彩色化发展。 由于CRT显示器和液晶屏具有不同的显示特性,两者的显示信号参数也不同,因此在计算机(或MCU)和液晶屏之间设计液晶显示器的驱动电路是必需的,其主要功能是通过调制输出到LCD电极上的电位信号、峰值、频率等参数来建立交流驱动电场。 本文实现了将VGA接口信号转换到模拟液晶屏上显示的驱动电路,采用ADI公司的高性能DSP芯片ADSP-21160来实现驱动电路的主要功能。 硬件电
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved