linux
为什么linux要分为用户空间和内核空间?
一、为什么linux要分为用户空间和内核空间?
为了减少系统崩溃的概率,linux要分为用户空间和内核空间。
linux要分为用户空间和内核空间,在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。
所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。
二、求教64位Linux的内核和用户地址空间?
我们都知道,32位的Linux中,0x00000000-0xBFFFFFFFFF 这3GB是分配给用户空间的 0xC00000000-0xFFFFFFFFFF 这1GB是分配给内核空间的。
对于64位的Linux,用户空间和内核空间的分界线在:0xffffffff80000000。前面的(小的)是用户空间,后面(大的)的是内核空间。三、Linux系统内核空间主要由?
系统调用接口、内核、设备驱动程序等组成。
Linux系统分为用户空间和内核空间,用户空间有用户程序和函数库组成,内核空间有系统调用接口、内核、设备驱动程序等组成,从内存管理角度,进程有独立的用户空间,而同进程的线程的用户空间是共享的,内核线程没有用户空间。
Linux内核主要由5个子系统组成:进程调度、内存管理、虚拟文件系统、进程间通信和网络接口。
1.进程调度(SCHED):用来负责控制进程对CPU资源的使用。
2.内存管理(MM):用于确保所有进程能够安全地共享机器主内存区。
3.虚拟文件系统(VFS):为上层应用程序提供统一的接口。
4.进程间通信(IPC):用于支持多种进程间的信息交换。 通过系统调用实现进程间的信息交换。
5.网络接口(NET):提供多种网络通信标准的访问并提供对多种网络硬件的支持。 所有的模块都要通过进程调度来运行。
四、linux用户线程read如何调用内核?
所有IO接口函数最终都是调用sys_ctrl实现!
五、Linux 为何不把图形用户界面写入内核?
Windows NT 4.0把GUI做进内核, 微软是专门发了一个白皮书讲这件事的:
MS Windows NT Kernel-mode User and GDI White Paper简单转述一下:Windows NT的内核设计是考虑到微内核的设计的
什么是微内核?在微软NT内核的设计者看来, 微内核有两个原则
- 从设计上:模块化、封装和通过接口抽象数据结构.
- 从实现上:大部分操作系统代码运行在用户模式下(包括驱动程序),只有少部分硬件特定代码和内核本身运行在内核模式。即纯微内核系统
但事实上所有商业上可行的微内核设计不能采用纯微内核的设计, 因为这么做太慢了。
文中给了一个例子:微内核的一个好处是,如果一个操作系统的功能出现了问题,比如文件系统的代码有问题,整个系统不会崩溃。但从使用者的角度考虑,如果一个系统的文件系统出现了问题,那么宏内核的系统崩溃(比如Windows蓝屏)和微内核的数据丢失是没有区别的。
文中没有点出这一点,但很显然,在NT设计者看来,作为一个名称中带有“窗口”的操作系统,如果用户界面崩溃,那么整个系统即完全无法操作,微内核的好处无法体现。
事实上Windows NT 3.x的GUI是运行在用户态的,由csrss.exe(客户端/服务端运行时子系统,Client/Server Runtime Subsystem)负责。csrss.exe由smss.exe(Session Manager Subsystem, 1号进程,相当于Linux的init/systemd或macOS的launchd) 启动,在NT 3.x中负责实现win32子系统的功能。
win32实际上是来自基于DOS的16位Windows上采用的API的移植,16位Windows的user.exe(即窗口管理)和gdi.exe(2D图形绘制)在32位的NT 3.x中被移植为user32.dll和gdi32.dll, 二者仍负责窗口管理和2D图像绘制,但其实现方式为通过与csrss.exe进程间通讯完成GUI的各项功能。具体的进程间通讯方式为LPC, 全称为Local Procedure Call(本地过程调用)或Lightweight Procedure Call(轻量级过程调用), LPC会绕过内核调度器,直接调度到IPC对面的进程。
但尽管NT 3.5优化了LPC的性能,微软的NT开发者当时认为这种微内核风格的实现方式效率还是较低,因此微软在NT4(1996年发布)中将csrss原本负责user32和gdi32对应的服务端代码挪到了内核模式一个叫win32k.sys的组件下,csrss仅剩下win32控制台程序的接口。
将gdi移入内核的后果是,显卡驱动的gdi驱动必须一同在内核中运行,而当时应用也非常广泛的gdi打印机驱动也一同在内核中运行,尽管逻辑上打印机并不如GUI一样需要高性能。NT4和NT5中,如果显卡驱动或gdi打印机驱动出现问题,系统就会崩溃。
在当时,Linux的GUI基本上完全位于用户态. 除去内核的fbdev驱动可以提供一个基本的framebuffer, X Server负责构建窗口管理和绘图的功能(对应NT的win32k.sys),X client使用libX11(对应NT的user32.dll)通过Unix Socket或TCP连接到X Server(对应NT的HWND消息队列),然后使用libX11以及其之上的gtk或者qt(对应gdi32.dll和MFC等框架)绘制窗体。X Server可以使用DDX驱动加速2D绘图(对应NT的gdi驱动)
Linux这套方案在用户态实现,理论效率是不如NT的,而且Linux的GPU驱动质量不如NT, 因此更容易崩溃或卡死。但Linux确实可以通过重新启动X server的方式从崩溃后恢复,而当时的NT则必须重启整个系统。
但之后NT6和Linux都对GUI系统做出了重大的变动。
NT6移除了gdi驱动的功能,并引入了WDDM(Windows Display Driver Model),之前gdi驱动的功能完全使用Direct 3D或CPU实现。WDDM允许GPU驱动重启并重置硬件的状态,因此Windows可以从一些GPU驱动故障中恢复。此外dwm.exe(Desktop Window Manager)允许将桌面合成的工作转交给该进程完成。
Windows10之后,微软在桌面之外的系统上使用的GUI均不包括gdi32和user32的整个体系,在内核上,win32k.sys被分为通用的win32kbase.sys和win32kmin.sys/win32kfull.sys, 只有桌面版本的Windows使用win32kfull.sys, 包括gdi32/user32和传统的窗口体验,Windows手机版、SurfaceHub版、Hololens版、Xbox版、Iot版均使用win32kmin.sys, 并没有传统的窗口体验,反而是使用类似于手机的UI体验. 所谓UWP, 为了统一在这些设备上使用,也不能调用win32kmin中缺失的api, 因此UWP程序一直相较于win32程序较少的原因就是无法使用很多已有的win32 api.
而在定制之后的Windows 10 Iot core或Windows nano server系统上,压根不包括任何GUI的支持,所有控制只能通过powershell或者openssh.
Linux这边,drm换掉了fbdev(1999年drm框架提出,2021年Linux 5.14合并SimpleDRM作为fbdev的替代), drm本身足够轻量,大部分GPU驱动的功能由用户态的mesa或者各个专有驱动完成。而窗口管理等功能均有不同的用户态进程完成,例如X11的开源实现Xorg, 具有客户端库libX11/xcb并通过Unix socket/TCP连接,由各种Window Manager负责管理窗口,然后由合成器完成图像合成;Wayland由各个Wayland合成器负责窗口管理和合成,有统一的libwayland-client客户端库,并通过Unix socket链接;Android有SurfaceFlinger负责窗口合成,有WindowManager负责窗口管理,并通过Linux binder内核驱动与各App进行通讯。显然Linux具有丰富的GUI生态体系。
事实上,当初Windows NT 4.0将GUI移入内核的原因在当前已经不存在了。一方面gdi已经不再使用,程序普遍自绘GUI,另一方面,在用户态实现窗口管理完全不存在性能瓶颈,况且dwm已经将绘制这一主要的窗口管理功能在用户态实现了。唯一能解释的就是微软本来打算使用UWP完全代替过去的生态, 但失败了, 因此不再追求在桌面版Windows上破坏原有的win32兼容性。
至于Linux GUI的问题,恐怕并不出在Linux内核上。比如drm支持热插拔,但实际上大概率会导致合成器卡死甚至于内核卡死。
六、Linux Kernel (Linux内核)怎么安装?
1、下载新内核源码:到官网www.kernel.org,下载最新版本linux内核,保存到/usr/src/kernels目录,大约54MB。
2、#cd/usr/src/kernels
3、#tarjvxflinux-2.6.31.5.tar.bz2
4、进入系统原内核目录,把其中的隐藏文件.config复制到新内核目录中。
5、cd进入新内核目录,然后执行#makeoldconfig 此时所有提示均按回车,选项提示都默认。
6、#makexconfig此时弹出一个内核配置窗口,里面全是英文,我看不懂,干脆就直接把这个窗口关掉,继续往下做。
7、#makebzImage&&makemodules&&makemodules_install&&makeinstall第七步编译时间比较长,要30到50分钟不等,要看机器情况了。
8、#uname-r查看内核版本,完成上面步骤后就可以重启系统了,启动时会在GRUB菜单里出现新内核选项了。 此方法安装新内核后同时也会保留旧内核,启动时,可以在新老内核间选择,相当的实用
七、Linux操作系统的组成和功能:探索Linux的内核、Shell和用户空间
Linux操作系统的组成
Linux操作系统是由多个部分组成,主要包括以下几个关键组件:
- 内核(Kernel): Linux操作系统的内核是其最核心的组件。它负责管理硬件和软件之间的交互,提供基本的服务和功能,例如文件系统管理、进程管理、内存管理以及设备驱动程序。内核是Linux操作系统的基础,也是其他组件的基石。
- Shell: Shell是用户与Linux操作系统之间进行交互的界面。它接收用户输入的命令,并将其传递给内核进行处理。Shell可以通过命令行界面(Command Line Interface,CLI)或者图形界面(Graphical User Interface,GUI)来提供交互功能。常见的Shell有Bash、Csh、Ksh等。
- 用户空间: 用户空间是Linux操作系统中用于运行用户应用程序的环境。它包含了各种系统工具、应用程序和库文件,用于执行各种任务,如文件管理、网络通信、图形界面等。用户空间与内核通过系统调用接口进行通信,使得应用程序能够利用内核提供的服务和功能。
Linux操作系统的功能
Linux操作系统具备以下主要功能:
- 多用户支持: Linux操作系统能够同时支持多个用户,并通过用户身份验证和权限控制来保护用户数据和系统安全。
- 多任务处理: Linux操作系统能够同时运行多个应用程序,并通过进程管理来分配系统资源,确保每个应用程序都能得到合理的资源分配。
- 稳定性和可靠性: Linux操作系统以其稳定性而闻名。它具备良好的容错和恢复机制,可以避免单一故障对整个系统的影响,并能够在出现故障后迅速恢复。
- 安全性: Linux操作系统注重安全性,提供了多种安全措施来保护系统免受恶意攻击。例如访问控制、防火墙和加密等功能。
- 开放源代码: Linux操作系统是开源的,这意味着用户可以自由地查看、修改和分发Linux的源代码。这为用户和开发者提供了更多的灵活性和自由度。
- 可定制性和可扩展性: Linux操作系统可以根据用户的需求进行定制,并且支持各种硬件架构和平台。用户可以根据自己的需要来选择和安装特定的软件和服务。
八、android内核和linux内核的区别?
Android内核和Linux内核的主要区别体现在以下几个方面:
首先,Android内核基于Linux内核并进行了一系列修改。这些修改包括了来自谷歌的特定调整,使得Android内核适用于移动设备等资源受限的环境。其中最显著的区别是Android内核添加了Dalvik/ART虚拟机层,这允许在Android平台上高效地运行Java/Kotlin应用程序。
其次,Android Binder是Android内核中一个关键的组件,它提供了进程间通信(IPC)的功能。与Linux系统中使用D-bus进行IPC的方式不同,Android Binder采用了基于OpenBinder框架的设计,这使得Android平台可以更好地支持多核处理器和分布式系统。
此外,Android内核针对移动设备的特性进行了优化。例如,Android内核中的电源管理模块被设计成更加节能高效,以适应移动设备的电池寿命需求。同时,Android内核还对内存管理进行了调整,以适应移动设备的有限内存资源。
需要注意的是,Android内核基于上游Linux长期支持(LTS)内核进行开发。在谷歌,LTS内核会与Android专用补丁结合,形成所谓的“Android通用内核(ACK)”,这有助于保持Android系统的稳定性和可靠性。
总结而言,尽管Android内核与Linux内核共享许多基本特性,但由于针对移动设备的特殊需求进行了优化和修改,它们之间存在明显的差异。这些差异包括了虚拟机层的加入、IPC机制的改变以及针对移动设备的优化特性。
九、Linux是宏内核还是微内核?
GNU那帮人就是太牛了导致弄不出来内核。
因为 GNU 项目的内核的设计是微内核设计,结果太过于先进而…… 而 Linux 是传统的宏内核设计,这种内核随便找几个认真上课的大本学生就能凑合嘀咕出来一个。结果因为 Linus 选择了 GPL 协议,所以大家的注意力就全都到了 Linux 上面,技术先进的 Hurd 反而成了弃子。Linus 完成的内核其实也不怎么样,那是在一帮疯子的合作下才实现真正成为可用的内核的。还有,GNU 项目是 84 年成立的,Linux 也已经有20年多的历史了。GNU 那帮疯子应该是说 30 年造不出一个内核。其实 hurd 一直就有,但总是没办法拿出来用而只能用于“技术试验”。Debian 有 Hurd 内核的版本。十、linux内核与cpu内核区别?
1. Linux内核版本与linux发行版本的区别:LINUX内核版本是指系统内核的版本号,LINUX的内核具有两种不同的版本号,实验版本和产品化版本。首先解释一下什么是Linux发行版(英文名称是Linux Distribution)。Linux实际上是一种开放源代码的操作系统内核,通常我们说的Linux指的是基于Linux内核的操作系统。 2. Linux操作系统包括Linux内核和Linux用户态程序,Linux内核和Linux用户态程序都是开放源代码的,绝大多数软件代码遵循GPL协议,任何人拿到这些代码都可以对这些代码进行修改和分发。 3. 由于Linux上代码的高度自由,很多公司和组织都推出了自己的Linux操作系统,这些Linux操作系统我们就叫做Linux发行版。各种不同的Linux发行版的共同点就是都使用了Linux内核,不同的Linux发行版的内核可能有一些小的修改。 1. 要确定 LINUX版本 的类型,只要查看一下版本号:每一个版本号由三位数字组成,第二位数字说明版本类型。如果第二位数字是偶数则说明这种版本是产品化版本,如果是奇数说明是实验版本。 2. 如2.4.18是产品化版本,2.5.21是实验版本。查看 linux内核版本 命令:uname -r Linux发行版本 是指一些 Linux厂商 将 LINUX系统内核 与应用软件及文档包装在一起,并提供一些安装界面和系统设定与管理工具,这就构成了一个发行套件。
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...