4.14 linux
2018-08-25 20:16:54 cui841923894 阅读数 370

源于https://kernelnewbies.org/Linux_4.14

1.支持更大的内存
原始x86-64平台受限于4级分页的限制,最大支持256TiB的虚拟地址空间和64TiB的物理地址空间。现在我们已经碰到了这个限制:一些供应商现在开始提供64TiB内存的服务器。因此内核x86平台支持5级分页,突破了128PiB虚拟地址空间和4PiB物理地址空间的限制,This “ought to be enough for anybody”。
详情:https://lwn.net/Articles/717293/

2.添加AMD安全内存加密功能
安全内存加密技术可以通过页表将内存页加密。标记为加密的内存页面在从DRAM读取时会自动解密,并在写入DRAM时自动加密。因此,安全内存加密技术可用于保护DRAM的物理内容免受来自系统的攻击。
详情:https://lwn.net/Articles/686808/#sme

3.ORC unwinder更好地内核跟踪器
“unwinder“,指打印已经执行的函数列表(栈信息,调用图,调用栈)。内核虽然有一个unwinder并且运行良好,但是它一般都不可靠,会导致功能问题。同时它还需要”frame pointers“(CONFIG_FRAME_POINTERS)来打印完整的调用栈,这使得GCC向内核每个函数添加检测代码,内核可执行代码大小增加约3.2%。并且在工作负载比较大的情况下会降低内核的性能。
相比之下,ORC unwinder不需要任何地方插入代码,因此不会影响内核运行性能。
详情:
https://lwn.net/Articles/728339/
http://www.codeblueprint.co.uk/2017/07/31/the-orc-unwinder.html

4.Btrfs和Squashfs支持zstd压缩方式
zstd压缩方式在压缩速度和质量之前有更好的表现,它接近lz4的压缩速度,并且质量接近lzma。zstd解压缩的速度是zlib的两倍以上。
详情:https://github.com/facebook/zstd

