免费注册 查看新帖 |

Chinaunix

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

[C] 今天单位组织了一个C语言考试,其中有道题不太明白,请大家指教 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-07-11 23:17 |只看该作者
这样的问题应该放到汇编区...

论坛徽章:
0
12 [报告]
发表于 2007-07-12 00:04 |只看该作者
原帖由 tianjiao08 于 2007-7-9 20:49 发表
今天单位组织了一个C语言考试,其中有道题不太明白,请大家指教:

题目大概是这样的,有一个函数得不到源代码,但直到它的起始地址和长度,所以现在想把这个函数读入写到一个数组,并将数组置为可执行的属性 ...

这种用法并不少见,举个例子,在linux中,显卡的driver除了intel的外,都不开源,其它的就是通过把二进制dump出来存到数组中使用。

论坛徽章:
0
13 [报告]
发表于 2007-07-12 09:11 |只看该作者
1和2都应该是吧,不太清楚linux下是如何的。但是我确实差不多这样用过。使用cache的时候,我想把某段代码锁定在I-cache中,那么锁的这段代码本省就不能被cache。就需要在锁的代码开始部分的pc|0x80000000,这段代码是不能调用其他函数和访问其他全局的变量

论坛徽章:
0
14 [报告]
发表于 2007-07-12 09:31 |只看该作者
原帖由 cqpp 于 2007-7-12 09:11 发表
1和2都应该是吧,不太清楚linux下是如何的。但是我确实差不多这样用过。使用cache的时候,我想把某段代码锁定在I-cache中,那么锁的这段代码本省就不能被cache。就需要在锁的代码开始部分的pc|0x80000000,这段 ...


并非不能访问全局变量和static变量。前提是对他们的访问必须用绝对地址,并且程序不能被relocation。外部函数也同样,使用绝对地址是可以访问的。
举个例子,你自己写一个程序,编译好后,把其中一个函数(该函数访问了你程序中的全局变量)的二进制dump到一个数组中,把数组转换成该函数的指针是可以直接执行的。

ps:贴主说到I-cache,不是用的x86的cpu吧。x86的I-cache和D-cache是在一起的,不同于risc架构的cpu。

论坛徽章:
0
15 [报告]
发表于 2007-07-12 10:00 |只看该作者
原帖由 cqpp 于 2007-7-12 09:11 发表
1和2都应该是吧,不太清楚linux下是如何的。但是我确实差不多这样用过。使用cache的时候,我想把某段代码锁定在I-cache中,那么锁的这段代码本省就不能被cache。就需要在锁的代码开始部分的pc|0x80000000,这段 ...


如果贴主说的i-cache是指TLB的cache,那在某些risc架构上(x85不行)是可以把一个固定的mapping放到里面的。但如果贴主指的是L1,L2这样的cache,则是做不到把程序锁在cache中,我的看法如下:

至少intel公司所有架构的cpu都没有这种功能。cache的替换策略是硬件完成的,程序员不能控制。当然,如果cache是组关联而不是全关联,且操作系统是你自己写的,可以把要锁的数据放到一个特殊的地址,并且内存中所有地址算出的tag和该地址相同的内存都不用,理论上是可以让cpu每次替换时都不命中你锁的cache的(当然这是个想法)。
这里贴主所说的pc|0x80000000不是把代码锁在cache中,而是让该段代码un-cache。这种用法在bios程序中用的很多,mmio中的数据部分也用,所有的修改通过write-through方式写回。

呵呵,这些和lz的帖子无关,随便说说,打扰了。欢迎讨论

[ 本帖最后由 zx_wing 于 2007-7-12 10:13 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2007-07-12 10:07 |只看该作者
怎么扯到 cache 去了,程序是可以将数据载入 cache 的。

LZ 的贴子中,一个函数不知道源码,只知道起始地址和长度。参数有多少个,是什么类型不知道,那怎么传参,答案 2 显然也不对吧,你怎么知道它没调用其它函数

论坛徽章:
0
17 [报告]
发表于 2007-07-12 10:14 |只看该作者
原帖由 mik 于 2007-7-12 10:07 发表
怎么扯到 cache 去了,程序是可以将数据载入 cache 的。

LZ 的贴子中,一个函数不知道源码,只知道起始地址和长度。参数有多少个,是什么类型不知道,那怎么传参,答案 2 显然也不对吧,你怎么知道它没调用其 ...

我也觉得偏题了,但觉得不对就忍不住说说了

另外lz的问题中对函数的功能肯定应该是了解的,例如有头文件中的声明。不然这种例子根本就什么用。

[ 本帖最后由 zx_wing 于 2007-7-12 10:16 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2007-07-12 14:32 |只看该作者
lz说的是不是这样的:

void beCalled()
{
     // 示例函数

}

typedef void (*Fun) ();

void test()
{
    char fun_buff[BIG_ENOUGH]; //BIG_ENOUGH 要比beCalled的代码段要长,按楼住说已经知道函数的长度了,这个就不是问题了

  
    memcpy(fun_buff, beCalled, BIG_ENOUGH);
    
    ((Fun) fun_buff)();
}

这个函数可能是硬件驱动吧,固定在ROM中了,因此有固定的地址和代码长度

[ 本帖最后由 xxandxx 于 2007-7-12 14:38 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2007-07-13 17:43 |只看该作者
又培训了一批菜鸟,哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP