免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1143 | 回复: 3

[内核入门] 外设访问 [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2016-10-10 17:24 |显示全部楼层
本帖最后由 _nosay 于 2016-10-10 17:36 编辑

  • 内存空间、I/O空间
    C语句:char *p = 0x21; *p = 'a';
    汇编语句:IN AL, 21H
    这两个十六进制的21,都是程序用于描述逻辑使用的“代号”(虚拟地址),它们最终要映射到一个真实物理介质的某个地方。
    指令不同,指令中地址的含义也不同,就像我们说话时的场合不同,默认单位就不同。同样的值0x21,C语句中用*去访问,就表示要访问内存空间,汇编语句中用IN指令访问,就表示要访问I/O空间,这便是访问外设的其中一种方式:I/O映射式。这种方式需要硬件额外提供一套访问I/O空间的指令。
    另外一种方式就是在内存空间中,划分一块专门用于映射外设,跟内核空间/用户空间的划分类似,是一种约定,规定某个范围的地址用于访问外设,其它地址用于访问内存,比如上述的0x21,划分到访问外设的地址范围,就不可能用它访问到内存了。
    iomap.png

  • ioremap()
    I/O地址区间很小,如今系统上可以同时插很多外设,并且有些外设中的寄存器、ROM也越来越大,所以现在的系统一般都支持将外设映射到内存空间,可以将外设认为是特殊的内存,但它只能映射到内核空间,所以不服从kswapd的换出(注意不能换出与不能释放是两回事,内核占用的内存页面不能换出,但只要是动态分配的就可以释放)
    Linux内核中的ioremap()就是用于将外设中的资源映射到虚拟地址,其中函数中的“re”是有缘故的,表示“反向”的意思:因为内核空间的虚拟地址与物理地址之间是固定的3G偏移,所以外设的物理地址(“总线地址”)确定,就必须用指定的内核虚拟地址跟它映射,因此相对于用户态的内存分配过程是反的,不是先分配虚拟地址,到需要时再分配物理地址并建立映射。
    所以说外设和内存虽然都是物理介质,但它比内存更大牌,系统要访问它,必须一开始就“分配”它,并且再也不“释放”,不像内存那要,需要了就“分配”,不需要了就“释放”,招之即来,挥之即去。
    详细过程读代码去吧,good good study, day day up~

  • 总线与外设的映射
    所谓的物理地址,就是最终写到总线上面的地址,所以ioremap()只是完成了整个过程中的一半,另外还有总线地址与各种外设之间的映射,详见“《Linux内核源代码情况分析》8.4节说明的PCI总线”,比较复杂,以后再一起学习。

论坛徽章:
146
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2016-10-10 17:36 |显示全部楼层
这个算是干货总结帖吗

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2016-10-10 17:51 |显示全部楼层
回复 2# 王楠w_n


嗯,趁刚学完把理解的东西记下来,要不然以后忘了。

论坛徽章:
146
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2016-10-10 18:10 |显示全部楼层
回复 3# _nosay
加油,支持,以后遇到问题,总结成帖子,逐楼层记录,搞成读书笔记

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP