20201320第一周学习笔记
第一章 引言
本章简单介绍了Unix的历史,包括贝尔实验室开发的Unix早期版本、AT&T System V以及Unix的其他版本,如BSD、HP UX、IBM AIX和Sun/SolarisUnix。此外,还介绍了Linux的开发及其各种发行版(包括Debian、 Ubuntu、 Mint、 RedHat和Slackware),列出了适用于Linux的各种硬件平台和虚拟机,并展示了如何将UbuntuLinux同时安装到Microsoft Windows中的VirtualBox虚拟机和VMware虚拟机上。
系统编程
系统编程是计算机科学和计算机工程教育不可或缺的一部分。计算机专业中的系统编程课程可以为学生打下扎实的专业基础,在操作系统、嵌入式系统、数据库系统、人工智能等方面有很重要的影响。
-
1.1-1.11
主要介绍了本书主要要介绍的内容,并介绍了Unix与Linux的相关内容与发展
Unix 包含AT&T Unix、Berkeley Unix、HP Unix、IBM Unix、Sun Unix、Linux 包含Debian Linux、Ubuntu Linux、Linux Mint、基于RPM的Linux、Slackware Linux
-
安装虚拟机
-
1.13使用Linux
-
linux内核映像
Linux内核映像位于/boot目录中,一个可启动的Linux内核映像由三部分组成: |BOOT|SETUP|linux kernel|
Linux的三个文件流:stdin、stdout和stderr
-
Linux启动
加载BOOT+SETUP至实模式内存的0x90000处
加载Linux内核至高端内存的1MB处
-
Unix/Linux文件系统组织
Unix/Linux文件系统采用树形组织结构
-
Unix/Linux命令
- cd:更改目录
- exit:退出
- logout:注销
- sudo apt install:安装应用程序
- sudo:使用root权限执行
- ls:lsdirname:列出CWD或目录的内容。
- pwd:打印CWD的绝对路径名。
- touch filename:更改文件名时间戳(如果文件不存在,则创建文件)。
- cat filename:显示文件内容。
- cp src dest:复制文件。
- mv src dest:移动或重命名文件。
- mkdir dirname:创建目录。
- rmdir dirname:移除(空)目录。
- rm filename:移除或删除文件。
- find:搜素文件
- grep:搜索文件中包含模式的行。
- ssh:登录到远程主机
- tar-zcvffile.tgz:从当前目录创建压缩tar文件。
- tar-zxvffile.tgz:从tgz文件中解压文件。
- man:显示在线手册页。
- zip file.zip filenames:将文件压缩为.zip文件。
- unzip file.zip:解压.zip文件。
- history:查看历史命令。
- !数字:执行第"数字"条命令。
第二章 编程背景
本章讲述了系统编程所需的背景信息;介绍了几种基于GUI的文本编辑器,比如vim、gedit和EMACS,可供读者编辑文件使用:展示了如何在命令和GUI模式下使用EMACS编辑器来编辑、编译和执行C语言程序;阐述了程序开发的步骤,这些编译链接步骤包括GCC、静态和动态链接、二进制可执行文件的格式和内容、程序执行和终止等;详细阐释了函数调用惯例和运行时堆栈的使用,包括参数传递、局部变量和栈帧。
-
Linux中的文本编辑器-
https://blog.csdn.net/jisuanji198509/article/details/86690617/
此网站包含具体的vim键位以及使用技巧等
-
程序开发
创建源文件>用gcc把源文件转换成二进制可执行文件>静态与动态链接库
可执行文件格式
二进制可执行平面文件
a.out 可执行文件
ELF可执行文件
程序执行过程
读取a.out文件头,以确定所需的总内存大小。
sh从总大小中分配一个内存区给执行映像。
sh放弃放弃旧映像,开始执行新映像。
执行从crt0.o开始,调用main()。
链接库
链接库静态链接库和动态链接库。
项目管理:
头文件:/include *.h
源文件:/src *.c
库: /lib *.o
二进制可执行: /bin *.out
makefile
makefile用来管理和编译项目。makefile是一个文件,在使用make命令时,会读取这个文件并对项目按照文件内容进行编译。make文件由一系列目标项、依赖项、规则组成。
GDB调试工具
GDB调试工具是一个交互式调试工具,可以调试用C、C++和其他几种语言编写的程序。
GDB是一个功能强大的调试工具,使用非常简单,但应该注意,所有调试工具只能提供有限的帮助,在某些情况下用处不大,所以程序开发的最佳方法是仔细设计程序的算法,然后根据算法编写程序代码。