浅析user用户态程序如何访问kernel空间的物理.docVIP

浅析user用户态程序如何访问kernel空间的物理.doc

  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文档。上传文档
查看更多
浅析user用户态程序如何访问kernel空间的物理

浅析user用户态程序如何访问kernel空间的物理 浅析user用户态程序如何访问kernel空间的物理内存DDR和物理寄存器 fs_initcall(chr_dev_init); 创建如下的char设备在/dev/下: /dev/mem /dev/kmen /dev/null /dev/port /dev/zero /dev/full /dev/random /dev/urandom /dev/kmsg /dev/oldmem ++++++++++++++++++++ 因为kernel已经将所有的DDR物理内存和io寄存器线性映射到了内核空间,同时 为他们建立了mmu三级映射表,所以这就保证了,不用执行mmap再建mmu三级表,直接访问即可【gliethttp.Leith】! ==================== /dev/mem的实现: 比如我们的arm物理内存: 0x ~0x8fffffff共256M high_memory为DDR物理地址上限0x8fffffff对应的内核虚拟地址, 对/dev/mem进行读操作时, 传入的有效pos值范围为:0x ~0x8fffffff, 然后/dev/mem驱动会将0x ~0x8fffffff范围内的*ppos值,通过 __phys_to_virt(*ppos)函数将物理地址转换为内核地址,然后执行copy_to_user(),将kernel空间的内存数据拷贝到用户空间, ==================== /dev/kmem的实现: 和/dev/mem基本一样,唯一不同的地方是, /dev/kmem的read函数部不对pos值进行加工,传入的是什么值,就直接将该值作为地址执行copy_to_user()操作,所以/dev/kmem没有__phys_to_virt(*ppos)这一步 ==================== /dev/port的实现: 和/dev/mem一样,不对pos值进行加工,传入的值就是寄存器的物理地址 ==================== /dev/null的实现: static ssize_t read_null(struct file*file,char __user*buf, size_t count,loff_t*ppos) { return 0;//没东西 } static ssize_t write_null(struct file*file,const char __user*buf, size_t count,loff_t*ppos) { return count;//认为写入成功,直接返回成功写入字节数count,所以/dev/null就成了大家所谓的黑洞 } ========================= static const struct{ unsigned int minor; char*name; umode_t mode; const struct file_operations*fops; }devlist[]={/*list of minor devices*/ #ifdef CONFIG_DEVMEM {1,mem,S_IRUSR|S_IWUSR|S_IRGRP,mem_fops}, {2,kmem,S_IRUSR|S_IWUSR|S_IRGRP,kmem_fops}, #endif {3,null,S_IRUGO|S_IWUGO,null_fops}, #ifdef CONFIG_DEVPORT {4,port,S_IRUSR|S_IWUSR|S_IRGRP,port_fops}, #endif {5,zero,S_IRUGO|S_IWUGO,zero_fops}, {7,full,S_IRUGO|S_IWUGO,full_fops}, {8,random,S_IRUGO|S_IWUSR,random_fops}, {9,urandom,S_IRUGO|S_IWUSR,urandom_fops}, {11,kmsg,S_IRUGO|S_IWUSR,kmsg_fops}, #ifdef CONFIG_CRASH_DUMP {12,oldmem,S_IRUSR|S_IWUSR|S_IRGRP,oldmem_fops}, #endif }; static const struct file_operations memory_fops={ .open=memory_open,/*just aselector for the real open*/ }; static int memory_open(struct inode*inode,struct file*filp) { switch(iminor(

文档评论(0)

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

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

1亿VIP精品文档

相关文档