第一章 引言
总述:
在第一章刚开始这本书引入了Linux系统,告诉了我们Linux系统的发展历程和它的一些运行模式,他的版本,其中最主要讲的就是unbuntu Linux版本,讲了他的一些常用的linux命令,文件系统组织,ubuntu linux的用户账户管理。
学习内容:
(一)本书的地位
系统编程是计算机科学和计算机工程教育不可或缺的一部分。1是因为教授学生计算机系统软件方面的广博知识以及高级编程技巧使其能够与操作系统内核交互,从而有效利用系统资源来开发应用软件;2是为学生打下专业基础,一边以后在各个领域继续深造。
(二)本书的目的
(1)强化学生的编程背景知识
(2)可以应用动态数据结构(包括C结构、指针、链表和链树)
(3)理解进程概念和进程管理
(4)并发编程,尝试使用用户级线程,实现线程同步工具,并通过用户级线程练习并发编程
(5)定时器和定时功能,实现支持并发任务的间隔定时器
(6)使用Linux信号和管道来实现一个进程间通信机制
(7)让学生实现一个与Linux完全兼容的完整EXT2文件系统
(8)可以使用CGI编程来实现一个网络服务器。
(三)系统概述
unix是一种通用操作系统,在后续开发中又有了v6 unix和system v unix版本,最后有了开源的bsd unix,后续发展了多种bsd版本一直沿用至今。但是大多数unix系统都是专有的,普通人无法访问,不方便联系使用,所以我们经常使用Linux。
linux是一个类unix系统它本来是一个实验性内核,但是使用的人不断增多,再加上吸收了不少GUN软件,所以它慢慢发展成为了一个完整的操作系统。linux的内核是完全相同的,但是根据发行版本不同,Linux有了许多不同的版本,如cebian linux,ubuntu linux,linux mint等等。
linux的内核映像由部分组成,1是boot一个512字节的启动程序,2是setup在启动期间将16位模式转换为32位保护模式,3是linux kernel是linux的实际内核映,它采取压缩格式
ubunt版本的linux是用户管理模式当用户使用登录名和密码登录后,登录进程将通过获取用户的gid和uid来转换成用户进程,并将目录更改为用户的homeDir,然后执行列出的initialProgram,该程序通常为命令解释程序同时ubuntu禁用了根或者超级用户账户,可以防止任何人以根用户身份登录。用sudo来执行超级用户的命令。
unix/linux文件系统组织文件类型有目录文件、非目录文件(常规文件和特殊文件(字符特殊文件与块特殊文件))、符号链接文件。
学习感受:
在这一章中我学会了通过虚拟机安装和运行linux,虽然大一也学过这个,但是因为当时大一对自己的电脑还不是很熟悉,不知道每次都要以管理员模式运行,所以决定它不好用最后就给删了
第二章 编程背景
介绍了基于GUI的文本编辑器(这个在大二下学java时有所涉及);展示了如何在命令和GUI模式下使用EMACS编辑器来编辑、编译和执行C语言程序;并且向我们阐述了程序开发的步骤;详细阐释了函数调用惯例和运行时堆栈的使用;展示了C语言程序与汇编代码的链接;学会运用GUNmake工具编写makefile;提及了如何使用GDB调试工具调试C语言程序,并防止出现调试过程中出现的常见错误;复习了C语言中的结构和指针。以及数据结构中的二叉树模拟Unix/Linux文件系统树中的操作等。
这章主要讲了三种linux的文本编辑器,第一种是linux的标准内置编辑器vim 它有3种不同的操作模式,1命令模式(输入)是2插入模式(更改)3末行模式(退出)第二种是gedit,它是GNOME桌面环境默认的文本编辑器;第三种EMACS(GUN EMACS 2015)可以在很多不同的平台上运行
程序开发:步骤:
(1).创建源文件:使用文本编辑器创建一个或多个程序源文件;
(2).用gcc把源文件转换成二进制可执行文件;(3).完成gcc三大步骤:1.将C源文件转换为汇编代码文件;2.把汇编代码转换成目标代码;3.执行链接器:将.o文件的所有代码段组合成单一代码段,再将所有数据段组合成单一数据段,最后将所有BSS段组合成单一bss段,用.o文件中的重定位信息调整组合代码段中的指针以及组合数据段、bss段中的偏移量,便于用符号表来解析各个.o文件之间的交叉引用。
再就是静态链接和动态链接。其中动态链接的优点是:可减小每个a.out文件的大小;许多执行程序可在内存中共享相同的库函数;修改库函数不需要重新编译源文件。
可执行文件格式
(1)二进制可执行屏幕文件
(2) a.out可执行文件;(a.out文件的内容包括文件头、代码段、数据段和符号表)
93)ELF可执行文件。
C语言结构体的属性:(1)定义C语言结构体时,该结构体的每个字段都必须具有一个编译器已知的类型,但自引用的指针除外;(2)每个C语言结构体数据对象都分配了一个连续内存块;(3)一个结构体的大小可以由sizeof(struct type)确定;(4)假设“NODE x,y;”为两个相同类型的结构体;(5)C语言联合体与结构体类似。
链表操作:构建、遍历、搜索、插入、删除、重新排序;
问题
在学习了文件格式后,虽然后面书很详细的讲了文件a.out文件包括内容啊,程序执行过程啊,程序终止过程啊什么的但是我都不是看的很懂
解决方式
舍友帮忙讲解
这个文件由四个部分
1文件头(文件加载信息和大小)
2代码段(正文段)
3数据段(数据段包含初始化全局变量和初始化静态数据)
4符号表(运行调试使用)
正是因为这4个部分所以程序执行是通过先读取文件头再从内存区分配执行映像
再由sh放弃旧的映像执行新的映像
再从crt0.o开始调用主函数再把argc argv作为参数传递给main()
但是问题是我这里主要是映像到底是个什么我没弄清楚,在经过舍友解答后我明白了他就是程序执行的过程。