免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ywf851207
打印 上一主题 下一主题

一幅图让你彻底明白虚拟地址与物理地址的映射关系 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-01-11 20:19 |只看该作者
本帖最后由 ywf851207 于 2011-01-11 20:25 编辑
  1. #define DEVICE_NAME "GPIO-Control"

  2. #define IOCTL_GPIO_ON        1
  3. #define IOCTL_GPIO_OFF        0

  4. static unsigned long gpio_table [] =
  5. {
  6.         S3C2410_GPB5,
  7.         S3C2410_GPB6,
  8.         S3C2410_GPB7,
  9.         S3C2410_GPB8,
  10. };

  11. static unsigned int gpio_cfg_table [] =
  12. {
  13.         S3C2410_GPB5_OUTP,
  14.         S3C2410_GPB6_OUTP,
  15.         S3C2410_GPB7_OUTP,
  16.         S3C2410_GPB8_OUTP,
  17. };

  18. static int tq2440_gpio_ioctl(
  19.         struct inode *inode,
  20.         struct file *file,
  21.         unsigned int cmd,
  22.         unsigned long arg)
  23. {
  24.         if (arg > 4)
  25.         {
  26.                 return -EINVAL;
  27.         }

  28.         switch(cmd)
  29.         {
  30.                 case IOCTL_GPIO_ON:
  31.                         s3c2410_gpio_setpin(gpio_table[arg], 0);
  32.                         return 0;

  33.                 case IOCTL_GPIO_OFF:
  34.                         s3c2410_gpio_setpin(gpio_table[arg], 1);
  35.                         return 0;

  36.                 default:
  37.                         return -EINVAL;
  38.         }
  39. }

  40. static struct file_operations dev_fops = {
  41.         .owner        =        THIS_MODULE,
  42.         .ioctl        =        tq2440_gpio_ioctl,
  43. };

  44. static struct miscdevice misc = {
  45.         .minor = MISC_DYNAMIC_MINOR,
  46.         .name = DEVICE_NAME,
  47.         .fops = &dev_fops,
  48. };

  49. static int __init dev_init(void)
  50. {
  51.         int ret;

  52.         int i;
  53.        
  54.         for (i = 0; i < 4; i++)
  55.         {
  56.                 s3c2410_gpio_cfgpin(gpio_table[i], gpio_cfg_table[i]);
  57.                 s3c2410_gpio_setpin(gpio_table[i], 0);
  58.         }

  59.         ret = misc_register(&misc);

  60.         printk (DEVICE_NAME" initialized\n");

  61.         return ret;
  62. }

  63. static void __exit dev_exit(void)
  64. {
  65.         misc_deregister(&misc);
  66. }

  67. module_init(dev_init);
  68. module_exit(dev_exit);

  69. MODULE_LICENSE("GPL");
  70. MODULE_AUTHOR("www.embedsky.net");
  71. MODULE_DESCRIPTION("GPIO control for EmbedSky SKY2440/TQ2440 Board");
复制代码
我在这个LED驱动程序中怎么没有看到虚拟地址到物理地址的映射啊,我觉得应该有一个ioremap()才对啊,怎么没有呢?为了不耽误大家逛MM论坛的时间,先发张MM图。。。。

论坛徽章:
0
22 [报告]
发表于 2011-01-11 21:44 |只看该作者
从线性地址到物理地址的转换,实际上是一种映射。所有进程的3~4G的线性地址实际上是映射到相同的物理地址的。这一点不多说了。为了方便起见, 3~4G的线性地址与对应的物理地址基本上是呈线性关系的。即线性地址=物理地址+3G。但是如果把这1G的线性地址都简单地处理为对应物理地址+3G,就会有新的问题产生。例如,如果物理地址大于4G,那么内核就没法访问这些地址了。所以,内核必须要从这1G的线性空间中预留一部分,作其它用途,(例如,映射高端物理地址)。经过实践,发现128M线性地址够用了。所以,3~4G的线性地址中896M映射到物理地址中的0~896M,剩下的128M挪作它用,例如,内核空间的非线性映射(在vmalloc中使用)以及高于4G的物理地址的映射。
        我曾经产生过的疑问:
        1.如果物理内存小于896M,那不是所有的物理地址都被内核用完,没有内存留给用户空间了么?
        事实上,小于896M时,同一块物理内存可能同时被映射到用户空间和内核空间,从数学的角度来讲,也就是所谓的“双箭一雕”。我们相信内核是没有bug的,所以不用担心因此产生的内核对用户空间数据破坏的可能性。
        2.如果物理内存小于896M,所有物理内存地址都与内核线性地址相差3G,那vmalloc不是没有内存使用了么?
        不使用vmalloc当然是不可能的,因为模块装载时就会用到vmalloc。原理与问题1一样,即使在内核空间,也可能多个线性地址映射到同一个物理地址,也就是“双箭一雕”。所以vmalloc仍然能获得相应的物理内存。
        对以上两个问题的小结。系统在启动时会把前896M物理地址映射到3G以上的线性空间。但是映射不等于使用。事实上内核只使用了很小一部分(一般才几M)。只要有足够的未使用的物理内存,用户进程和vmalloc都不会有问题。
        3.如果物理内存大于896M。那对内核而言不是无法在同一时刻访问所有的物理内存了么?
        是的,虽然内核可以通过临时映射和永久映射来访问所有的物理内存,但是用到的线性地址很有限,即一次只能访问一小部分物理内存。当无法访问到更高地址物理内存时,只能通过修改内核页表来达到目的。但是,这对内核就足够了。因为上面说过,内核所需要的内存很少。内核只是偶尔会访问一下高端内内存。而对于用户进程而言,只要页表开启了PAE,就可以访问64G以内的物理内存(虽然只有4G的线性空间,但是也足够了。)
        4.内核页表是如何共享的呢?
        我们知道所有的进程共享内核空间,所以共享内核页表是很自然的事。理论上内核只有一个页表,对应的内核全局页目录swapper_pg_dir,所有进程的页目录的最高256项与swapper_pg_dir相同。可惜的是,每个进程有自己的页目录,共1024项。其中最高的256项指向的是内核空间。尽管这些页目录项可以指向同样的内核页表,但是一旦内核页目录改变了,所有进程的页目录都需要同步。这种情况是存在的。比如内核调用vmalloc时。
        幸亏有了页错误,我们可以从容地处理页目录的同步。如果内核调用了vmalloc,内核只修改内核全局页目录。当其它进程访问vmalloc产生的线性空间时,会产生页错误。页错误处理程序可以判断当前的页错误是由于vmalloc产生的,于是修改对应的页目录,使它们与内核全局页目录保持一致。

论坛徽章:
0
23 [报告]
发表于 2011-01-12 10:19 |只看该作者
求楼主头像大图
jerometao 发表于 2011-01-06 11:23



    同求,最好是仰视角度

论坛徽章:
0
24 [报告]
发表于 2011-01-14 12:00 |只看该作者
没整明白

论坛徽章:
0
25 [报告]
发表于 2011-01-25 13:30 |只看该作者
看看操作系统原理就明白了。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
26 [报告]
发表于 2011-01-25 14:22 |只看该作者
22楼的总结非常好啊。好多问题我也困惑了很久。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
27 [报告]
发表于 2011-01-25 14:40 |只看该作者
我在这个LED驱动程序中怎么没有看到虚拟地址到物理地址的映射啊,我觉得应该有一个ioremap()才对啊,怎么 ...
ywf851207 发表于 2011-01-11 20:19



    你看看S3C2410_GPB5_OUTP的定义吧。

    我拿一个我这里的定义,不知道跟你是不是一样,我觉得应该有一个地方把这里映射到了寄存器上了。我再仔细看看arm启动分析去


#define S3C64XX_GPCCON                  (S3C64XX_GPC_BASE + 0x00)
#define S3C64XX_GPC_BASE        (S3C64XX_VA_GPIO + 0x0040)
#define S3C64XX_VA_GPIO         S3C_ADDR(0x00500000)
#define S3C_ADDR(x)     ((void __iomem __force *)S3C_ADDR_BASE + (x))

/* Fit all our registers in at 0xF4000000 upwards, trying to use as
* little of the VA space as possible so vmalloc and friends have a
* better chance of getting memory.
*
* we try to ensure stuff like the IRQ registers are available for
* an single MOVS instruction (ie, only 8 bits of set data)
*/

#define S3C_ADDR_BASE   (0xF4000000)

论坛徽章:
1
天蝎座
日期:2015-02-04 15:40:37
28 [报告]
发表于 2011-02-01 17:03 |只看该作者
宏观上可以这么理解吧。言简易懂

论坛徽章:
0
29 [报告]
发表于 2011-02-02 17:26 |只看该作者
回复 1# ywf851207


   

论坛徽章:
0
30 [报告]
发表于 2012-06-27 17:08 |只看该作者
怎么看不见图啊啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP