第2.3章节 Linux启动过程分析.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2.3章节 Linux启动过程分析

第2.3章 Linux的启动 源代码简介 启动代码简介 Linux内核代码组成分析 Linux的启动层次 Linux的启动分析 二:第二启动阶段 第二启动阶段也即start_kernel()阶段.在这个阶段.会进行更加具体而全面的系统初始化. 在这个阶段里,我们主要分析内存管理的初始化.这部份是最重要也是最繁杂的部份.我们从start_kernel()中摘取与内存管理相关的子函数进行分析。 linux-2.6.25/init/main.c 第一个要分析的函数是setup_arch().这是每个平台的初始化.代码如下: Setup_arch()中与内存管理相关的函数如下所示: linux-2.6.25/arch/x86/kernel/setup_32.c void __init setup_arch(char **cmdline_p) { //ioremap映射区域的初始化 early_ioremap_init(); ……. //调整e820 位图并将其打印出来 // 对bios取得的e820图进行调整,然后将其copy 到e820 print_memory_map(memory_setup()); …… //max_pfn: 最大的页面号 find_max_pfn(); …… //返回内核所能映射的最大页面数 max_low_pfn = setup_memory(); …… paging_init(); zone_sizes_init(); } Setup_arch() 中 early_ioremap_init()代码如下: void __init early_ioremap_init(void) { pmd_t *pmd; if (early_ioremap_debug) printk(KERN_INFO early_ioremap_init()\n); pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN)); /*在这里会将FIX_BTMAP_BEGIN 段的页面表固定使用bm_pte*/ memset(bm_pte, 0, sizeof(bm_pte)); pmd_populate_kernel(init_mm, pmd, bm_pte); /* * The boot-ioremap range spans multiple pmds, for which * we are not prepared: */ …… …… Setup_arch() 中 print_memory_map(memory_setup()); Memory_setup(): 在启动的第一阶段,内核调用int 0x15取得内存信息,然后保存在boot_params.e820_map中.有时候bios提供的映射信息也并不一定正确,比如有些地方会重复.所以.在这里函数里对bios取得的信息进行正确调整,然后将其保存到全局变量e820中. E820的定义如下: struct e820entry { //内存图起始地址 __u64 addr; /* start of memory segment */ //内存图大小 __u64 size; /* size of memory segment */ //内存图类型 __u32 type; /* type of memory segment */ } __attribute__((packed)); struct e820map { //内存图总项数 __u32 nr_map; //内存项数组 struct e820entry map[E820MAX]; }; Print_memory_map() 把e820中的信息打印出来.就这是在开机的时候看到有e820映射图.代码请大家自行分析。 Setup_arch()中的 find_max_pfn(): //查找最大的物理页面号 void __init find_max_pfn(void) { int

文档评论(0)

ctuorn0371 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档