20191215李业达第一、二章读书笔记

一、知识点总结:

第一章:引言

前言:

该章是本书的引言部分,讲述了Unix的历史,包括各种unix的版本,还介绍了Linux的开发及其各种发行版,列出了适用于Linux的各种硬件平台以及虚拟机,还解释了Linux的启动过程,描述了Unix/Linux文件系统组织等,最后介绍了用户管理和维护Linux系统需执行的一些系统管理任务。

学到了什么?

  1. 在1.2中提出系统编程的作用:有效利用系统资源来开发应用软件;为学生打下扎实的专业基础,以便在多个领域继续深造。

  2. 1.3中提出本书的目标,包括强化学生的编程背景知识,动态数据结构的应用等。

  3. 在1.5中提到了本书的独特之处,在众多的独特之处中我发现本书着重介绍了编程实践,提供了一系列的编程项目,来让学生练习编程,亲自上手。

  4. 第一章中的内容还是比较简单的,大体介绍了一下这本书的内容,以及我们可以需要学到的东西,让我们对这本书以及这门课有个大体的认识,为之后的学习铺好路。

  5. 书中最后提到了虚拟机上的linux,我就想到了大一时娄老师让我们安的虚拟机,还好我到现在还没有删,我便打算继续使用我大一所一直使用的virtualbox,但在我想要重新继续使用时我的virtualbox遇到了不可启动的bug,使用了好多方法废了很多时间最后才把问题解决掉,才可以继续使用继续课程的学习。

第二章 编程背景

前言:

本章主要讲述了系统编程所需的背景信息:介绍了基于GUI的文本编辑器,如vim、gedit和EMACS,尤其是vim,我们在大一用过,我觉得这个编辑器再重新上手相较来说比较容易;展示了如何在命令和GUI模式下使用EMACS编辑器来编辑、编译和执行C语言程序;阐述了程序开发的步骤;详细阐释了函数调用惯例和运行时堆栈的使用;展示了C语言程序与汇编代码的链接;讨论了GNU make工具,举例说明如何编写makefile;提到了如何使用GDB调试工具调试C语言程序;提到了高级编程技术,以及C语言中的结构和指针,从单根目录节点开始,兴成文件系统树。

学到了什么?

  1. 书中介绍了三种文本编辑器:vim,gedit,emacs.其中vim我较为熟悉,也是因为在大一的课程中稍微的接触使用过。

  2. 2.1.1着重介绍了vim这一编辑器,与其他大多数编辑器不同,vim有3种不同的操作模式,分别是命令模式:用于输入命令。插入模式:用于输入和编辑文本。末行模式:用于保存文件并退出。vim启动时,处于默认的命令模式,在该模式下,大多数键表示特殊命令。移动光标的

    命令键示例如下:
    
  • h:将光标向左移动一个字符

  • l:将光标向右移动一个字符

  • j:将光标向下移动一行

  • k:将光标向上移动一行

  • 对于Gedit来说,gedit是 GNOME桌面环境默认的文本编辑器。它是 Ubuntu及其他使用 GNOME 的GUI用户界面的 Linux的默认编辑器,包含用于编辑源代码和结构化文本(如标记语言)的工具。

  • Emacs其是一款强大的文本编辑器,可在多个不同的平台上运行。最受欢迎的 emacs版本是 GNU Emacs,可在大多数 Linux发行版中使用。上述的许多文本编辑器由于我大一使用过vim于是我决定继续在我接下来的课程中使用vim。

  • 程序开发:步骤:(1).创建源文件:使用文本编辑器创建一个或多个程序源文件;(2).用gcc把源文件转换成二进制可执行文件;(3).完成gcc三个步骤

  • C语言程序变量:全局变量、局部变量、静态变量、自动变量和寄存器变量:全局变量在函数外定义。局部变量在函数内定义。全局变量具有唯一性,并且只有一个副本。静态全局变量仅对定义它们的文件可见。非静态全局变量则对同一程序的所有文件都可见。
    全局变量可以初始化,也可以不初始化。初始化的全局变量在编译时赋值。未初始化的全局变量在程序执行开始时清零。局部变量只对定义它们的函数可见。默认情况下,局部变量是自动变量,它们在函数调用时出现,按逻辑在函数退出时消失。对于寄存器变量,编译器试图把它们分配在CPU寄存器中。由于自动局部变量在函数调用前没有分配内存空间,因此在编译时不能初始化。静态局部变量具有永久性和唯一性,可以初始化。

  • 创建二进制可执行文件的方式有:静态链接和动态链接。其中动态链接的优点是:可减小每个a.out文件 的大小;许多执行程序可在内存中共享相同的库函数;修改库函数不需要重新编译源文件。

  • 大部分C编译器和链接器可生成多种不同格式的可执行文件:(1)二进制可执行平面文件;(2)a.out可执行文件;(a.out文件的内容包括文件头、代码段、数据段和符号表)(3)ELF可执行文件。

  • 静态与动态链接:创建二进制可执行文件的方式有两种,分别是静态链接动态链接。在使用静态库的静态链接中,链接器将所有必要的库函数代码和数据纳a.out文件中。这使得aout文件完整、独立,但通常非常大。在使用共享库的动态链接中,库函数未包含在a.out文件中,但是对此类函数的调用以指令形式记录在a.out文件中。在执行动态链接的a.out文件时,操作系统将a.out文件和共享库均加载到内存中,使加载的库代码在执行期间可供a.out文件访问。

  1. 动态链接的主要优点是
  • 可减小每个aout文件的大小

  • 许多执行程序可在内存中共享相同的库函数。

  • 修改库函数不需要重新编译源文件。

