# Linux Kernel概述

Linux系统的基础包含了内核、C库、工具集和系统的基本工具。

## 内核态与用户态

内核运行的时候，系统是以**内核态**进入到内核空间运行的。而不同用户执行程序的时候，是以**用户态**在用户空间中运行的。

## 编译内核

### 配置内核

内核中有许多可以配置的选项，以`CONFIG_FEATURE`的形式表示。\
这些配置项的值只有两种选择：

1. `yes`或`no`二选一，代表是否开启某一项功能。 &#x20;
2. `yes`、`no`或`module`三选一，其中`module`表示了功能会被安装，但是是以模块的形式。 &#x20;

使用`make config`即可开始配置相关设置（只是有极为多的条目需要一一配置），另外还可以借助一些工具。\
配置完成后进行编译，使用`make`即可，由于内核内容众多，花费的时间会很长。

### 内核安装

内核的安装取决于使用的引导器，不过目前一般都在使用`grub`引导。\
具体安装流程待补充。

## 内核开发的特点

1.  **不能访问C库，也不能访问标准的C头文件。** &#x20;

    主要原因在于速度和大小，对于内核来说都不合适。 &#x20;

    虽然如此，但是大部分常用的C库函数都已经在内核中实现了，如操作字符串的函数可以通过包含`<linux/string.h>`来获得。 &#x20;

    这些能够访问的属于**内核头文件**。 &#x20;
2. **必须使用GUN C。** &#x20;
3.  **没有内存保护机制** &#x20;

    原本在非法访问内存时的内存保护机制就是由内核提供的，内核内部是没人来保护的。 &#x20;

    所以在内核中就需要注意非法的地址访问，否则很有可能会直接挂掉。 &#x20;

    另外内核中的内存是不分页的，用多少物理内存就少多少，注意内存占用。 &#x20;
4.  **尽量不要在内核中使用浮点数** &#x20;

    内核不能完美支持浮点操作，使用浮点数会需要处理许多额外的东西，所以最好干脆不要使用。
5.  **使用容积小而固定的栈** &#x20;

    内核中栈的大小有限，无法实现动态增长。 &#x20;

    内核栈的大小因体系结构不同而不同，但都为两页。 &#x20;
6.  **同步和并发** &#x20;

    内核中许多特性都要求并发地访问共享数据，这要求有同步机制以防止冲突。 &#x20;

    常见的解决方法是自旋锁和信号量。 &#x20;
7. **可移植性** &#x20;
