免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3118 | 回复: 18
上一主题 下一主题

[内核模块] 如何赋予一段code 执行权限(SZ_DIV)?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-13 15:11 |只看该作者 |倒序浏览
本帖最后由 SZ_DIV8 于 2012-07-13 15:11 编辑

Hi,各位好:
                我现在有一段Code  存于 flash  chip 中,  直接在flash 上 跑这段Code 太慢了 ,现在打算将这段Code Copy到 RAM Buffer 中, ,但是 发现Copy 后,code 在Ram Buffer 中 无法执行, (code 都需要在内核态跑).
             请问,如何才能让我的code 跑起来?? 谢谢

论坛徽章:
0
2 [报告]
发表于 2012-07-13 15:47 |只看该作者
这个主要跟页表项相关,加上可执行属性就能执行,否则就不行。至于什么内核态用户态,主要区别在于一些特权指令的执行环境,跟可执行权限没关系。建议你看看相关架构的页表实现。

论坛徽章:
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
3 [报告]
发表于 2012-07-14 10:57 |只看该作者
你是什么体系结构的? 有些体系结构TLB有相关的属性不允许执行。

论坛徽章:
0
4 [报告]
发表于 2012-07-14 11:08 |只看该作者
回复 3# amarant


    您好,  我的机器是X86的

论坛徽章:
0
5 [报告]
发表于 2012-07-14 11:19 |只看该作者
本帖最后由 SZ_DIV8 于 2012-07-14 11:23 编辑

回复 2# 灌水菜鸟


    多谢您的回复,  
    现在是这样的情况,  
     1. 将flash  code  (大约32Kbytes)  copy到 一个数组    Buffer[64*1024*1024]里 ,然后 执行就会报段错误

     2.  将flash  code(大约32Kbytes)    copy 到 物理内存 0x80000 开始的地方, 或者别的没有被使用的物理内存段,然后用do_mmap() ,赋予这段物理内存可读写执行的权限则可以执行


第二种方法是可以实现可执行的, 但是 ,我没有办法确定  哪一段物理内存不被使用(因为代码需要在不同 平台X86的机器上run)
所以,只能 选择第一种方法,  然后 要想办法赋予 这个数组里的Code 执行权限 ,不知道您还有何执教,谢谢
       因为刚刚接触Linux ,所以不太了解上层得一些东西,还望不吝赐教!~!

论坛徽章:
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
6 [报告]
发表于 2012-07-14 11:28 |只看该作者
回复 5# SZ_DIV8


    你好,x86不太了解。但是数组是再data段里的。data段是不可以执行的。你可以在你的buffer声明的时候放到code段里就可以了。

char buf[1024] __attribute__((__section__(".code")));

论坛徽章:
0
7 [报告]
发表于 2012-07-14 14:40 |只看该作者
回复 6# amarant


    您好, 有尝试加了这个 属性 仍然是同样的包错!~!~!~

论坛徽章:
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
8 [报告]
发表于 2012-07-14 18:11 |只看该作者
回复 7# SZ_DIV8


    加了这个属性可能拷贝不过去,代码段一般是只读不能写的。如果是这个错误的话,那就要麻烦一点。如果不是的话,你可以对照着你的链接脚本看看你的程序是怎么链接的。你跑的是linux吗。也就是说你只是在bootloader的地方进行了代码搬移吧?这样的话,就要看你的linux是怎么链接的,把代码搬到合理的位置执行即可

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
9 [报告]
发表于 2012-07-15 01:02 |只看该作者
回复 1# SZ_DIV8
这可以用代码的重定位技术。一般做法:
link scripts里该代码LOAD地址和RUN地址给不一样的,程序执行时比较两个地址,不一样时,自动拷贝到RUN地址然后执行。

   

论坛徽章:
0
10
发表于 2012-07-16 09:07
本帖最后由 SZ_DIV8 于 2012-07-16 09:10 编辑

回复 8# amarant


    Hi,
          多谢您的及时回复, 目前是加了这个属性 是可以copy 到 数组里,我又print 看了的

         我感觉是我没有描述清楚我的情况:
            1. 我现在写的  是一个linux 驱动 代码
            2.然后在此驱动中 需要调用  BIOS flash 中的一段code ,这段code 是BIOS工程师所写,这段code 位于 flash 中, 它在X86 CPU 物理内存地址空间   的 FFF0_0000  ~  FFFF_FFFF 之间(4G 顶端往下 1M的地方).
            3.我在我的linux  driver中直接 把    FFF0_0000  ~  FFFF_FFFF  这段物理地址 用 do_mmap() 映射 后, 直接执行的话,是可以执行的,  然后只是 因为这段BIOS代码 所在的空间 对应的 物理实体是BIOS flash ,因此,执行速度较慢,
            4,现在我是想要加快 执行速度, 所以想是否可以 将  FFF0_FFFF ~  ffff_FFFF 的BIOS code(位于flash 中) 先 copy 到  RAM Buffer 中,赋予权限, 然后再执行???  (copy  code 的动作也是在 linux driver 中进行)
            
         谢谢!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP