程序是怎样跑起来的

简介

程序是怎么跑起来的

隐藏的细节:编译与链接
总结:编译后标注程序中需要引用的外部接口信息以及位置,扫描外部代码库,然后根据重定位表链接生成可执行文件。
在这里插入图片描述

main.o的Section Header,里边有程序代码和程序的数据。
程序编译后,得到main.o文件,这个目标文件是一条条机器代码(类似于指令)。未链接时,里边涉及的所有函数地址入口都将设置为0(假设所有的函数——除了main——都没在main.c中实现)。
重定位表记录了函数在main.o文件中顺序(offset,视频中用地置而非地址,很严谨)、函数类型(type)和函数的名字信息(即value)。

【底层】动态链接库(dll,so)是如何工作的?
dll是windows下的动态库文件扩展名,so是linux下的动态库文件扩展名
动态链接库为程序运行时链接的程序文件,动态库为共享库,静态库非共享会在运行前嵌入程序中导致体积过大。
Win知识 - 程序是怎样跑起来的(合集)
高级编程语言的机制就是,使用独自的函数名,然后再在编译时将其转换成相应操作系统的系统调用(也有可能是多个系统调用的组合)。也就是说,用高级编程语言编写的应用在编译后,就转换成了利用系统调用的本地代码
在这里插入图片描述

在这里插入图片描述
系统各API就是应用程序调用的函数。这些函数的实体被存储在操作系统的DLL文件中。
程序编译后若想运行都是需要链接操作系统的动态dll文件才可以调用其API。
在这里插入图片描述
在这里插入图片描述

在高级编程语言中,也存在可以直接调用系统调用的编程语言。不过,利用这种方式做成的应用,移植性①并不友好(也俗称为有恶意行为的应用)。例如,直接调用Windows系统调用的应用,在Linux上显然是无法运行的。

一、CPU

CPU是寄存器的集合体,包括累加、标志、程序计数器(决定程序流程)、基址、变址、通用、指令和栈寄存器。

二、数据

一听就能懂字符集、ASCII、GBK、Unicode、UTF-8、字符编码、解码、乱码问题的讲解

数据用二进制表示是因为IC(集成电路)只有2个状态。计算机处理数据基本单位是一个字节,即8位,处理的数据都是8的倍数;反码补码都是为了方便计算机处理的数据形式;算数右移和逻辑右移是不同的右移方法,逻辑计算是计算机的基础;

三、小数运算

和十进制10除于3除不尽一样,二进制按照人类现有的设计表示方法也有无法表示的小数。为了得到正确的运算结果,可以采用*倍数后化作整数去运算的方法。

四、内存

内存的逻辑模型就是楼房,占有的楼层数就是占用的内存的大小,例如声明变量是整型就是4个字节。利用内存有几种形式,数组、栈、队列、链表、二叉树。

五、磁盘

程序需要读入内存才能运行,磁盘是存储的一种便宜介质,还可以当作虚拟内存,在一定程度上协助程序运行。

六、压缩数据

压缩算法就是数据的另一种表示方式,通过各种压缩算法简单存储后,可以再次运算还原的方法。其中哈夫曼算法是通过统计频率来设计的算法,能比较大的压缩。因为图片损失一点质量没有太大的影响,所以除了有bmp无损格式,还有jpeg,tiff,gif等格式或多或少采用一定技法去压缩过的图片格式。

七、运行环境

程序的运行环境=操作系统+硬件。windows克服了除了cpu以外的硬件差异,是把大部分程序都要做的和硬件交互的事情都处理好了,提供了api接口给所有其他的应用程序调用。因为不同操作系统提供的api不同,jvm会自己带一套虚拟系统来兼容不同操作系统。操作系统通过bios中的引导程序开启,bios包含键盘、磁盘、显卡等基本控制程序。

八、可执行文件

计算机只能运行本地代码,本地代码是数值的罗列。可以通过编译器吧高级语言的源代码转化成本地代码,编译以后还要进行链接生出可执行文件,如.exe文件才能运行。将一些大家都会调用的函数等写成通用的即dll文件,可以方便大家统一调用。

  • 了解后缀名,可以初步判断该文件是否是病毒,可以多留一份心眼。这个作用可能很多人不知道,一般来说,病毒都是可执行文件,也就是以.exe为后缀名的,如果别人给你一个未知的软件,并且后缀名是exe的,那么你就要小心了,这个没准就是病毒,不了解的情况下千万不要点击运行。
  • 了解文件后缀名,可以隐藏自己的文件,达到文件加密的效果。操作很简单,比如你有一个excel表格,想要加密,这时你只要把文件的后缀名".xls"改成其他的后缀名,如zip,rar等,这样别人双击打开你的文件,系统会自动使用解压工具打开,这时文件打开了也是看不到真实数据的,因为它根本就不是zip或rar格式的文件(注:这一招不推荐使用,因为改了后缀名导致系统使用默认软件打开文件之后,容易把文件损坏,当你把后缀名改回去的时候,源文件可能就被顺坏而打不开了)。

九、外围设备

外围设备如键盘、鼠标、打印机等采用中断请求的方式来实现实时处理。图片显示是往主存的一部分空间写入数据来显示,现在是有独立显卡来处理。

总结

基于不同操作系统会有不同的JVM类型,linux版和windows版。
总结:从沙子到纯硅到晶圆到光蚀到芯片到cpu,把一堆ic堆在一起形成可以计算的硬件;再想出方法把现实世界的数据和这些硬件联系起来表示出来,找到最简单的方法就是二进制数,然后需要通过各种编码和规范把字母、文字、小数都能表示出来。这时候除了快速运算的cpu还需要东西存储,就分为了速度快的内存和速度慢的磁盘。因为很多时候数据的表示有很多事重复的东西,在传输或者保存等情况下需要体积小,所以可以通过算法算出另一种表示方法去记录。这种算法分成可逆和不可逆的算法,不可逆如jpeg等图片格式。有了这一切以后,大家都可以写程序去计算数据了。但因为有很多非常底层的东西既非常深奥又经常被大家重复使用,于是就把这部分抽象化做出了操作系统。有了系统以后还有很多.dll文件事后面丰富的一些通用的处理函数。但因为操作系统也可以写出很多,也有些高级编程语言为了兼容不同操作系统,自己再抽象一层,对每个操作系统又封装了自己的一套方式,例如jvm,只要各系统都装上它,程序就可以开发一次,到处使用。这些都完善之后,计算机的运算基本完善,但是还缺少控制输入和输出的方式,于是对于外围设备采用了中断请求的方式去做交互,只要你来找我,我才去理你,而不是时刻都在关心你在干什么。然后外围设备有很多,类型也有很多,于是给每个厂家都给了一套统一的操作系统要求的规范。不过你自己怎么设计和运行你的硬件,反正同样的硬件和功能要按照我的规范可以使用,或者你给我一个翻译包,我就知道使用你,这就是驱动程序。完。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值