一、知识点总结:
第一章:引言
第一章是本书的引言部分,本章简单介绍了Unix的历史、Linux的开发及其各种发行版。本章还解释了 Linux的启动过程,描述了 Unix/Linux文件系统组织、文件类型和常用的Unix/Linux命令。最后,本章介绍了用户管理和维护Linux 系统需执行的一些系统管理任务。
学习目标:
1.强化编程背景知识。
2.动态数据结构的应用。包括c结构,指针,链表,和链数。
3.进程概念和进程管理。
4.并发编程。
5.定时器和定时功能。
6.文件系统。
7.信号、信号处理和进程间通信。
8.Tcp/ip和网络编程。Tcp/ip协议、套接字api、Udp和tcp套接字编程。
关于Unix:
Unix ( Thompson和Ritchie 1974, 1978 )是一种通用操作系统。经过人们的不断更新形成了如下几类版本:
1.AT&T Unix
2.Berkeley Unix
3.HP Unix
4.IBM Unix
5.Sun Unix
可以看出大多数Unix系统都是专有的,并且与特定的硬件平台相关联普通人可能无法访问。
关于Linux:
Linux ( Linux 2017)是一个类Unix系统,不久之后,Linux实现了访问互联网的 TCP/IP协议族,并移植了支持GUI的XII (X-window),成为一个完幣的操作系统。 课本上有如下版本:
1.Debian Linux
2.Ubuntu Linux
3.Linux Mint
4.基于RPM的Linux
5.Slackware Linux
Linux硬件平台:
1.VirtualBox
2.VMware
3.双启动的Slackware和Ubuntu Linux
其中我下载了VMware,并安装了Ubuntu Linux,步骤如下:
- 在 Windows 10 上安装 VMware Player。
- 将Ubuntu 15.10安装到VMware虚拟机上:
(1 )下载"Ubuntu 15.10 install DVD"映像;将其刻录成DVD光盘, (2 )下载适用于 Windows 10 的 VMware Workstation Player 12 exe 文件。 (3 )安装 VMware Player。 (4 )启动 VMware Playero (5 )在Ubuntu Linux下运行C程序。 使用Linux Unix/Linux文件系统组织
Ubuntu Linux系统管理:(1)用户账户:当用户使用登录名和密码登录后,登录进程将通过获取用户的gid和uid来转换成用户进程,并将目录更改为用户的homeDir,然后执行列出的initialProgram,该程序通常为命令解释程序sh。(2)sudo命令:在Ubuntu里,sudo(“超级用户执行”)允许用户以另一个用户(通常是超级用户)的身份执行命令,为确保用户能够发出sudo,只需在sudoers文件中添加一行:username ALL(ALL) ALL。
第二章:编程背景
第二章主要讲述了系统编程所需的背景信息:介绍了基于GUI的文本编辑器,展示了如何在命令和GUI模式下使用EMACS编辑器来编辑、编译和执行C语言程序,并且向我们阐述了程序开发的步骤,详细阐释了函数调用惯例和运行时堆栈的使用,展示了C语言程序与汇编代码的链接,学会运用GUNmake工具编写makefile,提及了如何使用GDB调试工具调试C语言程序,并防止出现调试过程中出现的常见错误。
1.Linux中的文本编辑器
Vim有三种操作模式:-命令模式:用于输入命令。插入模式:用于输入和编辑文本;-末行模式:用于保存文件并退出。
gedit:是GNOME桌面环境默认的文本编辑器。
emacs:是一款强大的文本编辑器。
**2.程序开发 **步骤如下:
(1)创建源文件:使用文本编辑器(如gedit或emacs)创建一个或多个程序源文件
(2)用gcc把源文件转换成二进制可执行文件:
(3).完成gcc三大步骤:1.将C源文件转换为汇编代码文件;2.把汇编代码转换成目标代码;3.执行链接器:将.o文件的所有代码段组合成单一代码段,再将所有数据段组合成单一数据段,最后将所有BSS段组合成单一bss段。
3.静态与动态链接
创建二进制可执行文件的方式有两种,分别是静态链接和动态链。在使用静态库的静态链接中链接器将所有必要的库函数代码和数据存入到a.out文件中。在使用共享库的动态链接中,库函数未包含在a.out文件中,但是对此类函数的调用以指令形式记录在a.out文件中。
4.可执行文件格式
1.二进制可执行平面文件
2.a.out可执行文件
3.ELF可执行文件
5.a.out文件的内容
1.文件头
2.代码段
3.数据段
4.符号表
6.程序执行过程
1.读取a.out文件,一标记字符串作为命令行参数
2.sh从总大小中分配一个内存区给执行映像
3.sh放弃旧映像,开始执行新映像
4.执行从crt0.o开始,调用main,将argc和argv作为采纳数传递给main
7.程序终止
1.正常终止
2.异常终止
**8.C语言中的函数调用 **
给我留下较深印象的是32位GCC中的运行时堆栈使用情况,思考方式和上学期学习的计组中的MIPS有些相似之处。
介绍了Long jump的用法与功能,相当于可以跳过一个函数的感觉
64位GCC中的运行时堆栈使用情况,拓展了多种寄存器
**9.C语言程序与汇编代码的链接 **
GCC生成的汇编代码由三部分组成: (1 )入口代虹又叫作prolog,它建立栈帧,在堆栈上分配局部变量和工作空间。 (2)函数体代码:在AX寄存器中执行带有返回值的函数任务。 (3 )幾出代电又叫作epilog,它释放堆栈空间并返回到调用者。
10.链接库
静态链接库 动态链接库,目前还只能做一个简单的区分,前者相对笨重,后者较为灵活,且创建和使用方式各不相同。
**11.makefile ** make是一 个程序.它按顺序读取makefile或Makefile,以自动有选择地执行编译链接。一个强大的简化工作量的工具。
12.GDB调试工具 是一个交互式调试工具,可以调 试用C、C ++和其他几种语言编写的程序。
13.C语言的相关知识
- C语言中的常见错误
- C语言结构体、类型转换、链表、树
以上内容和数据结构内容重合度较大,很好的回忆了相关知识。
二、遇到的问题
在第一章我遇到的问题是无法成功运行大一时下载的virtualbox,更不要说尝试使用Linux系统了,不过按照课本中的提示,我发现VMware好像更好用一些,所以我在CSDN中找到了相关的安装步骤,下载了VMware,并安装了ubuntu,并成功运行
在第二章中,我虽然知道long jump的作用,却很难理解它的工作原理和用法,后来通过CSDN中的这篇文章我逐渐理解了部分内容https://blog.csdn.net/qinh1985/article/details/4351018?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166229986716782427452175%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166229986716782427452175&biz_id=0&spm=1018.2226.3001.4187虽然其中是以C语言为基础,但也能够帮助我体会其中内容。
三、实践内容与截图:
实践内容是在Linux中使用vim进行C语言编程编程内容如下,是一个简单的for循环累加。
结果为下面图片