Linux

内核

计算机系统是硬件和软件的共生体,它们互相依赖,不可分割。
硬件有外围设备、处理器、内存、硬盘和其他的电子设备,组成计算机的发动机。
完成控制硬件工作的软件称为操作系统,在Linux中被称为“内核”。
Linux内核的主要模块分以下几个部分:
存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等

版本编号方式:
1.0版本之前 0.01 0.02 0.03 0.10 0.11 0.12 0.95 0.96 0.97 0.98 0.99
1.0后到2.6,由"A.B.C"三部分组成,A代表主版本号,B代表次主版本号,C代表较小的末版本号。
只有在内核发生大变化时A才变化(1994年的1.0,1996年的2.0)
B代表是否是稳定版,偶数是稳定版,奇数是开发版。
C代表bug修复,安全更新,新特性和驱动的次数。
2.6.0到3.0,”A.B.C.D”的格式。
C随着新版本的发布而增加,D代表一些bug修复,安全更新,添加新特性和驱动的次数。
3.0- ,"A.B.C"的格式,B随着新版本的发布而增加,C代表bug修复,安全更新,新特性和驱动的次数。
不再使用偶数是稳定版 奇数是开发版 的命名方式。如3.7.0不是开发版而是稳定版。

内核态 用户态

Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。
内核控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,
应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。
为了使上层应用能够访问到这些资源,内核须为上层应用提供访问的接口:即系统调用。

    Shell是一个特殊的应用程序,俗称命令行,本质上是一个命令解释器,它下通系统调用,上通各种应用,
通常充当着一种“胶水”的角色,来连接各个小功能程序,让不同程序能够以一个清晰的接口协同工作,
从而增强各个程序的功能。
    Shell是可编程的,可以执行符合Shell语法的文本(Shell脚本),Shell语句对系统调用做了一层封装。
为了方便用户和系统交互,一个Shell对应一个终端,终端是一个硬件设备,呈现给用户的是一个图形化窗口。
可以通过这个窗口输入或者输出文本。

/dev/null

空设备,一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取时会返回EOF。
空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。

用法:
当test.c文件不存在时
cat test.c  --> cat: test.c: 没有那个文件或目录
cat test.c 2>/dev/null --> 没有错误信息输出

/dev/zero

一个特殊的文件,读取时会提供无限的空字符(NULL,0x00)
一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。

激活root帐号

安装系统时,root账户并没有被激活来供你使用(即root帐号被隐藏)。
这样做是防止你不得不使用root来进行一些系统的初级管理,同时完全允许另一个账户来充当超级用户,
也保护了系统安全方面的缺陷。

如需使用root用户来完成操作,使用以下命令激活root用户:
在终端中输入:sudo passwd root
之后要求你输入两次root用户的密码,重启后就可以登陆root用户了。
退出root权限方法:$ exit
若想禁用root帐号:sudo passwd -l root

IO Input/Output 输入/输出

程序在运行时,数据是在内存中由CPU来执行,涉及到数据交换的地方(通常是磁盘、网络)需要IO接口。
由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。
如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒
有两种办法:
1.CPU等待,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,
这种模式称为同步IO
在IO操作过程中,当前线程被挂起,其他需要CPU执行的代码就无法被当前线程执行。
因为一个IO操作就阻塞了当前线程,导致其他代码无法执行,
所以必须使用多线程或者多进程来并发执行代码,为多个用户服务
多线程和多进程的模型虽然解决了并发问题,但是系统不能无上限地增加线程。由于系统切换线程的开销也很大,
所以一旦线程数量过多,CPU的时间就花在线程切换上了,真正运行代码的时间就少了,结果导致性能严重下降
2.CPU不等待,告诉磁盘慢慢写。CPU就去执行其他代码了,一段时间后,当IO返回结果时再通知CPU进行处理,
这种模式称为异步IO

