cpu眼中的编程(转自阿布)封装,继承,多态。寄存器与内存间的数据读写关系

您所在的位置:网站首页 编码自同步能力 cpu眼中的编程(转自阿布)封装,继承,多态。寄存器与内存间的数据读写关系

cpu眼中的编程(转自阿布)封装,继承,多态。寄存器与内存间的数据读写关系

2023-03-23 18:28| 来源: 网络整理| 查看: 265

node和vue←js←C语言←内存(虚拟内存映射到物理内存(←汇编语言(cpu指令)←寄存器给空间编码。

cpu→寄存器→页表→内存。

同步:线程间的协调。

​new是审请内存(是个接口)。内存中放对象。

​指针就是个特殊变量(非普通变量,不需要定义数据类刑),用于存级函数或变量的内存首地址。

​寄存器中存放所有运行过程中的数据。

​内存中只存产生可用结果的数据。

​堆在内存中,存数据。

​栈在寄存器中,存数据地扯。

​{}是寄存器中栈帧的约定。

​内核调动线程。线程主要处理寄存器。

​传值,传指针都是把参数传给寄存器。给寄存器赋值。

​return函数执行完毕后,将栈顶处的返回值(下一条指令的地址)传给cpu中的寄存器,产生地扯。供cpu主调函数main继续执行。(函数间的衍接)即栈区下一函数交给CPU处理。

cpu在栈内​就地存放返回值地址。

cpu执行​call指令:1把下一条指令的地址,也就是函数的返回地址压入堆栈。2cpu跳到函数在栈区的首地址。至此函数的执行过程。

​cpu只能通过寄存器访问内存。rip是寄存器中下一条指令地址。

​变量:1内存地址的别名,变量的类型决定它占内存的长度。

cpu真正能看懂的是汇编指令(由编译器将源代码处理得到),字节码不需要Cpu看懂。

​mine函数是一应用程序被CPU执行的起点。

​构造函数与普通函数相比多了虚拟内存,

​多态:基类可以被调用(调用虚函数)生成派生类。类型转换。调用相同名称的函数,却会根椐对像的实际类型执行不同的函数版本。即类B不仅可以复用类A的功能,还可以扩展自己的功能。1常会用基类指针指向派生类对象。2多态会利用派生类的结构特点复用基类(变量或函数)属性。3

​多态会利用虚函数来扩展派生类的特性。

​多态是对基本类的各种调用。

​动态绑定:通过rdx寄存器地址的值绑定。

​调用普通函数通过call静志绑定。

​调用虚函数通过call动态绑定。

1​构造函数和普通函数一样,都会夹带一个参数(this指针)。

2​派生类的构造函数会夹带一个基类的构造函数。

​3如果存在虚函数,构造函数会记录虚函数表的地址,并保存在对象实例a,b当中,随身携带,随用随取。

​动态获取寄存器地址是实现多态的基础。

​常量在虚拟内存mmu映射表中是只读的。

​变量在虚拟内存mmu中是可读可写的。

编译器通过检查来发现数据的错误,​通过指针或数据类型(读,写)的转换使数据逃过编译器的检查。

​虚拟地址→页表(进程有,线程无)→内存物理地址。

​mmu是cpu的内存管理单元。有mmu的是进程(有独立内存空间),无mmu的是线程(无独立内存空间)。

进程(空间与封装,作用域类似)是内存中的某个隔离空间。空间由mmu进行隔离。

​进程中的多线程是把多个线程放在同一个进程中,让它们在同一空间中。

​系统调用:通过函数召唤操作系统穿透计算机物理层,操作系统层,驱动层和应用层。系统调用表是操作系统组合好的。

​得到某个私有变量的内存地址,就可以通过指针操作不受限制的读写这些变量,禁止访问等的私有属性都会被忽视,违规,不受控制的指针(地址)操作通过获得的地址可以进行任何操作。rip寄存器值等于main的首地址。

​虚拟内存从不往上:main函数,全局变量,堆,堆栈。

​基于物理内存和mmu协处理器(虚拟内存控制系统)给我们构建一个巨大的虚拟内存,虚拟闪存会被mmu映射到物理地址上。

文件从硬盘加载到虚拟内存,形成代码段main,数据段全局变量,堆,栈。程序加载就完成了。运行时操作程序会为程序建立运行结构,进程的数据结构建立起来,决定程序运行的是线程的上下文(cpu的寄存器状态),让rip寄存器的值等于main的首地扯,一担呆作程序进行任务调度,让我们的进程得以运行,rip寄存器就会引导cpu去运行main函数,至此代码的编译,加载,运行全部完成。

1程序的源代码被编译以后,会根椐源代码的意义,分析出代码,数据等信息存放在可执行文件中,如果不加可调试信息,函数和变量的名称是不需要存储的。

2当计算机进行加载程序时,会把代码,数据从可执行文件拷贝到不同的内存区域里面,同时也会分配堆和堆栈的内存区域,但在程序运行前堆和堆栈里的内容是不确的。

3堆和堆栈之间有巨大的内存空白,这让堆和堆栈有了充分的生长空间,虽然看上去很浪费,但实际上那只是虚拟内存视角上的空白,只有在真正读取这段空白时,操作系统才会将它映射到具体的物理内存,而且是用多少才映射多少。

​操作系统(卧龙)mmu(凤皱)。

​cpu指令就是汇编(给地扯在堆栈中编空间位置)语言。

​寄存器rax存放数值(普通受量)。

rbp,rxp一般存放数据地址(指针变量)。

​普通变量与特殊变量的区别在于指针(地址),特殊变量通过指针(传扯)来修改数据值。

​cpu的内存读写占据了cpu工作的90%。

​指针:寄存器间接存打。是c语言和汇编语言的灵魂。

​线程切换(内存物理2端)是操作系统的核心,是软件与cpu硬件的完美结合。cpu在内存的内核代码(内存的物理中间段)中进行上下文(线程)切换。

时钟中断控制cpu跳转到内核代码。

​汇编语言就是在写寄存器代码。

this是每一个成员函数必备的默认参数,只是C语言将其隐藏了而已。

文本编辑器,就是你能在里面打字并显示出来的那个组件。你写的“代码”是本身没有任何意义的“字符串”,你敲完键盘,把对应的字母输入到文本编辑器,然后显示到屏幕上,能让计算机和你知道:你写了一些东西。

编译器,就是把你写的“代码”(高级语言),翻译成稍低一级的汇编语言代码。汇编语言是更低级一点的,但是更方便计算机进行一些巧妙操作(比如链接等)的东西。编译器最早是用汇编语言写出来的,之后通过很多次迭代用高级语言重写了。

汇编器,把汇编代码翻译成更低级别的机器代码,也就是二进制的01010101,这些是计算机能直接执行的指令集,与操作系统、cpu的架构有关(嵌入式开发的另说)。这一部分是最底层的代码,cpu能够直接执行并给出输出、控制。

当然还有一些其它的工具,比如调试工具、版本管理啥的。

可以认为指针是一种:访问各种数据结构的“快捷方式”;普通变量、类、数据、堆、栈,往往都可以根据变量名称来访问,需要遵守一定的访问规则;指针则完全不理会规则,不讲武德,不管你是否允许;只要知道你家的地址,就直接敲你家的门,甚至破窗而入。但从另外一个方面,也说明了指针有很强的灵活性,这是很多常规数据结构不具备的优势,当然,如果滥用,其后果也不堪设想。除了灵活性,它还能实现对内存的精确控制,也恰恰是常规数据结构所不具备的,而JAVA/Python/C#基本上已经彻底放弃了对内存精确访问的企图,当你定义某一个变量、对象的时候,程序员已经不再去思考它们的内存地址了。如果想访问一个CPU寄存器,除了使用指针,还有其他选择吗?

​指针就是汇编编程(处理寄存器)的简化版。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3