1. 内核、内核态和用户态

​ 内核是指管理和分配计算机资源的核心层软件。其中计算机资源包括CPU、RAM(随机存取存储器)和设备。内核有以下职责:

- 进程调度

- 内存管理

- 提供文件系统

- 创建和终止进程

- 设备访问

- 联网

- 提供系统调用应用编程接口(API)

​ 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据,并发送到网络, CPU划分出两个权限等级——用户态和内核态。内核态可以访问所有数据,包括所有程序的内存、联机的所有设备等。用户态只能访问当前程序的内存,也不能访问任何外围设备,如果要访问就需要调用内核提供的API。

2. 用户和组

​ 系统的每个用户都拥有唯一的登录名,一个用户可以隶属于多个组。用户和组分别记录在/etc/passwd 和/etc/group文件中。为了保证用户的密码安全,经过加密的密码存在/etc/shadow中。

​ etc/passwd文件可以使用getpwnam()和getpwuid()来读取。

   /*	由:分隔,分别对应结构中对应的字段
* root:x:0:0:root:/root:/usr/bin/zsh
*/
struct passwd {
char *pw_name; //Login name
char *pw_passwd; //Encrypted password
uid_t pw_uid; //User Id
gid_t pw_gid; //Group Id
char *pw_gecos; //@Deprecated
char *pw_dir; //Initial working directory
char *pw_shell; //Login shell
};
   #include <pwd.h>
struct passwd *getpwnam(const char *name);
struct passwd *getpwid(uid_t uid); /* 扫描/etc/passwd文件 */
struct passwd *getpwent(void);
void setpwent(void); //设置指针到开头
void endpwent(void); //扫描完成关闭文件

​ etc/group文件可以使用getpwnam()和getpwuid()来读取。

   /*	由:分隔,分别对应结构中对应的字段
* adm:x:4:syslog
*/
struct group {
char *gr_name; //Group name
char *gr_passwd; //Encrypted password
gid_t gr_gid; //Group Id
char **gr_men; //Members list
};
   #include <grp.h>
struct group *getgrnam(const char *name);
struct group *getgrgid(gid_t gid); /* 扫描/etc/group文件 */
struct group *getgrent(void);
void setgrent(void); //设置指针到开头
void endgrent(void); //扫描完成关闭文件

​ etc/shadow文件可以使用getspnam()来读取。

   /*	由:分隔,分别对应结构中对应的字段
* root:*:17737:0:99999:7:::
*/
struct spwd {
char *sp_name; //Login name
char *sp_pwdp; //Encrypted password
...
};
   #include <shadow.h>
struct spwd *getspnam(const char *name); /* 扫描/etc/shadow文件 */
struct group *getspent(void);
void setspent(void); //设置指针到开头
void endspent(void); //扫描完成关闭文件

​ 我们可以使用标准密码认证,我们可以对输入的密码进行加密与/etc/shadow中存储的sp_pwdp进行比较。加密算法封装于crypt()函数中。

   #define _XOPEN_SOURCE
#include <unistd.h> char *crypt(const char *key, const char *salt);

​ 认证示例:

   ...
struct *wpd = getpwnam(username);
struct *spwd = getspnam(username);
if (spwd != NULL)
wpd->pw_passwd = spwd->sp_pwdp;
char *password = getpass("Password:");
char *encrypted = crypt(password, pwd->pw_passwd);
... //clear password and validity check
Boolean authOk = strcmp(encrypted, pwd->pw_passwd) == 0;
if (authOk)
//success

3. 文件和文件系统

​ 在Linux下,一切皆文件。包括设备、管道、套接字、目录及符号链接等。文件都可以使用同一套系统调用执行I/O操作。内核维护着一套单根目录结构,系统的所有文件都放到根目录“/”下。

​ 文件的系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。磁盘驱动器是一种机械装置,由一个或多个高速旋转的盘片组成。通过在磁盘上快速移动的读写磁头,便可获取/修改磁盘表面的磁盘编码信息。磁盘表面信息物理上存储于磁道的一组同心圆上。磁道自身又被划分为若干扇区,每个扇区则包含一系列物理块。物理块的容量一般为512字节(或512的倍数),代表了驱动器可读写的最小信息单元。文件系统中用来分配空间的基本单位是逻辑块,即文件系统所在磁盘设备上若干连续的物理块。每块磁盘划分为一个或多个(不重叠)分区,每个分区视为/dev路径下的单独设备。分区可以容纳文件系统、数据区域或交换区域。文件系统由引导块、超级块、i-node表和数据块组成。