同步和异步的区别在于是否等待IO执行的结果
使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的复杂度远远高于同步IO
结果执行结束通知CPU的方式
服务员跑过来找到你:回调模式
服务员发短信通知你,就需不停地检查手机:轮询模式
操作IO的能力都是由操作系统提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来方便使用。

标准输入、输出和错误

在shell中执行命令时,每个进程都和三个打开的文件相联系(文件描述符0,1,2),
并使用文件描述符来引用这些文件。
输入文件—标准输入0:stdin,命令的输入,缺省是键盘也可以是文件或其他命令的输出
输出文件—标准输出1:stdout,命令的输出,缺省是屏幕也可以是文件
错误输出文件—标准错误输出2:stderr,命令错误的输出,缺省是屏幕也可以是文件
void main()
{
    fprintf(stderr,"can't open it!");
    fprintf(stdout,"can't open it !");
    printf("can't open it!");
}
1.运行结果如下:
Can't open it! Can't open it! Can't open it!
2.若将输出重定向到temp.txt文件,运行:./fprint >temp.txt结果如下:
Can't open it!
查看temp.txt文件内容为:Can't open it!Can't open it!
说明:两者默认输出到屏幕。
重定向输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕
3.strerr是作为程序运行过程中的错误显示出来的,若想将它重写向到某文件中,需要运行如下命令:
./fprint 2>temp.txt

linux缓冲区

ANSI C里定义的标准I/O是一种带缓冲的高级磁盘I/O,目的是尽可能减少使用read和write系统调用的次数,
从而提高I/O效率
作用:在实际编程中,I/O速度取决于显示器、键盘、硬盘等I/O设备的性能,而这些设备比起CPU和内存是比较慢的。因此系统采用缓冲区的方式来减少I/O的读写,以便提高系统性能

标准I/O提供了3种类型的缓冲类型
行缓冲
这种情况下,当输入和输出中遇到换行符时,标准I/O库执行I/O操作,允许一次输出一个字符(如fputc函数),
但只有写了一行之后才进行实际I/O操作。
标准输入/输出流缺省是行缓冲,先写到行缓冲区里,当遇到下列情况时一次性把行缓冲区的数据写到I/O设备里
1、遇到\n字符;
2、行缓冲区(linux默认大小为1024字节)被填满后。
3、调用冲洗缓冲区的函数:fflush等。
4、进程返回、调用exit退出、文件流关闭等。_exit 函数并不冲洗缓冲区
   行缓冲的I/O设备通常是需要交互的I/O:键盘(默认的stdin),屏幕(默认的stdout)

无缓冲
标准I/O库不对字符进行缓冲。如果用标准I/O函数写若干字符到不带缓冲的流中,则相当于用write系统调用将这些字符写到打开的文件上。
标准错误stderr通常是不带缓存的,这就使得出错信息可以尽快显示出来。

全缓冲
全缓冲的特性是:C标准输出先写到全缓冲区里,当遇到下列情况才一次性把全缓冲区的数据写到I/O设备里去:
1、全缓冲区被填满后
2、调用冲洗缓冲区的函数:fflush等
3、进程返回、调用exit退出、文件流关闭等
对于文件(文件是在硬盘上的),硬盘I/O属于全缓冲
对于全缓冲来说,读写操作是按照缺省的缓冲区大小(4K)进行的。
具体说就是从流读取内容时每次读取4K大小的内容到缓冲区,而程序是从缓冲区里读取数据的。
当缓冲区里的数据处理完后再从流里读取4K的内容到缓冲区。
FILE *fp;
char buf[8192] = {0}; //缓冲区初始化为0
char ch;
if ( (fp=fopen (“data.txt”, “r+)) == NULL )
{
    printf(“Fail to open file\n”);
    exit(-1);
}
setvbuf(fp, buf, _IOFBF, 4096); //设置流fp为全缓冲,缓冲区指向buf,大小为4096
fread(&ch, 1, 1, fp); //从流中读取一个字节的内容存放到变量ch中
//虽然程序中只读取了1个字节,但实际上读取了4K的内容存放到buf中
printf(%d %d %d\n”, buf[0], buf[1], buf[4095]); 

