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