动态链接所用的库称为动态链接库(DLL)。它们在 Linux中称为共享库(.s0文件)。动
态加载(DL)库是指仅按需加载的共享库。动态加载库可用作插件和动态加载模块

  1. a.out文件的内容
    为了简便起见,我们首先讨论传统的a.out文件。
    a.out文件包括以下部分:
  • 文件头:文件头包含a.out文件的加载信息和大小,其中
  • tsize=代码段大小
  • dize=包含初始化全局变量和初始化静态局部变量的数据段的大小
  • bsize=包含未初始化全局变量和未初始化静态局部变量的bs段的大小
  • total size=加载的a.out文件的总大小

(1). 代码段:也称为正文段,其包含程序的可执行代码。代码段从标准C启动代码开始,该代码调用main()函数。

(2). 数据段:数据段包含初始化全局变量和初始化静态数据:

(3). 符号表:可选,仅为运行调试所需。

最有收获的内容:

看完第一章与第二章的内容我对于程序的执行与停止这一过程较为感兴趣,并且有一定的收获,因为这一部分与我的日常学习联系最为紧密,我需要了解我的程序如何运行与停止。

1.程序执行过程****

在类Unix操作系统中,在sh命令行执行a.out文件,以标记字符串作为命令行参数。为执行命令,sh创建一个子进程并等待该子进程终止。子进程运行时,sh使用a.out文件,按照以下步骤创建新的执行映像。

(1)读取aout文件头,以确定所需的总内存大小,包括堆栈空间大小:

Totalsize=brk stacksize

其中,堆栈大小通常是操作系统内核为待启动程序选择的默认值。无法知道一个程序究竟需要多大的堆栈空间。操作系统内核通常使用待启动程序的默认初始堆栈大小,并试着处理随后在运行期间可能出现的堆栈溢出问题。

(2)sh从总大小中分配一个内存区给执行映像。从概念上讲,我们可假设分配的内存区是一个单独的连续内存。sh将a.out文件的代码段和数据段加载到内存区中,堆栈区位于高位地址端。sh将bss段清除为0,使得所有未初始化全局变量和未初始化静态局部变量以初始值0开始。执行期间,堆栈向下朝低位地址延伸。

(3)然后,sh放弃旧映像,开始执行新映像,

2.程序终止

可通过两种可能的方法终止正在执行a.out的进程。

(1)正常终止:如果程序执行成功,main()最终会返回到crt0.0,调用库函数exit(0)来

终止进程。首先, exit(value))函数会执行一些清理工作,如刷新 stdout、关闭/0流等。然

后,它发出一个 exit(value))系统调用,使进入操作系统内核的进程终止。退出值0通常表

示正常终止。如果需要,进程可直接调用 I exit(value),不必返回到crt0.0。再直接一点,进

程可能会发出 exit( value))系统调用以立即终止,不必先进行清理工作。当内核中的某个进

程终止时,它会在进程结构体中将 f exit(value))系统用值记录为退出状态,通知它的父进

程并使该进程成为僵尸进程。父进程可通过系统调用

pid wait(int * atatus)i

找到僵尸子进程,获得其pid和退出状态,它还会清空僵尸子进程的结构体,使该结构体可

被另一个进程重新使用。

(2)异常终止:在执行a.out时,进程可能会遇到错误,如无效地址、非法指令、越权

等,这些错误会被CPU识别为异常。当某进程遇到异常时,它会陷入操作系统内核。内核

的陷入处理程序将陷入错误类型转换为一个幻数,称为信号,将信号传递给进程,使进程终

止。在这种情况下,僵尸进程的退出状态就是信号数值,我们可以说该进程异常终止了。除

了错误导致的陷入,信号也可能来自硬件或其他程。例如,按下“Ctrl+C”组合键会产生

硬件中断,它会向该终端上的所有进程发送数字2的信号 SIGINT,使进程终止。或者,用

户可以使用命令

kill -s signal number pid

signal number 1 to 31

向通过pid识别的目标进程发送信号。对于大多数信号数值,进程的默认操作是终止。

问题与解决思路

我在准备将书上的代码敲入我的虚拟机时遇到了虚拟机无法启动这一问题:

查阅资料

我选择在网上查阅资料,查询到了包括重新安装,更改注册表,重新启动服务等方法,但没有一个是奏效的,哪怕我将同学的文件拷来电脑上也无法解决该问题

依旧无法启动。

3.自我总结

我在接下来的时间中还需要用更多的时间来把这个问题解决掉,这一问题严重的影响了我的学习,网上的办法无一例外都无法解决,我需要找到更多办法,这一问题的解决过程我还会在我的博客园持续更新,直到解决。

posted @ 2021-09-14 12:55  李业达  阅读(63)  评论(0编辑  收藏  举报