32位dll注入到64位程序_你用的32位还是64位?有什么区别呢?
粉丝福利:小编会从今天留言中抽选3名小伙伴赠送现金红包,感谢大家一直以来的支持!文末见喽!通过前面两篇文章的学习,外甥对电脑的产生了各种好奇,差点把自己电脑拆开来研究研究了我觉得这种学习精神挺好的,假使她真的把电脑拆坏了,也是赞同的,毕竟这种学习的经历是在的就在前几天外甥和我抱怨说只要应用打开的比较多或者网页打开比较多,电脑运行超级慢,卡顿半天我就反手问了一句,你知道为什么么?她故作无知冷冷的来了一句 不知道我细细的讲起卡顿有几方面的原因:
- 打开的app或者网页需要计算的数据量太大,计算机算力不足,此时计算机算力全部被征用了,无法在操作其他
- 打开的app内存需求量大,打开app多或者单个app内存需求较大,会导致内存被占满,此时会发生磁盘和内存的交换,磁盘速度很慢
- app需要读取大量磁盘数据,磁盘读写速度远远低于内存和CPU
- 网络卡顿,app有网路交互情况,网路非常慢,app会经历超时和重试
巴拉巴拉说了一通,她估计实在忍不住了,打断说我看了任务管理器,卡顿时内存爆满 100%状态,然后就加装了内存条,诡异的是情况并没有好转,让我非常不解。
我听到这里,就已经知道病症在那里了,32bit和64bit的问题,今天就给大家讲讲这个病症
32bit和64bit指的是什么?
记得校招面试那会儿,经常被面试官问到,你知道32位和64位的区别是什么么?那时候我脱口而出 寻址能力不一样现在看来,这个回答含糊不清、对也不对首先,我们应该问清楚 32位和64位指的是软件呢?还是CPU呢?就像上面外甥的描述,她加装了一个4G内存条,她的本原生有4G内存 共计8G内存,为何原来的内存问题还是复现呢?这里有两个可能的原因:
- 她的操作系统软件是32位,但是CPU是64位的,这样一来的话,即使加装了内存也无法使用。
虽然你有能力了,但是被限制了发挥空间,也就废物一个了,此时她装一个64位的操作系统即可发挥8G内存的威力了。
- 32位的CPU,这样一来的话,内存加装到8G了,也无济于事,寻址能力跟不上。
上面两种情况,第一种是有能力,但被限制了,只要放开我,就还你一片天地;第二种是无能为力所以当在聊32位和64位的问题时,要优先搞清楚说的是什么?从上面的内容很容易看出来,所指对象不同,结果完全不同的,不可一概而论
32bit和64bit的区别
明白了32位和64位指代对象,现在来谈谈二者的区别,谈之前先温习下前面说的冯诺依曼结构
结构五件套就不说了,前面有文章专门介绍了 计算机如何组成的?
输入设备
输出设备
存储器
中央处理器
控制器
说说五件套之间如何有效通信的CPU 和内存以及其他设备之间,需要通信,因此我们用一种特殊的设备进行控制,就是总线。总线分成 3 种:
- 地址总线,专门用来指定 CPU 将要操作的内存地址
- 数据总线,用来读写内存中的数据
- 控制总线,用来发送和接收关键信号,比如中断信号,还有设备复位、就绪等信号,都是通过控制总线传输。CPU 需要对这些信号进行响应,这也需要控制总线。
当然,这和我们要说的32位和64位有什么关系呢?
32位和64位软件的区别
32位软件和64位软件的区别就是,指针的大小不同,也就是地址范围不同估计一脸黑人问号,现在高级语言都不在使用指针这个概念了,龙叔还在说 指针 是不是不合时宜了是的,高级语言除了C++还在谈指针,其他的语言如java、Python、go都已经不谈指针了语言设计者不谈是为了给开发者减负,并不意味着就是没有了指针非常核心,因为我们 访问内存数据必须依赖地址,指针就是地址拉回来了,继续说32位软件和64位软件问题软件设计者在设计软件时是32位的,意味着程序里面使用的指针都是4byte的,也就意味着最大能寻到的地址2^32次方,也就是4G。所以当我们操作系统是32位时,最大只能访问到4G内存,不管我们加多大的内存条 都是无意义的声明一下 操作系统也是一种软件 ,不过是一种系统软件用户软件是依赖操作系统的寻址操作的,如果操作系统是32位,该操作系统下无法运行64位的用户软件我们都知道,数据传递是通过高低电压控制的,高电平是1 低电平是0龙叔在大学学习数字电路时经常搞这种操作,动不动就是用电路连接一个加法器
经常做实验就是搞几个芯片 通过电路去控制做一个加法器或者去在显示器上按照规则亮灭相应的二极管说实话,大一让我搞这些 还是比较头疼的,动不动几个小时还没搞个所以然,现在看来不过尔尔所以现在每当遇到困难时,我都假设自己处在未来某个时间点 来看当下的问题 最终就是不过尔尔其实本质就是使用电平的高低变化去传输数据,一个高电平表示 1 低电平表示 0假设我们只有一条地址线,一次传输只能是一个电平0或1,那你要传输一个数字10(二进制)就必须传输两次这种只有一条地址总线进行数据传输的方式称为串行传输假设我们有两条地址总线,一次就能传输两个电平,数字10就只需要传输一次就好这种用多条地址总线,一次传输多个信号的方式就是并行传输当 CPU 需要读写内存的时候,先要通过地址总线来指定内存地址,再通过数据总线来传输数据所以我们地址总线的根数决定寻址的能力,当我们有32根地址总线时我们的寻址能力就是2^32=4G
32位CPU和64位CPU的区别
举个例子:用一个32位的CPU求和两个64位的数字通常 32 位宽 CPU 最多操作 32 位宽的地址总线和数据总线64 位宽 CPU 最多操作 64 位宽的地址总线和数据总线这就存在一个问题,64位数字无法进行一次性传输到32位上让CPU进行计算由上面的传输原则可知 必须把64位数字拆分为两个32数字进行传输通过这个例子可以很明白的看到,32位的CPU和64位的CPU在控制总线上的能力不同32位CPU和64位CPU的区别之一就是,CPU 的位宽决定能控制的总线根数,而总线的根数决定寻址能力32位最大控制的总线为32根,最大寻址能力是4G,一次能传输最大字节数是4byte64位最大控制的总线为64根,最大寻址能力是256TB,一次能传输的最大字节数是8byte还可以看到的是,32位的CPU计算能力也是只能计算32位的数据,无法对64位的数据进行运算这点可能不是很好理解,32位CPU一次读入只能读取32bit的数据,同时32位的CPU只有32位的寄存器64位具有向下兼容特性,64位可以跑32位的软件,可以进行32位的计算说到这里,再回想面试官问的问题,以及外甥女的不解 犹如明镜一般清澈无比
64的优势是什么?
接下来说说64位的优势到底是个啥我们的CPU执行程序的步骤是:
- CPU读取PC指针指向的指令,简称取指(fetch)
- CPU 分析指令寄存器中的指令,确定指令的类型和参数,简称 解码(decode)
- 如果是计算类型的指令,那么就交给逻辑运算单元计算;如果是存储类型的指令,那么由控制单元执行 ,简称执行(execute)
- 将执行结果进行返回给寄存器或者将寄存器数据存入内存,简称 存储(store)
- PC 指针自增,并准备获取下一条指令
上面步骤是一个循环也称为CPU指令周期,CPU 的工作就是一个周期接着一个周期,周而复始。
在CPU运行的周期中可以看到,有一个核心的部件 寄存器上面用到了 程序寄存器 指令寄存器,寄存器本质就是指针,指针就是地址,地址就是一串数字编码而决定这串数字编码的就是地址的大小,地址的大小由寻址能力决定,寻址能力就是总线的根数总线的根数是由CPU的位数决定的说到这里其实大家应该已经明白64位CPU的优势了,龙叔还是给个总结64 位 CPU 可以执行更大数字的运算,具体多大呢?2^64这么大这个优势在普通应用上不明显,但是对于数值计算较多的应用就非常明显64 位 CPU 可以寻址更大的内存空间如果 32 位/64 位说的是程序,那么说的是指令是 64 位还是 32 位的32 位指令在 64 位机器上执行,困难不大,可以兼容。如果是 64 位指令,在 32 位机器上执行就困难了32 位指令在 64 位机器执行的时候,需要的是一套兼容机制就OK了,但是 64 位指令在 32 位机器上执行,32 位的寄存器都存不下指令的参数。操作系统也是一种程序,如果是 64 位操作系统,也就是操作系统中程序的指令都是 64 位指令,因此不能安装在 32 位机器上。
补充内容
前面提到了寄存器,很多人对寄存器非常陌生,这里详细讲解一下
从上面的图中可以很明显的看到,图中虚线以内,寄存器是CPU内部集成的,内存是外部的当我们访问内存时需要通过寄存器去找到对应的地址,再执行相应的指令此时CPU会在数据总线上生成读取或写入内存的时钟信号,最后内存的内容会被CPU寄存器的内容更新或者读入寄存器是啥,上面已经说了,寄存器就是一个指针,里面存放着地址以上就是本期的所有内容了,我是龙叔,我们下期见最后非常需要靓仔靓女们的分享、转发、点赞,这些都是我创作的动力,感谢大家- END-
文章精选1、微软证实Win 10重大Bug,严重影响浏览器使用2、用上Win10的你,还会忍不住去点刷新吗?3、Flash将停止支持!分享一个让你能继续使用Flash的神器4、一次出人意料而名留青史的 DNS 投毒攻击5、那些常用的加密算法6、360安全浏览器从“永久免费”变“VIP收费”?官方回应了7、程序员用 M1 MacBook 当开发主力机是什么体验?8、初级程序员常犯错误一览
更多精彩等待你的发现点分享点点赞点在看
32位dll注入到64位程序_你用的32位还是64位?有什么区别呢?相关推荐
- java怎样生成32位全是整形的主键_用java生成32位全球唯一的id编号
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
- 64位ie加载java失败_java-无法在AMD 64位平台上加载IA 32位.dll
java-无法在AMD 64位平台上加载IA 32位.dll 我正在尝试通过此页面上的JNI包装器使用Java中的SVMLight: static { System.loadLibrary(" ...
- 64位进程调用32位DLL详解
64位进程调用32位DLL------探索 相关资料: 微软公司的官方网站针对这个问题描述如下: 在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一 ...
- 2020-11-24(dll注入的N种搞法)
所谓DLL注入,本来是软件用于向其他程序添加/扩展功能.调试或逆向工程的一种合法技术.不过,后来恶意软件也常用这种方式来干坏事.因此,这意味着从安全的角度来看,我们必须知道DLL注入是如何工作的. 之 ...
- 2020-11-23(Windows系统的dll注入 )
一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...
- Windows系统的dll注入
一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...
- 【外挂编程】外挂编程技术揭秘(三)DLL注入
引言: 一个礼拜没有更新这个主题文章了,这周三看到一个微信推送.某某某博士由于写外挂被抓.当时心里那是一个崩溃,不过之前写了这个主题,还是会继续写完,不能半途而废.不过了解这本技术的千万不要拿去捞偏门 ...
- 32位程序注入64位DLL到64位进程
向其他进程注入DLL通常的做法是通过调用CreateRemoteThread这个API在目标进程内创建一个远程线程,用这个线程来调用LoadLibraryA或LoadLibraryW(下文统称Load ...
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...
最新文章
- UI培训技术分享:设计大神都在用的10种技法!
- 时隔四年回归的澎湃芯片,能为雷军赌上一生荣耀的造车创业带来什么?
- 一、win7下安装yii2
- Redis windows学习(二)——Redis持久化的AOF模式和RDB模式
- 详解图像处理的算术运算与逻辑运算
- 计算机的进制数思想在哪方面有应用,计算机应用技术问答题(一)
- amqp activemq_Spring AMQP ActiveMQ教程(第1部分)
- 计算机数学ppt,数学工具 PPT版
- ICMP协议解析与实战
- 13.STC15W408AS单片机SPI
- 行政执法岗、基层岗申论必背
- 一文了解美团团节社等及分佣机制
- 微信小程序开通直播的条件
- 苹果8的爆料这么多?为什么...
- VANT3无法使用slot引用外部icont
- 仙人掌之歌——路转峰回(3)
- 蓝牙耳机录音进行讯飞语音识别
- 易基因|RNA m5C甲基化测序(RNA-BS)技术介绍
- (10.2.3.3)静电的设计教室:APP设计利器Sketch教程(03)-让插件助你一臂之力(原创
- 2D变形:平移、旋转、缩放、倾斜