免费注册 查看新帖 |

Chinaunix

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

[C] 可以通过嵌套汇编访问硬件地址码 [复制链接]

论坛徽章:
0
发表于 2013-06-13 17:09 |显示全部楼层
在应用程序里想直接访问一个IO空间,知道某个寄存器的虚拟地址。在应用程序里直接访问虚拟地址肯定不行的。
突然想起来,在c语言里可嵌套汇编,汇编的优势就是可以访问任何硬件。 可是我测试结果还是一样不能访问。
1) 通过这种方式访问硬件可以吗?
2)如果不可以,c程序嵌套汇编的意义是什么?
(gdb) x 0xc4300278
0xc4300278:     Cannot access memory at address 0xc4300278.
  1. int main()
  2. {
  3.     long *val=0;
  4.     __asm__ volatile
  5.     (
  6.         "lis 0, 0xc430\n"
  7.         "ori 0, 0, 0x0278\n"
  8.         "stw 0, 8(31)\n"
  9.         "lwz 11, 8(31)\n"
  10.         "stw 0, 0(11)\n"
  11.     );
  12.     printf("val=%x\n",*val);   <<< 主动core掉此程序。
  13.     return 0;
  14. }
复制代码

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2013-06-13 17:19 |显示全部楼层
被操作系统拦住了。
访问硬件不等于访问内存

论坛徽章:
0
发表于 2013-06-13 18:02 |显示全部楼层
回复 2# hellioncu


被操作系统拦住了。
  >>> 应该是这样的,如果通过系统调用进入内核后,在访问估计应该可以。
访问硬件不等于访问内存
>>> 不是这样吧。硬件这个实体,提供给别人接口就是寄存器和内存。访问硬件就是访问硬件的寄存器或者硬件的内存。但是不论是访问寄存器或者内存,都是通过内存的(IO和内存统一编地址,powerpc 结构的)

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2013-06-14 00:08 |显示全部楼层
powerpc汇编真心难看

1) 通过这种方式访问硬件可以吗?
-->可以。但cpu也分等级的,如:ring 0-4。有些访问硬件需要高等级,因为一般访问硬件都需要用到内核空间(如:iomap等)

2)如果不可以,c程序嵌套汇编的意义是什么?
-->灵活、高效

论坛徽章:
0
发表于 2013-06-14 08:53 |显示全部楼层
回复 4# chenzhanyiczy

2)如果不可以,c程序嵌套汇编的意义是什么?
-->灵活、高效
>>> 在有os的系统中,基本上(应该是全部吧)硬件访问都被放到了os里面了。如果按照这个思路,c程序里嵌入汇编就没大意义了。
      如果不是这样,能举个例子不?

   

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
发表于 2013-06-14 09:36 |显示全部楼层

这玩意应该写个驱动让内核载入运行,然后你的应用程序通过系统调用接口再和你的驱动沟通。
余不解释。

论坛徽章:
0
发表于 2013-06-14 11:38 |显示全部楼层
很高深的说 c中怎么嵌入汇编的一直不明白

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2013-06-27 11:21 |显示全部楼层
回复 5# 怪怪虎


    os不也有大把c嵌入汇编吗,一样的。 就是灵活、高效,你可以手动写一段嵌入汇编代替编译器生成的汇编。

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
发表于 2013-06-29 21:36 |显示全部楼层
存在而且还在使用,应该有它的理由。汇编和C都只是编程语言而已,如果C不能访问,汇编应该就不能。这应该就像楼上几位说的,系统不允许你这样做,直接通过IO控件硬件,应该是驱动做的事。

论坛徽章:
0
发表于 2013-07-01 08:53 |显示全部楼层
回复 9# idi0t
想了想这个问题,其实不管是驱动还是应用层(如果应用层允许的话),访问硬件的的code是一样的,最终都是in,out.(x86),如果是统一编址的话,就是*addr=val
关键是系统允许不允许访问某个地址,更具体点应该是虚拟地址的某几位,这些应该是由MMU控制的。
在MMU上这个地方是硬件控制还是软件控制,不大清楚。个人觉得硬件自动控制的可能性比较大。欢迎大家讨论。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP