《Unix/Linux系统编程》第1,2章学习笔记 20191329马静怡
第1章 引言
本书是一部研究Unix/Linux系统编程的专著,其中涵盖Unix/Linux的所有基本组件,包括进程管理、并发进程、定时器和时钟服务、文件系统、网络编程和MySQL数据库系统。本书的目标有:强化学生的编程背景知识、动态数据结构的应用、进程概念和进程管理、并发编程、定时器和定时功能、信号信号处理和进程间通信、文件系统、TCP/IP和网络编程。此外,还简单介绍了Unix的历史和Linux的开发及各种发行版,列出了适合于Linux的各种硬件平台和虚拟机,并展示了如何将Ubuntu Linux同时安装到Microsoft Windows中的VB和VMware虚拟机上。本章还结识了Linux的启动过程,描述了Unix/Linux文件系统组织、文件类型和常用命令,还介绍了用户管理和维护Linux系统需执行的一些系统管理任务。
一、虚拟机上的Linux
VirtualBox
- 下载VirtualBox
- 安装VirtualBox
- 创建VirtualBox虚拟机
- 将Ubuntu安装到VirtualBox VM上
- 调整屏幕分辨率
- 在Ubuntu下测试C语言编程
VMware
- 在Windows10上安装VMware Player
- 将Ubuntu安装到VMware虚拟机上
二、使用Linux
- Linux内核映像
Linux内核映像位于/boot目录中,一个可启动的Linux内核映像由三部分组成:
|BOOT|SETUP|linux kernel|
BOOT是一个512字节的启动程序,但现在不再用于Linux启动,而是包含一些参数。SETUP是一段16位和32位的汇编代码,用于在启动期间将16位模式转换为32位保护模式。 - Linux启动程序
最受欢迎的有GRUB和LILO。 - Linux启动
1.加载BOOT+SETUP至实模式内存的0x90000处
2.加载Linux内核至高端内存的1MB处 - Linux运行级别
Linux内核以单用户模式启动,以多用户模式运行。 - 登录进程
- 命令执行
三、Unix/Linux命令
更多的命令可以在W3Cschool中查看:https://www.w3cschool.cn/unix/unix-useful-commands.html
第二章 编程背景
一、Linux中的文本编辑器及使用
- vim
- gedit
- emacs
二、程序开发
- 程序开发步骤
(1)创建源文件:使用文本编辑器创建一个或多个程序源文件。
(2)用gcc把源文件转换成二进制可执行文件。
问题:GCC的编译过程是怎样的?
gcc命令其实依次执行了四步操作:
1.预处理(Preprocessing)
以“#”号开头的预处理指令如包含#include,宏定义制定#define等。在源程序中这些指令都放在函数之外,而且一般放在源文件的前面。经过预处理之后代码体积会大很多,相当于可执行文件一倍大小。预处理之后的程序还是文本,可以用文本编辑器打开。
2.编译(Compilation)
这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理文件之后的程序转换成特定汇编代码的过程。
3.汇编(Assemble)
汇编过程将上一步的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式。
4.链接(Linking)。
链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。附加的目标文件包括静态连接库和动态连接库。
- 静态与动态链接
使用静态库的静态链接中,链接器将所有必要的库函数代码和数据纳入a.out文件中,这使得它完整且独立,但通常非常大。动态链接使用动态链接库(DLL),也被称为共享库(.so文件),优点是减小a.out文件的大小、许多执行程序可在内存中共享相同的库函数、修改库函数不需要重新编译源文件。 - 可执行文件格式
(1)二进制可执行平面文件
(2)a.out可执行文件
(3)ELF可执行文件 - 程序执行过程
(1)读取a.out文件头,以确定所需的总内存大小。
(2)sh从总大小中分配一个内存区给执行映像。
(3)sh放弃放弃旧映像,开始执行新映像。
(4)执行从crt0.o开始,调用main()。 - 程序终止
(1)正常终止
(2)异常终止
三、C语言的函数调用
- 32位GCC中的运行时堆栈使用情况
- long jump
- 64位GCC中的运行时堆栈使用情况
四、C语言程序与汇编代码的链接
- 用汇编代码编程
1.将C代码编译成汇编代码
2.汇编代码说明 - 用汇编语言实现函数
- 从汇编中调用C函数
五、链接库
- 静态链接库
链接库中包含预编译的目标代码 - 动态链接库
六、makefile
make是一号程序,它按顺序读取Makefile或makefile,以自动有选择地执行编译链接。一个make文件由一系列目标项、依赖项和规则组成。当make程序读取makefile时,它通过比较依赖项列表中源文件的时间戳来确定要构建哪些目标项。
七、GDB调试工具
GDB调试工具是一个交互式调试工具,可以调试用C、C++和其他几种语言编写的程序。GDB是一个功能强大的调试工具,使用非常简单,但应该注意,所有调试工具只能提供有限的帮助,在某些情况下用处不大,所以程序开发的最佳方法是仔细设计程序的算法,然后根据算法编写程序代码。
八、C语言结构体
- 结构体和指针
- 类型转换
- 链表
- 树和二叉树
以上内容可以在C语言程序设计和数据结构课本中找到详细讲解。