​ 引导块总是文件系统的首块,是在计算机启动后初始自举,找到操作系统内核所在磁盘分区,并把内核加载到内存中。超级块记录文件系统有关的参数信息,包括i-node表容量,文件系统的逻辑块大小和文件系统的逻辑块数量。i-node表和数据块类似链表结构,i-node记录索引和指针,指针指向数据块地址。文件名存在数据块中。 在目录文件中,文件数据块中存入i-node索引,这个映射称为硬链接,在数据块中存入另一个数据块的文件名称为软链接。

​ 文件属性可以使用stat()、lstat()和fstat()获取文件属性。

   struct stat {
dev_t st_dev;
ino_t st_ino;
mode_t st_mode; //File type and permissions
nlink_t st_nlinke;
uid_t st_uid; //User ID of file owner
gid_t st_gid; //Group ID of file owner
dev_t st_rdev;
off_t st_size; //Total file size (bytes)
...
};

​ st_mode字段内含有位掩码。可拆分为4部分,d rwx rwx rwx,分别表示:文件类型、属主权限(文件拥有者)、属组权限(与文件拥有者同用户组的其他用户)、其他用户组用户权限。

4. I/O模型

​ UNIX I/O模型的显著特点之一就是其输入/输出的通用性概念。也就是说,同一套系统调用(open()、read()、write()、close()等)所执行的I/O操作,可施之于所有文件类型。所有执行I/O操作的系统调用都以文件描述符来指代打开的文件。其中0、1、2分别指代标准输入(stdin)、标准输出(stdout)、标准错误(stderr),这3个文件描述符始终是打开的。

  • 打开一个文件:open()
   #include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, .../* mode_t mode */);

​ flags参数是文件访问模式的位掩码

标志 用途
O_RDONLY 以只读方式打开
O_WRONLY 以只写方式打开
O_RDWR 以读写方式打开
O_CREAT 若文件不存在则创建之
O_DIRECTORY 若pathname不是目录,则失败
O_EXCL 与O_CREAT一起,如果文件已存在就不打开文件,返回错误EEXIST
O_LARGEFILE 在32位系统中使用此标志打开大文件
O_APPEND 总在文件尾部追加数据
O_TRUNC 如果文件已经存在且为普通文件,那么清空文件内容,长度置为0
... ...
  • 创建一个文件:creat()

    #include <fcntl.h>
    int creat(const char *pathname, mode_t mode);
  • 数据写入文件:write()

    #include <unistd.h>
    ssize_t write(int fd, void *buffer, size_t count);
  • 关闭文件:write()

    #include <unistd.h>
    int close(int fd);
  • 改变文件偏移量

    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);

    ​ whence参数表明应参照哪个基点来解释offset参数

标志 用途
SEEK_SET 从文件头部起始点开始偏移
SEEK_CUR 从当前文件偏移量开始偏移
SEEK_END 从文件尾部开始偏移
  • I/O控制方法:ioctl()

    #include <sys/ioctl.h>
    int ioctl(int fd, int request, .../* argp */);

5. 程序、进程、线程和协程

​ 计算机程序是一组计算机能识别和执行的指令。通常以两种面目示人:源码形式和二进制形式。源码程序指人类可以阅读的文本文件,二进制指源码经过编译和链接处理后形成的二进制机器码。进程是正在执行的程序实例。每个进程可执行多个线程,线程为共享同一虚拟内存及一干其他属性的进程。进程和线程都是由内核进行调度,利用CPU时间片的概念进行抢占式调度,协程是用户级概念,完全由用户态程序自己调度。也就是说,内核并不知道协程的存在。

​ 进程在内存上分布几个段:

- 文本:程序的指令

- 数据:程序使用的静态变量

- 堆:程序可从该区域动态分配额外内存

- 栈:随函数调用、返回而增减的一片内存,用于局部变量和函数调用链接信息分配存储空间

​ 所有用户进程都由父进程创建,都有一个进程ID和父进程ID,所有进程之父为内核创建的PID为1的init进程。init进程和守护进程随系统开启而运行,系统关闭而终止。

​ 我们可以使用getpid()和getppid()来获取进程ID和父进程ID

#include <sys/ioctl.h>
pid_t getpid(void);
pid_t getppid(void);

​ 内核为每个进程都提供了相应的目录,命名为/proc/PID,该路径下包含但不限于以下文件:

文件 描述
cmdline 以\0分隔的命令行参数
cwd 指向当前工作目录的符号链接
Environ 环境信息,以\0分隔
exe 指向正在执行文件的符号链接
fd 指向由进程打开的文件的符号链接
maps 内存映射
men 进程虚拟内存
root 指向根目录的符号链接
status 进程状态信息(进程ID、凭证、内存使用量、信号等)
task 为进程中的每个线程均包含一个子目录

