程序的运行过程,处理器根据 PC 寄存器中的地址,从内存中不断取指令、翻译指令和执行指令的过程。内存 RAM 的优点是支持随机读写,因此可以支持 CPU 随机读取指令;内存的缺陷是 RAM 属于易失性存储器,一旦断电,内存中原先保存的数据都会消失。现代计算机的存储系统一般采用 ROM+RAM 的组合形式,但 ROM 不支持随机存取,因此程序运行时,会首先将指令和数据从 ROM 加载到 RAM,然后 CPU 到 RAM 中取指令就可以了。
程序安装的本质
软件安装的过程起始就是将一个可执行文件安装到 ROM 的过程。下载的软件安装包里包含了可以在计算机上运行的可执行文件,游戏开发者为了方便用户使用,将可执行文件、程序运行时需要的动态共享库、安装使用文档等打包压缩,生成可运行的自解压安装包格式。
使用安装包安装软件就是将包中的可执行文件解压出来,然后将可执行文件和动态共享库复制到指定的安装目录,并把这些安装信息告诉操作系统。当用户要运行这个软件时,操作系统就会从安装目录找到这个可执行文件,把它加载到内存执行。
在 Linux 环境下,一般将可执行文件直接复制到系统的官方路径 /bin、/sbin、/usr/bin 下,程序运行时直接从这些系统默认的路径下查找可执行文件,将其加载到内存运行。
在 Linux 下制作软件安装包
Linux 操作系统一般可分为两派:Redhat 系列和 Debian 系列。Readhat 系列使用 RPM 包管理机制,而 Debian 系列,像是 Debian、Ubuntu 等操作系统则使用 deb 包管理机制。
在 Linux 环境下安装软件起始就是将可执行文件复制到环境变量 PATH 对应的官方路径下面,常用的路径有:/bin、/sbin、/usr/bin、/usr/local/bin 等。当我们在 shell 终端输入命令时,Shell 就会到这些默认路径下去找与该命令相对应的二进制文件,并加载到内存执行。一个成熟的发布软件里,除了可执行文件,一般还会有配套的文档说明、图标等,程序开发者将这些文档一起打包发布,提供自动安装的功能,更方便用户下载和安装。在制作 deb 包时,除了可执行文件,还需要一些控制信息来描述这个安装包,如软件的版本、作者、安装包要安装的路径等,这些控制信息放在一个叫做 control 的文件里。
1. 编写程序软件
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
编译并运行:
jiaming@jiaming-pc:~/Documents/CSDN_Project$ gcc -o helloWorld helloWorld.c
jiaming@jiaming-pc:~/Documents/CSDN_Project$ ./helloWorld
hello world!
可执行文件 helloworld 生成后,为它制作一个软件安装包。
2. 制作软件包
- 创建 helloworld 同名目录,并创建如下文件。
jiaming@jiaming-pc:~/Documents/CSDN_Project/helloworld$ tree .
.
├── DEBIAN
│ └── control
└── usr
└── local
└── bin
└── helloWorld
control 文件用来记录 helloworld 安装包的安装信息,可以通过编辑这个文件来配置相关安装信息。
package:helloworld
version:1.0
architecture:i386
maintainer:wit
description: deb package demo
usr/local/bin/
表示 deb 包的默认安装路径,使用 dpkg
命令制作安装包。
jiaming@jiaming-pc:~/Documents/CSDN_Project$ dpkg -b helloworld/ helloworld_1.0_i386.deb
dpkg-deb: building package 'helloworld' in 'helloworld_1.0_i386.deb'.
命令将会在 helloworld 目录下生成 helloworld_1.0_i386.deb
安装包。
3. 安装软件包
jiaming@jiaming-pc:~/Documents/CSDN_Project$ dpkg -i helloworld_1.0_i386.deb
dpkg: error: requested operation requires superuser privilege
jiaming@jiaming-pc:~/Documents/CSDN_Project$ sudo dpkg -i helloworld_1.0_i386.deb
[sudo] password for jiaming:
Selecting previously unselected package helloworld:i386.
(Reading database ... 318753 files and directories currently installed.)
Preparing to unpack helloworld_1.0_i386.deb ...
Unpacking helloworld:i386 (1.0) ...
Setting up helloworld:i386 (1.0) ...
jiaming@jiaming-pc:~/Documents/CSDN_Project$ helloWorld
hello world!
安装成功后,在系统的 /usr/local/bin
下就会看到安装成功的 helloworld 可执行文件,并且在 shell 终端的任何目录下均能够直接运行。
jiaming@jiaming-pc:~/Documents/CSDN_Project$ ls /usr/local/bin/hello*
/usr/local/bin/helloWorld
卸载 helloworld 应用程序:
jiaming@jiaming-pc:~/Documents/CSDN_Project$ sudo dpkg -P helloworld
(Reading database ... 318755 files and directories currently installed.)
Removing helloworld:i386 (1.0) ...
dpkg: warning: while removing helloworld:i386, directory '/usr/local/bin' not empty so not removed
使用 apt-get 在线安装软件
在 Linux 下安装软件,最简单的方法是从网上下载这个二进制文件,然后放到 Linux 的默认路径 PATH 下就可以了。
有些程序是采用动态链接编译的,运行时需要依赖一些动态库共享库,因此需要打包一起安装。我们下载的软件一般很少是一个单纯的二进制文件,而是压缩包的形式,在这个压缩包里面,有二进制程序文件、动态链接库、软件文档说明、安装信息等,甚至有一些自动安装的脚本。在 Debian 和 Ubuntu 环境下,软件压缩包一般为 deb 格式。我们安装软件时,要先从网上下载对应的 deb 包,然后使用 dpkg 工具去解析和安装这个包,当然也可以将自己的二进制文件制作成一个 deb 包。
当用户使用 apt-get install 安装软件时,apt-get 工具就会根据这个 source.list 文件中的服务器地址去下载对应的软件包,一般 ubuntu 默认的软件源是 ubuntu 官方服务器。