5.未来GPU的异构内存管理 (https://lwn.net/Articles/684916/

6.支持异步缓冲I/O
此版本中preadv2(2)加入RWF_NONBLOCK标志,允许用户空间应用程序绕过线程池的队列操作,从而缓解缓冲I/O的阻塞。

7.增强SMP和cpufreq之间协调
在Linux中,任务调度事件通知到cpufreq子系统,cpufreq可以在任务需要时增加频率,并实现良好的交互性。但是,当调度发生在不同的CPU时,不会调用到cpufreq,例如在另一个CPU中创建新进程时。此版本使任务调度可以通知到远程CPU的cpufreq子系统。
详情:https://lwn.net/Articles/732740/

8.CGroup支持线程模式
此版本中,cgroup v2支持线程模式,以支持某些进程的线程需要跨组分发资源。默认情况下,进程的所有线程都属于同一个cgroup,该cgroup看做管理资源的资源域。但线程模式允许线程分布在子树的同时仍然共享资源。
详情:https://lwn.net/Articles/729215/
这里写图片描述

2019-07-06 14:20:19 natty715 阅读数 68

软件环境:vivado 2017.4        硬件平台:XC7Z020        系统及补丁版本:Debian 9 - patch 4.14


首先一定一定一定要明确,通常所说的Linux系统,是非实时的操作系统。那么,与此相对,什么是实时操作系统,什么又是非实时操作系统,两者之间的差别是啥。在我看来,最主要的差别感觉应该算是内核中进程调度的抢占与非抢占式。好嘛,那啥子又是抢占,啥子又是非抢占,且听我细细哔哔。举个栗子,如果对于一个系统,IO设备在任意时刻发生中断,CPU都会停止当下正在执行的进程,保护现场,然后转入中断处理函数,如果在执行当前中断处理程序中,又有高优先级中断进来,依旧能够停止当下进程,保护现场,转入中断处理函数,那么当前系统就可被看作是可抢占式的实时操作系统,因为中断的处理和进程的切换,都能够在确定的时间内完成。那非实时呢?首先想到的词应该是时间片轮转调度,排队,来中断了?搁队列后面等着,到你的时间片了再处理你,什么?等五年了?等五年了也得等着。

再哔哔下RTLinux到底是个啥,跟Linux差别在哪,我这里说的都很简单,想深挖的朋友可以CSDN搜一搜,货很多。

通常的Linux是没有上图中的实时内核和RT进程这两个框的,RTLinux中,通过多的这一层实时内核,全面接管外部硬件中断,并把原本的Linux内核,作为实时内核的一个低优先级的进程,当有实时任务需要处理时,通过实时内核调度RT进程完成,无实时任务时,运行优先级较低的Linux非实时进程。


接下来说下具体怎么搞,首先需要确定自己内核的版本,进入kernel以后make menuconfig最顶上就能看见当前内核版本,依次进入processor type and features -> preemption model可以看到,当前没有RT配置选项。如果你用不了make menuconfig命令,调出控制台,sudo apt-get install libncurses-dev。

在下方网址下载对应自己内核版本的补丁,如果找不到,就在older路径下面找。

https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/

补丁下载好后,放在跟自己内核一个路径的文件夹下。

 然后调出控制台,依次进行如下操作。

不对,你先别急,先别急着操作,我在这里要着重用红字哔哔几句,这里有个大坑,在给内核打补丁之前一定切记切记切记,把内核的配置文件.config先单独保存出来,最好连内核也备份一份出来,以便打补丁遇到疑难杂症的时候好恢复回去,.config单独备份出来是有重要原因的,因为补丁打完了以后.config会被改的面目全非,直接编译内核各种报错加启动不起来,最好的做法是.config单独保存,然后再给内核打补丁,补丁打完了以后,把单独保存的.config再覆盖回去,这样就是打过补丁的原配置了,最起码能保证编译正确,然后再在新内核修改RTLinux的配置项。

好叻,继续看打补丁进行的操作。

cd kernel
gzip -cd ../patch-4.14-rt1.patch.gz | patch -p1 --verbose

其中p后面的参数通常有p0和p1,p0意思是不忽略目录,从当前目录开始打补丁,p1是忽略第一层目录,因为我们要进入内核目录打补丁,所以使用p1参数。补丁打完以后如下图所示。

此时,在kernel里make menuconfig, 进入processor type and features -> preemption model可以看到,有关RTLinux的配置项就出来啦,说明补丁包打的目前基本没什么问题。

kernel配置修改完毕以后,做系统这些就不多说了吧,各人有各人的做法, 先看下没打补丁之前,系统启动以后用uname -a看当前操作系统内核信息如下。

打了补丁以后,系统启动uname -a再看看系统内核信息,可以看到内核有RT标识了。 

但是这也仅仅只是标识上面多了个RT而已吗?究竟性能上有没有实际差异呢?继续往下看。


 这里就要说下测试工具了,cyclictest,两种方式得到,一种是控制台里用git命令

git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git

cd rt-tests
 
git checkout stable/v1.0

另一种是直接去网页里面下,网页下面还有很多其他版本的,这里我用的是v1.0版的。

 https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git/

下载解压以后,进入rt-test-1.0,如果你跟我一样要测zynq平台的话,别直接make直接make的用不了,要改一下makefile文件。

把默认的CC和AR修改成你给zynq用的编译工具的CC和AR,也就是arm-linux-gnueabihf-路径。 修改后如下图。

接下来再make,搞定以后,把生成的cyclictest拖到zynq上。

输入测试命令./cyclictest -p 80 -t5 -n,设置线程优先级为80,开启5个线程,循环输出。

对测试结果做如下说明,第一个红框,内核非RT的增强版本。第二个红款,先说下T、P、C等字母含义。

T: 线程号      P: 线程优先级   

C: 计数器,线程的时间间隔每达到一次,计数器加1   

I: 1000 时间间隔为1000微秒(us)

Min: 最小延时(us)     Act: 最近一次的延时(us)   

 Avg:平均延时(us)     Max: 最大延时(us)

所以可以看出,非RT下,0线程测试6万8千次时,出现了6万次时最大值延迟6798 us,接下来看看RT核跑的情况。
 

 RT核下,同样是0线程,跑68万次,这个结果已经很可以说明问题了吧。

2018-01-23 15:34:02 mrzhouxiaofei 阅读数 3152

编译之前

引入

最近在学习 Linux,看到介绍内核,就想着自己编译一下内核,虽然不会搞硬件开发,不会写底层的东西,但还是想看一下编译的整个过程。想着就开始弄,没想到中间还是有很多坑的,尤其是编译之前,选择配置这一部分,配置项太多了,因为只是想看编译的整个过程,所以就没有深究每一个配置项。整个过程比较长,特此记录,避免以后再次踩坑。

环境

开始之前,先介绍一下编译环境。直接在自己常用的 Linux 主机上编译,中间肯定会出现问题,最后可能导致系统崩溃,别不信,我已经吃过几次亏了,所以这次选择在虚拟机软件 VMware Workstation 上安装 Linux 虚拟机进行编译安装。

虚拟机软件:VMware Workstation 14           
Liunx 发行版:CentOS 7 内置内核 linux 3.10.0
待编译内核:linux 4.14.14

开始编译之前,先把几项准备工作完成。

  1. 去 Linux 内核官网 www.kernel.org 下载 Linux 内核文件,选择稳定版(stable),文件名为 linux-4.14.14.tar.xz,去 CentOS 官网 www.centos.org 下载最新的 CentOS 7。

  2. 把 CentOS 在 VMware 里装好,安装过程不在赘述,网上一大堆。这里提醒一句,分给 CentOS 的硬盘空间不要太小,不然内核编译之后,空间可能不够。我第一次编译时,就是因为分的太小了,/ 目录装完系统之后只剩 6G 多,编译一个多小时,提示空间不足,编译失败,最后不得不重装系统,又耽误了时间。

  3. 此外,做好宿主机和虚拟机之间文件夹的共享,保证虚拟机可以读取宿主机里下载好的 Linux 内核文件,挂载可以实现,这个不会可以搜一下。

准备工作完成,下面正式开始编译内核,请做好踩坑的准备。

正文

开始之前呢,还要啰嗦几句,我先把安装的大致过程说一下,避免做到某一步时,只是在重复,却不知道在做什么。

编译安装大致分为以下几步:

  1. 解压内核
  2. 编译前,选择配置项,生成 config 文件
  3. 编译内核
  4. 安装模块,安装内核
  5. 更新引导文件

解压内核

先把内核文件放在上面提到的宿主机和虚拟机之间的共享文件夹,我的宿主机共享文件夹是 share,挂载到了 CentOS 的 /mnt/hgfs/share/ 目录下。

切换到 root 权限,将内核文件解压到指定目录,这个目录是没有限定的,哪个都行,这里放到了 /usr/src/ 目录下,这个也是 CentOS 内核所在的目录,后缀 .tar.xz 的文件可以使用下面的命令解压。

tar xvJf linux-4.14.14.tar.xz -C /usr/src/

这里写图片描述

内核解压之后,每个文件夹内包含的是什么代码,可以自行搜索了解一下。

配置项

重点来了,解压之后,编译之前要先生成 config 配置文件。这个文件是干什么的呢?它是编译时的必备文件,指明了所有的配置项,编译时就是根据你选择的配置项来定制内核的。在你的 CentOS 内同样有这样一个配置文件,在 /boot/ 目录下有一个 config 开头的文件,就是它,你可以先 cat 一下,会发现都是键值对,所有的配置项都在这。

配置项非常多,可以随心所欲的定制内核,把不需要的全部关闭,当然也不是随心所欲,某些配置项是必须要选的,否则可能连系统也启动不了。

选择配置项的方式有以下几种,当然它们的目的都是为了生成 config 文件,所以选择哪种都可以。

make config (基于文本的配置界面)
make menuconfig (基于文本菜单的配置界面)
make xconfig (基于图形窗口的配置界面)
make oldconfig (基于原来内核配置的基础上修改)

以上几种,make xconfig 最为友好,基于窗口操作,但是需要 Xwindow 的支持,CentOS 还好,若是使用其它没有图形界面的发行版就 GG 了。make menuconfig 相对比较友好,又是基于文本菜单,所有的发行版都可以使用,所以这里推荐使用 make menuconfig。

使用 make menuconfig 需要 ncurses-devel 的支持,如果之前没装过,需要执行下面的命令安装一下。

yum install ncurses-devel

执行 make menuconfig,开始选择配置项

make menuconfig

这里写图片描述

如果执行没有错误的话,会出现下面这个页面

这里写图片描述

Linux 内核所有的配置项都在这里,我第一次看到时,我去,这也太多了吧,这什么时候能看完。

为了选择配置项,又开始搜配置项的意思,看了几个比较大的之后,比如基本配置、网络、文件系统等等,就没再看了。我开始是为了看整个编译过程,研究每一配置项,没有太大的意义,并且不同的 CPU 架构,所能配置的配置项也是不一样的。网上有人解释了每个配置项的意义,可能不是最新的内核,感兴趣的可以研究一下 Linux 内核配置选项简介-金步国

内核的编译分为两个部分,核心和模块,对于核心的部分,要编译进核心,可能以后会用到的部分,尽量编译成模块。

文本菜单选择界面,使用左(←)、右(→)箭头切换底部菜单,上(↑)、下(↓)箭头切换中间的配置项,空格键 选择配置项,部分配置项右边有 —> 标识,代表有下级子项,可以使用 Enter 进去选择。

同时每一项的前面都有以下标识,可以根据需要选择。

<*>[*]  表示编译进核心
<M>     表示编译成模块
空格    表示不选中此项

当然,如果你只是看一下整个编译过程,不想深究每一项,执行上一步 make menuconfig 之后,直接保存退出就可以了,它会使用 CentOS 内部的配置文件作为这次编译的配置文件,不知道 CentOS 内部配置文件在哪的,自己往前翻。

保存退出之后的效果如下图

这里写图片描述

编译

配置项选完,config 配置文件生成之后,就可以开始编译了,编译需要 elfutils-libelf-devel 的支持,先执行下面的命令安装一下。

yum install elfutils-libelf-devel

内核的编译,执行 make 即可开始编译。

make

若编译过程中提示 致命错误:openssl/opensslv.h:没有那个文件或目录 ,请执行下面的命令安装一下依赖。

yum install openssl-devel

编译时间比较长,如果上面你是自定义配置项,把不需要的配置都关闭,编译会快的多。我这使用的 CentOS 内部的配置文件,CentOS 为了大多数人的使用,开的配置项比较多,所以编译的时间比较长,当然,也和你的电脑配置有关。我记了一下时间,这一部分的编译用了两个半小时,所以请耐心等待,可以去喝个咖啡。

安装

经过了漫长的等待,终于编译完成,现在可以开始安装了。上面配置项有的编译进核心,有的编译成模块,所以安装也分为两个部分,模块安装和核心安装。

执行 make modules_install 开始安装模块

make modules_install

等待完成,执行 make install 开始安装核心

make install

执行完成之后,就可以在 /boot/ 目录下看到新编译的内核了。

这里写图片描述

更新引导

到现在为止,离成功就差一步更新引导了。可以直接去修改 /boot/grub2/grub.cfg 文件来更新引导,但是非常不建议这样去做。

推荐使用 grub2-mkconfig 来更新引导文件,下面的命令会根据 /boot/ 目录下的内核文件自动更新 grub 文件。

grub2-mkconfig -o /boot/grub2/grub.cfg

这里写图片描述

执行完之后,下次启动系统的时候就可以选择我们编译的内核了。如果想修改默认的启动内核,可以通过修改 /etc/default/grub 文件来实现。

重启系统,如果看到两个内核,说明已经成功了,你可以自由的选择哪个内核。

这里写图片描述

至此,内核的编译安装就全部结束了,整个过程中,如果出现什么问题,根据报错信息就可以解决了。最后再啰嗦几句,说说这次编译。

总结

用 Linux 系统也很久了,没去研究过内核,只是知道而已,就是突然心血来潮想要编译一下 Linux 内核,就去搞了,一个简单的编译,还是遇到了不少坑。首先,第一次编译时,CentOS 分区给的太小,导致内核编译了一个多小时后停了下来,一看,好嘛,空间已经用完了。马上删了虚拟机,又重装,这次分了 50G,应该不会出现这个问题了。选择配置项的时候,又研究了一上午,一直在看每个配置项什么意思,总是想把每一项弄明白,看了一部分后,感觉工作量太大了,而且背离了初衷,然后就不看了,直接跳过去了。后面的过程就比较快,一气呵成。比较不足的还是没有定义自己的配置项,把自己编译最大的好处隔过去了,以后需要了再去搞吧,编译应该能节省不少时间。来来回回整了两天,虽然东西不太多,我感觉还是有点意义的。

本文原始链接:CentOS 7 下编译安装 Linux 4.14 内核

没有更多推荐了,返回首页