写文件的情况类似,当缓冲区写满内容时才会引起实际的I/O操作,文件被更新。
又读又写的情况比较特殊。因为读写缓冲区只有一个,所以在读取内容到缓冲区之前会先把缓冲区里要更新的内容
(如果有的话)写到文件

Linux设备

依据工作方式的不同分三类:
1. 字符设备
在I/O传输过程中以字符为单位进行传输的设备。如键盘,打印机
2. 块设备
将信息存储在固定大小的块中,每个块都有自己的地址。数据块的大小通常在512字节到32768字节之间。
块设备的基本特征是每个块都能独立于其它块而读写。如磁盘。
3. 网络通信设备
VFS virtual File System

作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统。
即为各类文件系统提供了一个统一的操作界面和应用编程接口。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。

应用程序和VFS之间的接口是系统调用,而VFS与磁盘文件系统以及普通设备之间的接口,是file_operations 结构体成员函数,这个结构体包含对文件进行打开、关闭、读写、控制的一系列成员函数。
在这里插入图片描述

minicom

一个串口通信工具(Windows下的超级终端)。可用来与串口设备通信,如调试交换机和Modem等。
安装:sudo apt-get install minicom
配置

1.在终端中输入minicom以启动minicom;
2.先按下Ctrl + a, 放开, 再按o, 出现配置菜单.
3.选择 Serial port setup, 此时所示图标在“Change which setting”中,键入“A”,此时光标移到第A项对应处:串口COM1对应ttyS0, COM2对应ttyS1. (注意选择)
具体的配置信息如下所示:
Serial port setup [Enter]
+-------------------------------------------------------------+
| A -    Serial Device      : /dev/ttyUSB0                    |
| B - Lockfile Location     : /var/lock                       |
| C -   Callin Program      :                                 |
| D - Callout Program      -:                                 |
| E -    Bps/Par/Bits       : 115200 8N1                      |
| F - Hardware Flow Control : No                              |
| G - Software Flow Control : No                              |
|                                                             |
|    Change which setting?                                    |
+-------------------------------------------------------------+
对波特率,数据位和停止位进行配置,键入“E”,波特率选为115200 8N1 (奇偶校验无, 停止位1),
硬/软件流控制分别键入“F”“G”并且都选NO.
在确认配置正确之后,可键入回车返回上级配置界面,并将其保存为默认配置(即save setup as   dfl),
之后重启minicom是刚才配置生效,在连上开发板的串口线后,就可在minicom中打印正确的串口信息

命令minicom是进入串口超级终端画面,而minicom -s为配置minicom。
说明/dev/ttyS0 对应为串口0 为你连接开发板的端口。
注意:非正常关闭minicom,会在/var/lock下创建几个文件LCK*,这几个文件阻止了minicom的运行,将它们删除后即可恢复
组合键的用法是:先按Ctrl+A组合键,然后松开这两个键,再按Z键。另外还有一些常用的组合键。
(1)S键:发送文件到目标系统中;
(2)W键:自动卷屏。当显示的内容超过一行之后,自动将后面的内容换行。这个功能在查看内核的启动信息时很有用。
(3)C键:清除屏幕的显示内容;
(4)B键:浏览minicom的历史显示;
(5)X键:退出mInicom,会提示确认退出。
  1. ssh命令连接不上测试服务器问题复盘
1.在服务器上安装glibc2.12是编译代码失败,下载glibc2.14代码后编译成功
2.在lib64 软连接libc.so.6->glibc2.17
3.尝试删除软连接lib.c.so.6 新建软连接libc.so.6->glibc2.14
4.删除软连接lib.c.so.6后,导致Linux命令就不能用了,服务器也连不上了
# export LD_PRELOAD=/lib64/libc-2.12.so
# ln -s /lib64/libc-2.12.so /lib64/libc.so.6
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夏与冬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值