1-Linux整体结构划分
本文大致介绍了Linux系统整体结构的划分,可被划分为 内核层 和 用户层。为什么这样划分,以及根据什么来划分。
从整体来看,Linux系统可以简单的划分为用户区和内核区。
为什么要分区
因为 进程必须分区,进程是操作系统的执行单元,也是用户一切操作的单元。一个进程可以被划分为 用户区 和 内核区。
如果进程不分区,用户可以轻易访问操作系统的所有资源,那么系统底层数据和硬件的安全性将无法保证:
- 不分区意味着所有数据对用户可见,用户可以随意获取并修改,很危险。
- 不分区意味着用户可以直接操作硬件,硬件安全性无法得到保障,用户的错误操作会使硬件不能长期工作。
- 不分区意味着非专业用户的操作更容易弄坏系统。
因此进程的分区是必须的,进程在用户区时无法访问内核区(操作系统的核心在内核区,只要用户不能任意修改内核区,操作系统就不易损坏);进程在内核区时可以访问用户区和内核区,这通常是操作系统管理的进程,有安全性。
既然进程的分区是必须的,那么操作系统的分区也是必须的。
如何分区
也和进程有关系,进程的用户区和内核区与操作系统的用户区和内核区有大致对应关系。因为Linux是面向进程设计的操作系统,一切都要靠进程来运行。
进程是依靠指针寻址的,由于指针只有32位或64位,那么一个进程最多可以有
从软件的角度无法划分用户区和内核区,因为指针的值是可以修改的,可以通过修改指针的值强行访问任意区域:
// 强行访问位于0x64的内容
int* a = reinterpret_cast<int*>(100);
cout << *a;
此时会触发对内核区非法访问的报错:
因此要从硬件的角度划分用户区和内核区。CPU有0,1,2,3级四种运行级别,linux和windows都只使用了0级或3级。当进程在用户区时,它的运行级别是3,此时指针只能访问用户区(访问内核区会出现上面非法访问报错);进程切换到内核区时,它的运行级别时0,指针可以访问用户区和内核区。
参考资料
- Linux系统编程 - 飘零的落花
- Linux基础课 - Acwing