linux内核空间
❶ linux用户空间内存分配原则
在用户空间中动态申请内存的函数为malloc (),这个函数在各种操作系统上的使用都是一致的,malloc ()申请的内存的释放函数为free()。对于Linux而言,C库的malloc ()函数一般通过brk ()和mmap ()两个系统调用从内核申请内存。由于用户空间C库的malloc算法实际上具备一个二次管理能力,所以并不是每次申请和释放内存都一定伴随着对内核的系统调用。如,应用程序可以从内核拿到内存后,立即调用free(),由于free()之前调用了mallopt(M_TRIM_THRESHOLD,一1)和mallopt (M_MMAP_MAX,0),这个free ()并不会把内存还给内核,而只是还给了C库的分配算法(内存仍然属于这个进程),因此之后所有的动态内存申请和释放都在用户态下进行。另外,Linux内核总是采用按需调页(Demand Paging),因此当malloc ()返回的时候,虽然是成功返回,但是内核并没有真正给这个进程内存,这个时候如果去读申请的内存,内容全部是0,这个页面的映射是只读的。只有当写到某个页面的时候,内核才在页错误后,真正把这个页面给这个进程。在Linux内核空间中申请内存涉及的函数主要包括kmalloc( ) 、get free pages ( )和vmalloc ()等。kmalloc ()和_get_free pages ()(及其类似函数)申请的内存位于DMA和常规区域的映射区,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。而vmalloc()在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc ()申请的虚拟内存和物理内存之间也没有简单的换算关系。
❷ Linux内核空间都有什么
linux内核是相对于用户空间来说的,用户空间即是应用程序运行的空间,这是一个抽象的概念,举个例子,用户是没办法直接操作计算机硬件的,比如你写一个hello world的程序,最后在显示器上打印出来,具体的过程是这样的,应用程序执行向内核空间发出申请,通过系统调用这个通道把要打印的消息告诉给内核,内核空间调度显示器打印hello,这期间涉及到进程调度,可能同一时间有多个应用程序要调用显示器,内核还有内存管理,硬件管理等各种功能。
❸ Linux内核有多大,不同Linux版本内核有什么差别呢
根据版本的不同,内核大小也不同,新版本为几百M。
1、发行版的不同,主要是对于版本的选择,稳定性的测试,还有错误修正补丁都会让每个发行版有自己特殊的内核。
2、官方内核的不同,这个区别很好说,官方的开发是基于 git 版本控制的,去看两个 git 版本就知道了。一般是硬件支持,还有新的功能算法,还有驱动增减,错误修补什么的。
Linux的内核版本编号有点像如下的样子:
2.6.32-642.el6.x86_64
主版本.次版本。发布版本-修改版本。
虽然编号就是如上的方式来编写,不过依据Linux内核的发展历程,内核版本的定义有点不太相同。
奇数、偶数版本分类:
在2.6x版本以前,托瓦斯将内核的发展方向分为两类,并根据这两类内核的发展分别给予不同的内核编号,那就是:
主、次版本为奇数:开发中版本。
如2.5.xx,这种内核版本主要用于测试与发展新功能,所以通常这种版本仅有内核开发工程师会使用。如果有新增的内核程序代码,会加到这种版本当中,等到很多工程师测试没问题后,才加入下一版本的稳定内核中;
主、次版本为偶数:稳定版本。
如2.6.xx,等到内核功能发展成熟后会加到这类版本中,主要用在一般家庭计算机以及企业版本中,重点在于提供一个用户相对稳定的Linux操作环境平台。
至于发布版本则是在主、次版本架构不变的情况下,新增的功能累积到一定程度后新发布的内核版本。而由于Linux 的内核是使用CPL的授权,因此大家都能够进行内核程序代码的修改。
因此,如果有针对一个版本的内核修改过的部分程序代码,那么这个被修改过的新内核版本就可以加上所谓的修改版本。
Linux内核版本与Linux发行版本。
Linux内核版本与发行版本的版本并不相同,因为所谓的Linux版本指的应该是内核版本,而目前最新的内核版本应该是4.7.2(2016/08)才对,并不会有7.x的版本出现。
(3)linux内核空间扩展阅读:
Linux内核的任务:
1、从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
2、从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。
3、内核是一个资源管理程序。负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
4、内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。
❹ Linux内核中如何申请和释放内存
申请内存:
void *kmalloc(size_t size, int flags)
kmalloc函数和malloc函数相似,它有两个参数,一个参数是size,即申请内存块的大小,这个参数比较简单,就像malloc中的参数一样。第二个参数是一个标志,在里面可以指定优先权之类的信息。在Linux中,有以下的一些优先权:
GFP_KERNEL,它的意思是该内存分配是由运行在内核模式的进程调用的,即当内存低于min_free_pages的时候可以让该进程进入睡眠;
GFP_ATOMIC,原子性的内存分配允许在实际内存低于min_free_pages时继续分配内存给进程。
GFP_DMA:此标志位需要和GFP_KERNEL、GFP_ATOMIC等一起使用,用来申请用于直接内存访问的内存页。
释放:
Kfree(const void *objp) const void *objp=为需要释放的内存空间指针
❺ linux内核与内核空间的关系
简单理解为:内核空间是内核使用,用户空间是应用程序使用;除非编译内核要考虑内核空间,其余情况都可以按照用户空间处理
❻ 什么是linux内核
Linux是由Linus Torvalds开发的类UNIX的操作系统,Linux主要特点是开源的,因此我们可以免费使用来当做服务器。
Linux严格分为两个含义。
1.广泛的Linux是指Linux发行版
2.狭义的Linux是指Linux内核
Linux内核是操作系统的基础,介于硬件和软件之间,并且内核位于操作系统中,操作系统将在硬件和软件之间进行调解,Linux内核是操作系统核心部分的功能。
二:内核的基本性能
1.流程管理
在Linux内核中,程序的执行状态以进程为单位进行管理。此外,内核为每个进程准备一个名为task_stract结构的数据结构。
2.进程调度程序
可执行状态等待哪个进程以哪个顺序执行,由于基本上不可能运行比CPU数量更多的进程,因此运行过程的效率非常重要。
3.内存管理
在Linux内核中,使用物理内存和虚拟内存管理数据。通过分配对应于物理存储器的虚拟地址,而不是实际为每个进程分配物理存储器地址,可以使用容量远大于实际物理存储器容量的存储器。它使它成为可能。此外,由于每个进程都分配了自己的虚拟地址,因此每个进程的内存空间是独立的,并且不会违反其他进程的内存。
3.文件系统
它以文件的形式提供存储数据的访问方法。所有数据都以文件的形式进行管理。/ Directory(根目录)作为顶点,内核本身作为文件和目录的集合存在。
❼ Linux的内核空间和用户空间是如何划分的(以32位系统为例)
通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。地址分配如下图所示
直接映射区:线性空间中从3G开始最大896M的区间,为直接内存映射区,该区域的线性地址和物理地址存在线性转换关系:线性地址=3G+物理地址。
动态内存映射区:该区域由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理空间不一定连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内存。
永久内存映射区:该区域可访问高端内存。访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域。
固定映射区:该区域和4G的顶端只有4k的隔离带,其每个地址项都服务于特定的用途,如ACPI_BASE等。
❽ linux为什么一定要把内核空间划分到高1G
Linux虚拟内存的大小为2^32(在32位的x86机器上),内核将这4G字节的空间分为两部分。最高的1G字节(从虚地址
0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到
0xBFFFFFFF),供各个进程使用,称为“用户空间”。因为每个进程可以通过系统调用进入内核,因此,Linux内核空间由系统内的所有进程共享。
于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存).
每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则为所有进程以及内核所共享。另外,进程的“用户空间”也叫“地址空间”,在后面的叙述中,我们对这两个术语不再区分。
用户空间不是进程共享的,而是进程隔离的。每个进程最大都可以有3GB的用户空间。一个进程对其中一个地址的访问,与其它进程对于同一地址的访问绝不冲
突。比如,一个进程从其用户空间的地址0x1234ABCD处可以读出整数8,而另外一个进程从其用户空间的地址0x1234ABCD处可以读出整数
20,这取决于进程自身的逻辑。
因此Linux对用户空间与内核空间的划分起到了一定程度上的冲突避免。
❾ LINUX内核空间与用户空间分别是什么意思
关于内核空间和用户空间,说的是linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G.Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为"内核空间".而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为"用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。
内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。
❿ Linux内核空间内存动态申请
在Linux内核空间中申请内存涉及的函数主要包括kmalloc () 、_get_free _pages ()和vmalloc(等。kmalloc()和_get_free pages ()(及其类似函数)申请的内存位于DMA和常规区域的映射区,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。而vmalloc()在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc ()申请的虚拟内存和物理内存之间也没有简单的换算关系。
1.kmalloc ( )
给kmalloc() 的第一个参数是要分配的块的大小;第二个参数为分配标志,用于控制kmalloc ()的行为。最常用的分配标志是GFP_KERNEL,其含义是在内核空间的进程中申请内存。kmalloc ()的底层依赖于_get_free pages ()来实现,分配标志的前缀GFP正好是这个底层函数的缩写。使用GFP_KERNEL标志申请内存时,若暂时不能满足,则进程会睡眠等待页,即会引起阻塞,因此不能在中断上下文或持有自旋锁的时候使用GFP_KERNE申请内存。由于在中断处理函数、tasklet和内核定时器等非进程上下文中不能阻塞,所以此时驱动应当使用GFP_ATOMIC标志来申请内存。当使用GFP_ATOMIC标志申请内存时,若不存在空闲页,则不等待,直接返回。
其他的申请标志还包括GFP_USER(用来为用户空间页分配内存,可能阻塞)、GFP_HIGHUSER(类似GFP_USER,但是它从高端内存分配)、GFP_DMA(从DMA区域分配内存)、GFP_NOIO(不允许任何IO初始化)、GFP_NOFS(不允许进行任何文件系统调用)、__GFP_ HIGHMEM(指示分配的内存可以位于高端内存)、__(GFP COLD(请求一个较长时间不访问的页)、_GFP_NOWARN(当一个分配无法满足时,阻止内核发出警告)、_GFP_HIGH(高优先级请求,允许获得被内核保留给紧急状况使用的最后的内存页)、GFP_REPEAT(分配失败,则尽力重复尝试)、_GFP_NOFAIL(标志只许申请成功,不推荐)和__GFPNORETRY(若申请不到,则立即放弃)等。
使用kmalloc()申请的内存应使用kfree()释放,这个函数的用法和用户空间的free()类似。
2._get_free_pages ()
_get_free pages ()系列函数/宏本质上是Linux内核最底层用于获取空闲内存的方法,因为底层的buddy算法以2n页为单位管理空闲内存,所以最底层的内存申请总是以2n页为单位的。
get_free _pages ()系列函数/宏包括get_zeroed _page () 、_get_free_page ()和get_free pages () 。
__get_free_pages(unsigned int flags, unsigned int order) 该函数可分配多个页并返回分配内存的首地址,分配的页数为2order,分配的页也不清零。order允许的最大值是10(即1024页)或者11(即2048页),这取决于具体的硬件平台。