- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux进度的虚构地点空间
在x86体系构造中分段体制是必选的,而分页体制则可由详细的操作系统而选择,Linux经过让段的基地点为0而
巧妙的绕过了基地点。因此,对于Linux来说,虚地点和线性地点是一致的。在32位的平台上,线性地点的大小为固
定的4GB。并且,由于采用了保护体制,Linux内核将这4GB
分为两部分,虚地点较高的1GB(0xC0000000到
0xFFFFFFFF)为共享的内核空间;而较低的3GB
00xBFFFFFFF)为每个进度的用户空间。由于每个进度都不能直接接见内核空间,而是经过系统调用
间接进入内核,因此,所有的进度都共享内核空间。而每个进度都拥有各自的用户空间,各个进度之间不能互相接见彼此的用户空间。因此,对于每一个详细的进度而言,都拥有
4GB的虚构地点空间。一个程序在经过编译、连结之
后形成的地点空间是一个虚构的地点空间,只有当程序运行
的时候才会分派详细的物理空间。由此我们能够得悉,程序
的虚构地点相对来说是固定的,而物理地点则随着每一次程
序的运行而有所不同。对于内核空间而言,它与物理内
存之间存在一个简单的线性关系,即存在3GB的偏移量。
在Linux内核中,这个偏移量叫做PAGE_OFFSET。如果内核的某个物理地点为x,那么对应的内核虚地点就为
x+PAGE_OFFSET。对于用户空间而言,它与物理内存
之间的映射远不止这么简单。与内核空间和物理空间的线性
映射不同的是,分页体制将虚构用户空间和物理地点空间分
成大小相同的页,然后再经过页表将虚构页和物理页块映射
起来。内核空间一般能够经过__get_free_page( )、
kmalloc( )和vmalloc( )来申请内核空间。只可是
__get_free_page函数每次申请的都是完整的页;尔后两者
则依据详细参数申请以字节为单位的内存空间。别的,前两
个函数申请的虚构地点空间和物理地点空间都是连续的;
vmalloc函数申请的物理地点空间并不连续。vmalloc函数通
过从头成立虚构地点空间和物理地点空间之间的映射,即新
建页表项,将离散的物理地点空间映射到连续的虚构地点空
间。因此,使用该函数的开销比较大。下面的程序简单
的演示了这三个函数的使用方法。从结果中能够看出,这些
函数申请的地点都在3GB(0xBFFFFFFF)以上。完整代码
在如下。
staticint__initmenroyshow_init(void)
{printk(mmshowmoduleis
working\n);pagemem=
__get_free_page(GFP_KERNEL);if(!pagemem)
goto
gfp_fail;printk(KERN_INFOpagemem=
0x%lx\n,pagemem);
kmallocmem=
kmalloc(100*sizeof(char),GFP_KERNEL);
if(!kmallocmem)
gotokmalloc_fail;
printk(KERN_INFOkmallocmem=0x%p\n,kmallocmem);
vmallocmem=
vmalloc(1000000*sizeof(char));
if(!vmallocmem)
gotovmalloc_fail;
printk(KERN_INFOvmallocmem
=0x%p\n,vmallocmem);
return0;
gfp_fail:
free_page(pagemem);
kmalloc_fail:
kfree(kmallocmem);
vmalloc_fail:
vfree(vmallocmem);
return-1;
}
//运行结果:
#pagemem=0xf3211000
#
kmallocmem=0xd581e700
#vmallocmem=
0xf9251000
每个进度够拥有属于自己的
3GB的虚构
空间(用户空间),那么这个3GB的空间是怎样区分的?往常,
除了我们熟悉的代码段和数据段,用户空间还包括堆栈段和
堆。我们能够经过下面的演示程序来认识这些地区到底负责
存储程序的那些内容。
int
bss_var;intdata_var0=1;argv){printf(The
intmain(intargc,char
userspacesaddressdivisionofaprocessasfollow:\n);printf(Data
segment:\n);printf(addressof\main\
function:%p\n\n,main);
printf(Datasegment:\n);printf(addressof
data_var:%p\n,amp;data_v
您可能关注的文档
最近下载
- 摄像头检验作业指导书.doc VIP
- 《城镇污水污泥流化床干化焚烧技术规程》(征求意见稿).pdf
- 阿奇沙坦非无菌化学原料药车间设计--本科毕业论文.docx VIP
- 办公用品供货服务计划方案.docx VIP
- 用于透明细胞肾细胞癌分型和评估透明细胞肾细胞癌预后的基因及其应用.pdf VIP
- G 正谱 赶圩归来阿里里 林凯 合吧声乐歌谱正谱子五线谱钢琴伴奏谱乐谱曲 谱弹唱谱歌曲乐曲.pdf VIP
- 零星工程施工方案范本(3篇).docx VIP
- 新疆四史应知应会内容.doc VIP
- 眼科显微器械的清洗流程.pptx VIP
- Lesson9-10Howareyoutoday(课件)新概念英语第一册.pptx VIP
文档评论(0)