QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2671|回复: 8

ubuntu预留内存,并写一个驱动将预的内存做为一个块设备

[复制链接]
发表于 2012-12-27 14:58:27 | 显示全部楼层 |阅读模式
ubuntu12.04 在虚VMware上安装的,在VMware中分配给ubuntu的是2G内存 ,通过在ubuntu的grub.cfg文件中设置mem=1536M实现预留512M的内存,然后要写一个块设备驱动程序,来管理预留512M的内存,

问题(1)
   没有设置mem之前
root@wensheng-virtual-machine:ram#free
             total       used       free     shared    buffers     cached
Mem:       2048120    1303512     744608          0      57440     668940
-/+ buffers/cache:     577132    1470988
Swap:      2094076          0    2094076
root@wensheng-virtual-machine:ram#
设置mem=1536M之后
wensheng@wensheng-virtual-machine:~$free
             total       used       free     shared    buffers     cached
Mem:       1532152     435564    1096588          0      45852     179284
-/+ buffers/cache:     210428    1321724
Swap:      2094076          0    2094076
wensheng@wensheng-virtual-machine:~$
为什么不标准的2G(2097152KB)或1.5G(1572864KB)而是2048120KB和1532152KB,(这个是不重点,但个人不解)
问题(2)(这个是重点求解)预留的512M内存的物理地址是多少 ,是0x60000000(1.5G)到0x80000000(2G)吗,我的PC机是4G内存win7系统,分配给ubuntu的是2G,
问题(3) 关于这个驱动程序(这方面没经验),通过ioremap()映射内存, 出错,不能申0x60000000-0x80000000,要求0x10到0x0,(好像是这个意思),什么原因。
问题(4)编译时经有时候出现下面问题
。。。。。
make[2]: *** No rule to make target `kernel/bounds.c', needed by `kernel/bounds.s'.  Stop.
make[1]: *** [prepare0] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-23-generic'
make: *** [default] Error 2
什么原因,没怎么搞清楚,在网上查了一下有说是差头文件,有说内核源码不配套,求解

最后,就是关那这个驱动程序 ,因为没有这方面的经验,所以没有很好的思路那位大能指点一下,想找一些源代码参考,但是不知道参考那些那,drivers及block目录下太多,求推荐(涉及到内存映射的)
  
新人,新手,求大侠们指点,谢谢!
 楼主| 发表于 2012-12-27 15:10:53 | 显示全部楼层

问题(3)错误如下

ioremap error for 0x60000000-0x80000000, requested 0x10, got 0x0


跪求大神指点
回复

使用道具 举报

 楼主| 发表于 2012-12-28 14:41:32 | 显示全部楼层

不给力,没有人回,自己已解决

物理内存有误,不是0x60000000-0x80000000,在dmesg中查看后改正,已成功申请内存映射,驱动程序已写好,可以成功挂载,通过fdisk -l 能查看模块信息
回复

使用道具 举报

发表于 2012-12-28 15:11:03 | 显示全部楼层
hoho,不懂内核开发,基本不懂C,没办法。
回复

使用道具 举报

 楼主| 发表于 2012-12-28 16:22:07 | 显示全部楼层
,不会吧,难到是我发贴发错区域了,汗!
回复

使用道具 举报

发表于 2012-12-28 17:10:48 | 显示全部楼层
原帖由 wenshengking 于 2012-12-28 16:22 发表
,不会吧,难到是我发贴发错区域了,汗!

制作发行版和做内核开发是不一样的.
内核开发有单独的版块,不过那个人气不行.
回复

使用道具 举报

发表于 2012-12-28 17:54:51 | 显示全部楼层
给我感觉,你让内核只用 1.5G 内存,那么你就不能用驱动实现读取剩下的那 512M 内存了。
回复

使用道具 举报

 楼主| 发表于 2012-12-31 11:24:54 | 显示全部楼层
原帖由 jiangtao9999 于 2012-12-28 17:54 发表
给我感觉,你让内核只用 1.5G 内存,那么你就不能用驱动实现读取剩下的那 512M 内存了。



呵呵---
       这个是可以的,通过ioremap()将512M的物理地址映射到内核虚拟地址,然后在上面写个块设备驱动就行了,之前一直把512M的物理地址搞错了,所以不成功。现在已经解决了,发贴时没仔细看,贴子发错区了,
回复

使用道具 举报

发表于 2013-1-1 00:38:00 | 显示全部楼层
呃,这种使用内存方法好像共享显存上有用到这种方法.

内存作为硬件是被初始化的,内存空间也是自动检测的,最后kernel的setup.c 里面会parse cmdline 参数根据mem参数重置可用内存大小.
ioremap 应该可以,直接v2p 访问内存也可以吧.

free 显示的内存少一块一直也是迷惑,我总是假设linux内核会用掉一部分,内核地址空间里面的就被扣除了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-24 16:54 , Processed in 0.152321 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表