6. shell、终端和会话

Linux基本概念的更多相关文章

  1. Linux 基本概念和操作2

    接着上一篇 "Linux 基本概念和操作" 1.删除文件 有时候我们想要删除的文件是只读文件,直接使用rm 文件名,会报错.这时使用" -f " 参数强制删除. ...

  2. Linux磁盘概念及其管理工具fdisk

    Linux磁盘概念及其管理工具fdisk [日期:2016-08-27] 来源:Linux社区  作者:chawan [字体:大 中 小]   引言:冯诺依曼体系中的数据存储器就是我们常说的磁盘或硬盘 ...

  3. Linux - 链接概念详解

    1> Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过 ...

  4. 【Linux大系】Linux的概念与体系

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...

  5. Linux的概念与体系

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我在这一系列文章中阐述Linux的基本概念.Linux操作系统继承自UNIX.一个 ...

  6. linux 多处理器概念

    Linux 提出了 Multi-Processing 的概念,它的调度器可以将操作系统的线程均分到各个核(或硬件线程)上去执行,以此达到并行计算的目的,从而也可以极大地提高系统的性能. 实现计数器 1 ...

  7. Linux 进程状态 概念 Process State Definition

    From : http://www.linfo.org/process_state.html 进程状态是指在进程描述符中状态位的值. 进程,也可被称为任务,是指一个程序运行的实例. 一个进程描述符是一 ...

  8. linux 进程概念

    1,pcb:进程控制块结构体:/usr/src/linux-headers-4.15.0-29/include/linux/sched.h 进程id:系统中每个进程有唯一的id,在c语言中用pid_t ...

  9. linux挂载概念简述:

    挂载概念简述: 根文件系统之外的其他文件要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”,此目录即为“挂载点”,解除此关联关系的过程称之为“卸载” 1.挂载:根 ...

  10. jsp/servlet/mysql/linux基本概念和操作

    一.什么是OOP编程? 面向对象,以结果为导向,并封装整个过程,并尽可能地增加代码的复用性和可扩展性...... 二.Junit? JUnit是一个java语言的单元测试框架.Junit测试时程序员测 ...

随机推荐

  1. battery-historian耗电量测试

    Battery-Historian简介 Battery-Historian是谷歌推出的一款专门分析Bugreport的工具,是谷歌2015年I/O大会上推出的一款检测运行在android5.0(Lol ...

  2. k8s网路策略

    Network Policy(网络策略) 默认情况下,k8s集群网络是没有任何限制的,Pod可以和任何其他Pod通信,在某些场景下需要做网络控制,减少网络面的攻击,提高安全性,就会用到网络策略(Net ...

  3. CSS滚动条样式修改::-webkit-scrollbar

    修改滚动条样式通过伪元素::-webkit-scrollbar:::-webkit-scrollbar - CSS(层叠样式表) | MDN (mozilla.org) :-webkit-scroll ...

  4. Nacos安装与启动

    一.官网下载 1. 地址 https://github.com/alibaba/nacos/releases   二.安装 将下载的安装包解压至非中文目录即可,解压后目录: bin 目录下有启动脚本, ...

  5. Excel之VLOOKUP()函数的基本用法

    语法: VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup]) 规则:  注意: 查找的值:内容需要完全一样 查找范围:查找范围的 ...

  6. Linux系统Shell脚本第三章:for、while循环及脚本实操

    目录 一.echo命令 二.查看当前系统的时间-date命令 三.for循环语句 四.while循环语句结构(迭代) 五.until 循环语句结构 六.continue和break 一.echo命令 ...

  7. Java基础-注释、标识符和关键字、数据类型及拓展

    注释 单行注释// 多行注释/* */ 文档注释/** */ 标识符 Java所有的组成部分都需要名字.类名.变量名及方法名都被成为标识符 关键字 数据类型 强类型语言(安全性高,java) 要求变量 ...

  8. Android 杂项

    1. String to InputStream new ByteArrayInputStream(str.getBytes());

  9. win10系统如何安装无线网卡驱动?win10系统安装无线网卡驱动教程

    转载:win10系统如何安装无线网卡驱动?win10系统安装无线网卡驱动教程_windows10_Windows系列_操作系统_脚本之家 (jb51.net) win10系统如何安装无线网卡驱动? 有 ...

  10. defineProperty和Proxy

    Proxy  JS标准内置对象 const p = new Proxy(target, handler) 创建一个对象的代理: let obj = { a: { b: { c: 1 } } } let ...