`
Arath
  • 浏览: 47339 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
  • LucasLee: 路过。C语言用的很少,看了各位的讨论,长了点见识。感觉C语言的 ...
    双刃剑 - 宏
  • Arath: 模板个人认为是个非常不好的东西,性价比非常不好,只是让程序员多 ...
    双刃剑 - 宏
  • jack: 尝试过近似纯模板的代码,写的很爽,编译时等死...
    双刃剑 - 宏
  • Arath: 在编译器中宏和模板处理的位置不同,其实完全在于C++对于模板的 ...
    双刃剑 - 宏
  • whisper: 所以纯一些的说编译器并不知道宏的存在预处理器都把活干完了模板才 ...
    双刃剑 - 宏

程序64位化带来的问题和思考

阅读更多
公司的一个产品需要转移到了Windows Vista 64上去,由于程序某一部分和Windows的一个AP紧密相连,而这个Windows AP已经64位化了,不得不将自己的程序也转到64位.
我原来不是负责这个产品的,由于项目很赶,所以被零时抽调去帮忙,遇到了一些问题,这里和大家分享下.
1. 指针和long的转换
这是最基本的处理部分,由于32位系统下地址是32位,所以很多代码里都会存在这样的转换:
void* pData;
LONG lData;
lData = (LONG)pData;
现在地址是64位了,所以原来的这种转换就会导致地址高4Byte丢弃的问题.
这种转换向来被认为不安全,但还是大量出现,实际程序员代码的时候只要用一个指针保留就可以,完全没有必要用一个long保留,同样的问题也会出现在函数指针的保留.
思考:
所谓的存在即合理的思维在作怪吧,很多程序员认为这么做程序运行的好好的,所以不管是否有风险还照样这么写,实际上改成安全写法代码多不了多少.
当然不排除很多程序员对16位、32位、64位完全没有概念的.
还有一点可能是微软的windows消息给人以误导,消息的WPARAM和LPARAM中常会夹带数据指针,然后强制类型转换,但是看一下它们的定义,其中隔了一层,虽然只是语法上的小小手脚,但是绝对是有先见之明, 而很多人只会依样画葫芦而未明白期间的巧妙.

2. PE Import和Export Table的变化
程序中用到了PE hack,由于之前有人发现vista 32下原来所需要替换的一个import table中的函数找不到了,结果竟然去修改了export table, 姑且不谈修改export table的危险吧,结果vista 64的时候发现PE格式有了小小的变更.
MS将Import table中的地址转成了64bit,但是export table却还是32bit,估计其认为代码不可能大于4GB吧,这样就会发现更改export table变得很难,因为不同的dll会被load在不同的地址段,其间差距会大于4GB,所以只有将自己的dll强制定义在和目标dll相同的4GB范围内.
回头来说这种更改是极其危险的,因为对于export table OS会尽量保持全局唯一,所以一旦你的dll退出未能正确恢复原有的值,会造成其他所有使用到这个dll的程序crash.
最终我发现需要hack的那个函数放在了delayload import table中,简单的修改就解决了问题.
如果这个问题最终找不到而还是采用修改export table的方法,那么就会很惨,测试部门已经发现了经常性的系统crash.
思考:
这里出现了弯路,这个弯路项目的时间压迫难辞其咎,但是程序员未能自己去分析问题是更大的问题,vista在很多方面都保留了很好的兼容性,去分析下windows的目录就会发现基本和xp区别不大,所以很多基础dll的功能也没有变化(这一点让我感觉到vista并未如其发表的那样70%代码重写),在分析dll的时候只要稍微仔细点就会找到问题很简单.
另一个问题就是MS在定义PE格式的时候的确有很高的前瞻性,很好的保持了松耦合的能力,其实PE格式在2001年后就基本没有什么大的更改,那时大家还基本没有64位的概念,这一点是需要学习的,但是同样对于export table没有扩展到64bit我还是保留意见,难道真的认为4GB不会超过?当年盖茨大叔不是宣称640KB就够了吗^.^

3. DelayLoad的问题
DelayLoad这个特性在VC6开始出现,一般大家不会去接触,包括我自己,要不是这次机会也不会去看.
推荐一篇文章
http://www.microsoft.com/msj/0200/hood/hood0200.aspx
有详细的阐述,有兴趣可以自己看一下,其实其原理很简单,主要是在使用到某个dll的接口的时候再去load这个dll,这样可以节约空间,因为有些dll中的接口可能在程序周期中永远不会用到, 而且如果某个dll没有,如果没有用到,那么整个程序也能继续执行.
这真的是一个巧妙的设定, 虽然在第一次呼叫的时候会有小小的性能损失,并且代码也会稍微大一点,但是可能会带来更大的空间节省.
但是随即带来的思考, 为什么这么好的一个东西会那么生疏呢?个人考虑有以下原因:
1. 这种技术显然对于很多人来说过于底层了,有多少人在意编译出来的程序是怎么样存放,又是如何被加载运行的呢?
2. DelayLoad带来的好处对很多人不可见,只要我的程序编译通过,并且可以正确执行就可以了,节省了那么些空间或者扩展兼容有必要考虑吗?
3. 现在的硬件太好了,何必要去做这种优化呢?内存消耗多了,没什么嘛去买1GB内存插上不久解决了?
4. 编译系统不够智能,可能Visual Studio做的更加智能些,自动去分析然后产生delay load会更好吧?
如此这样一个不错的技术可能慢慢被人们淡忘.

引申一个问题就是我们现在硬件越来越好,但是大家还是觉得不够用,为什么?这几天我在写另一篇文章,可惜一直很忙还未能完成,就是自己在反思分析这个问题.
分享到:
评论

相关推荐

    现象级小程序背后的社交思考

    通过合理的社交化设计,小程序不仅可以提升自身的品牌影响力,还能有效促进用户的增长和留存。对于开发者而言,深入理解用户需求、不断创新设计思路是关键所在。未来,随着技术的不断进步和社会媒体生态的进一步完善...

    京东社交电商基于小程序的布局和思考-2019.5-23页.pdf

    同时,京东还要面对来自其他电商平台的竞争,如何在保持平台特色的同时,吸引更多的用户和合作伙伴,是京东在社交电商领域需要持续思考的问题。 综上所述,京东社交电商基于小程序的布局,不仅体现了对新兴电商模式...

    关于银行业“微信小程序”应用的调查与思考.pdf

    关于微信小程序的论文,通常会涉及市场调查、用户研究、技术分析和案例研究等,其中有不少是探讨如何将小程序与特定行业如银行业务结合起来,解决行业特定问题。这些论文能够为同行提供参考和借鉴,帮助行业内部人员...

    试析大数据时代自动化运维管理的实践和思考.pdf

    【大数据时代自动化运维管理的实践和思考】 在大数据时代,自动化运维管理已成为现代数据中心不可或缺的一部分。随着科技的飞速进步,我国的经济和信息化水平不断提升,大数据已经渗透到日常生活的各个角落,数据...

    C语言程序设计课程教学思考与探索.pdf

    在探讨“C语言程序设计课程教学思考与探索”这一主题时,我们首先需要明确C语言程序设计课程的教学目标和学习方法。C语言作为高校计算机基础课程之一,其教学不仅要注重知识的传授,更要注重学生的实践能力培养。...

    热度过后,重新思考小程序.pdf

    在热潮之后,业界开始冷静分析和思考,如何在保留小程序便利性的同时,解决它带来的碎片化、依赖平台等问题。小程序的未来发展,将取决于技术的进步、用户习惯的变化以及开发者对市场的洞察力。开发者、企业和行业...

    电力调度自动化的网络安全问题思考.pdf

    5. 网络安全的重要性和长远影响:探讨网络安全对电力系统稳定运行的重要性,以及网络安全问题处理不当可能带来的长远影响。 在实际工作中,电力行业的相关人员应当深入理解和掌握这些知识点,以确保电力调度自动化...

    电力企业配电自动化系统的基本问题思考.pdf

    电力企业配电自动化系统是指采用现代电子、通信、计算机及网络技术,对配电网进行实时信息监测、控制、管理,并集成相关数据与信息,从而实现电网的智能化管理和供电质量的提升。在讨论电力企业配电自动化系统的基本...

    关于银行业“微信小程序”应用的调查与思考.zip

    通过对“关于银行业‘微信小程序’应用的调查与思考”的深入分析,我们可以洞察到这一新兴技术如何改变银行业的服务方式,提升客户体验,并对银行业务带来深远影响。 首先,微信小程序为银行业提供了更快速、更直接...

    产品经理电商值得做百度小程序吗说说我的案例与思考.pdf

    本文将以产品经理的角度,结合实际案例和思考,对这个问题进行深入分析。 首先,我们来看一下百度小程序的基本情况。百度小程序依托于手机百度APP,月活跃用户数(MAU)达到2.5亿。相比微信小程序的庞大用户基础,...

    PLC程序开发中的结构化编程 (2).pdf

    以下是关于结构化编程在PLC程序开发中的具体实践和思考。 首先,程序结构设计的模块化是基础。模块化设计允许我们将复杂的系统分解为独立、可复用的单元,便于多人协作和后期维护。在设计过程中,可以根据功能区分...

    关于工程管理信息化与自动化的若干思考.pdf

    其次,自动化技术在工程管理中的应用,主要体现在自动化设备和系统的运用,它们能够根据预设程序或实时数据自动执行任务,减轻人力负担,提高工作效率。例如,自动化施工设备可以精确控制施工过程,减少人为误差;...

    企业数字化转型的核心要素和能力框架构建思考.docx

    "企业数字化转型的核心要素和能力框架构建思考" 企业数字化转型是当前所有企业在数字化时代都要考虑的问题,不久的将来它会成为社会经济中的新引擎,也会逐步推动产业互联和企业商业生态的数字化转型。企业的数字化...

    如何想计算机科学家一样思考

    计算机科学家的思考方式往往注重结构化、系统化和效率,这些特质在日常生活中也能带来巨大的益处。 描述中提到,这个主题旨在帮助我们理解和应用这种思维方式,不论是否在IT领域工作,都能从中获益。这暗示了内容...

    对制造业信息化技术服务体系的思考.docx

    中介机构参与评审可能导致权力寻租问题,因此需要建立公开透明的评审制度,明确评审标准和程序,以防止不正当行为的发生,同时也有助于提高中介机构的核心竞争力。 最后,技术服务机构必须明确自身的能力边界,采取...

    汽车之家在小程序上的运营分享和思考-14页

    【汽车行业报告】:这篇报告主要聚焦于汽车之家在微信小程序上的运营策略和对未来汽车行业的洞察。汽车之家,作为中国领先的汽车互联网平台,自2005年成立以来,经历了从内容主导的垂直领域公司向基于数据和技术的...

    大数据背景下高校信息化平台的构建思考.docx

    ### 大数据背景下高校信息化平台的构建思考 #### 一、大数据的概念及其特征 随着信息技术的飞速发展,大数据已成为当今社会关注的焦点之一。大数据并非单纯指数据规模的巨大,而是指那些无法用传统数据处理手段...

    电气自动化仪表与自动化控制技术的思考.pdf

    电气自动化仪表和自动化控制技术是现代工业技术发展中的重要组成部分,它们对于提高工业生产效率、确保生产安全、改善劳动条件以及提升工业自动化水平起到了至关重要的作用。随着科技的进步,电气自动化控制系统也...

    《C语言程序设计》课程多样化教学方法探析.pdf

    《C语言程序设计》课程多样化教学方法探析的文章着重讨论了在教学实践中如何通过创新和多样化的教学方法来提高教学质量,尤其针对C语言编程这门实践性强的课程。文章由党进才撰写,来自甘肃林业职业技术学院,该文...

Global site tag (gtag.js) - Google Analytics