1.

swapper_pg_dir : Global Page Directory (全局页目录,即最顶层页目录,PGD) 的地址

pgd_index(addr): 宏函数,返回PGD包含的项中,地址字段 值为addr的项的索引。

PAGE_OFFSET:宏函数,返回进程地址空间(线性地址)中kernel所属的地址空间的起始地址,x86_32下是0xc0000000

PAGE_SIZE:宏函数,返回页大小(4096B或2MB)

max_low_pfn:宏函数,返回一个物理内存的页块号,该页块是最后一个由kernel直接进行 逻辑/物理 映射的页块

set_pmd:宏函数,将值写入PMD(Page Middle Directory)中指定的项

__pmd:宏函数,将一个无符号整数值转换成PMD表项类型,即pmd_t

pgprot_val:宏函数,将一个无符号整数转换成__prot类型,该类型保存一个页表/页目录项的保护标志位

__pgprot:宏函数,将一个__prot类型的值转换成一个无符号整数

物理内存在4GB以内时,kernel重初始化内核页表的过程。(此时为2级分页PGD->PTE->PF),由于LINUX内核总是使用大页面(即一页面为2MB或4MB,而非常规的4096B),

即PTE->PF(共10+12=22位,4MB)不设置页表,而是直接将内存看作页面。此模式下,PGD共有1024项,其中内核占768~1023项,总计内核寻址空间为256*4MB = 1GB

代码

pgd = swapper_pg_dir + pgd_index(PAGE_OFFSET); /* 768 */
phys_addr = 0x00000000;
while (phys_addr < (max_low_pfn * PAGE_SIZE) ) {
pmd = one_md_table_init(pgd); /* returns pgd itself */
set_pmd(pmd, __pmd(phys_addr | pgprot_val( __pgprot(0x1e3))));
/* 0x1e3 == Present , Accessed ,Dirty, Read/Write, Page Size, Global */
phys_addr += PTRS_PER_PTE * PAGE_SIZE; /* 0x400000 */
++pgd;
}

开启PAE(Physical Address Extending)或物理内存大于4GB时,kernel重初始化内核页表的过程。(此时为3级分页PGD->PMD->PTE->PF),在这种情况下,PTE与PF寻址位数为9+12=21,即此时LINUX内核使用2MB大小的页面。此模式下,PDG共4项,其中内核占第三项,PMG共512项,总计内核寻址空间为512*2MB = 1GB

代码

pgd_idx = pgd_index(PAGE_OFFSET); /* 3 */
for (i=0; i<pdg_idx; i++)
set_pgd(swapper_pg_dir + i , __pgd( __pa(empty_zero_page) | 0x001) );
/* 0x001 == Present */
pgd = swapper_pg_dir + pgd_idx;
phys_addr = 0x00000000;
for( ; i<PTRS_PER_PGD; ++i , ++pgd) {
pmd = (pmd_t*) alloc_bootmem_low_pages(PAGE_SIZE);
set_pgd(pgd, __pa(pmd) | 0x001); /* 0x001 == Present */
if( phys_addr < max_low_pfn * PAGE_SIZE)
for(j=0; j<PTRS_PER_PMD && hys_addr < max_low_pfn * PAGE_SIZE; ++j) {
set_pmd(pmd, __pmd(phys_addr | pgprot_val(__pgprot(0x1e3))));
/* 0x1e3 == Present , Accessed ,Dirty, Read/Write, Page Size, Global */
phys_addr += PTRS_PER_PMD * PAGE_SIZE;
}
}
swapper_pg_dir[0] = swapper_pg_dir[pgd_idx];

转载于:https://www.cnblogs.com/klzwj1988/archive/2010/12/14/1905435.html

LINUX 内核代码备忘录相关推荐

  1. Linux 内核代码行数达到 2700 万行量级

    来自:技术让梦想更伟大 截止到2020年1月1日09:00:10,Linux内核Git源码树中的代码达到了2780万行. phoronix网站统计了Linux内核在进入2020年时的一些源码数据并作了 ...

  2. linux 内核编号含义_如何阅读linux内核代码?

    阅读代码从来就是不可行的方法,有篇文章详细讲了这个事,很多人都觉得应该多读代码, 读好的代码,比如Donald Knuth. 但事实上, 只要简单让你描述一下最近读了什么代码,绝大多数人都说不上.文章 ...

  3. Linux内核代码风格

    Linux内核代码风格 这是一个简短的文档,描述了linux内核的首选代码风格.代码风格是因人而异的,而且我不愿意把我的观点强加给任何人,不过这里所讲述的是我必须要维护的代码所遵守的风格,并且我也希望 ...

  4. linux内核源码只有makefile文件没有c文件,linux内核代码的编写初步以及makefile的配置...

    在linux内核代码开发中,头文件不能包含标准C头文件,只能采用GNC标准 而且内核开发中没有main函数,只有init 和 exit ,这是每个内核模块中必须要包含的函数模块. 在GNU C标准中, ...

  5. 最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...

    要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统.这样你才能在修改linux内核代码之后,完成验证的过程. 本文教你完成下列过程: 1.下载linux并编译linux内核源码 ...

  6. 谷歌喊话三星:别再搞 Linux 内核代码了,安卓安全也不保了

    聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 谷歌 Project Zero 团队表示,三星为阻止 Galaxy 手机遭攻击而修改了内核代码,但实际上引发了更多的安全漏洞. 谷歌安全 ...

  7. Ubuntu14.04搭建LXR本地服务器阅读Linux内核代码

    CSDN GitHub Ubuntu14.04搭建LXR本地服务器阅读Linux内核代码 AderXCoding/system/tools/lxr 本作品采用知识共享署名-非商业性使用-相同方式共享 ...

  8. Linux内核代码华人贡献统计

    http://www.remword.com/kps_result/ 这个站点对Linux内核代码补丁进行了详细的统计,感兴趣的童鞋可以看一下. 在这里给大家看一下2005年4月16日至今各个国家贡献 ...

  9. Linux内核代码,第一次看到这样使用的宏

    晚上看内核代码,看到一个有意思的宏,我之前没有见到过,当然,肯定有人见到过,我写出来是给那些没有看到过的人看的. 我说是深夜,那就肯定是深夜 代码是从内核里面看到的 我们正常使用宏是这样的 C语言.嵌 ...

最新文章

  1. 报名 | data Artisans、腾讯、阿里、滴滴、美团专家带你认识Flink!
  2. Mac系统修改root用户密码,mac切换root用户登录实例演示
  3. 离2006年考研还有一个月
  4. 电影院为何有散落的青瓜?
  5. python 字符串大小写转换 其它不变_python字符串大小写如何转换
  6. shell循环遍历多条字符串
  7. 计算机组成800H是多大,73计算机组成原理模拟题三(2019年)更新北理工20春答案...
  8. Vue路由设置嵌套(一级二级三级展示并且显示定向选中)
  9. leetcode第一刷_Unique Binary Search Trees
  10. Go实现 爬虫v0.2
  11. MySQL使用注意事项(一)
  12. 05. 从尾到头打印链表(C++版本)
  13. SQL Server数据库基础知识——数据库存储过程怎么写
  14. 苹果手机文件夹中服务器连接在哪,如何访问苹果手机上的共享文件夹?
  15. 2008年java占有率_2008年中国城市GDP排名 目前最精确的数据(国家统计局排名):...
  16. CODEVS 3977 炉石传说——圣骑士的逆袭
  17. Android小练习2——制作点菜界面
  18. c++笔记③1109
  19. 海思SD3403开发板学习(五)
  20. 小学计算机课第二课堂活动总结,小学课外活动总结范文_2020小学第二课堂工作总结精选...

热门文章

  1. js 设置password placeholder样式_装机必备!超级详细的BIOS设置图解
  2. go怎么用改变c语言程序位置,Go与C语言的互操作
  3. python特性和属性的区别_什么是属性,什么是特性,有何不同?
  4. java中channelmessage,MessageStore支持的QueueChannel与Spring Integration Java Config
  5. Notepad++远程连接Linux系统
  6. 怎样将计算机添加桌面快捷方式,Win10系统下如何将程序快捷方式添加到桌面上?【图文教程】...
  7. java web 项目启动_Java web项目启动Tomcat报错解决方案
  8. ubuntu mysql innodb_Ubuntu MYSQL环境搭建
  9. 手机之家签名工具_这个签名工具可以让任何人“证明自己是中本聪”
  10. jenkins pipeline php,Jenkins pipeline 系列二-为什么选择Pipeline