一、获取内核源码

Linux内核官方网站为:http://www.kernel.org

或者使用git将源码clone下来(我这里使用的版本为2.6):

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

clone下来的源码目录结构如下: 

其中比较重要的目录的官方描述如下:

对应的中文描述如下:

二、编译安装(环境为腾讯云的CentOS7.6,x86)

1、安装所需依赖

#安装开发工具包组
yum -y groupinstall "development tools"
#make menuconfig 文本界面窗口依赖包
yum install -y ncurses-devel

2、升级GCC版本

由于centos7.6初始gcc版本为4.8.5,而编译内核需要的最低版本为5.1.0,所以需要安装高于5.1.0版本的gcc。

yum install centos-release-scl
yum install devtoolset-7-gcc*

设置devtoolset-7 为默认的gcc编译器 :

scl enable devtoolset-7 bash
source /opt/rh/devtoolset-7/enable

再用gcc -v指令查看gcc版本可以看到已经升级到7.3.1了: 

3、内核配置

查看当前内核版本:

配置内核: 

#进入到解压或者clone下来的源码目录
cd linux-2.6
#使用文本菜单的方式配置内核
make menuconfig

执行后会出现如下窗口,可以根据自己的需要选择适当的配置项,如果没有特别的需求,按默认值配置即可,配置程序结束将在源码主目录生成一个.config文件,用来保存这些配置。 这里我们按照默认值来做,直接save -> exit:

出来后使用ls -al发现目录下生成了一个.config隐藏文件:

 4、内核编译

执行make来编译内核,这一步会编译很久,大概三四小时左右。

#如果是多核的,可以用make -jn来加快编译速度,n为你系统的核数
make

执行完的结果如下图: 

5、安装模块

安装编译好的内核模块:

make modules_install

执行完的结果如下图:  

安装完毕后可以到/lib/modules目录下查看:

这里安装的内核变成了6.2.0+,这里我也不太清楚为啥,希望有大佬能解答一下。

6、安装内核

执行make install命令调用内核目录中的install.sh的shell脚本完成安装任务。 

make install

执行完的结果如下图:  

  

7、修改默认内核启动项

查看系统可用内核:

cat /boot/grub2/grub.cfg | grep menuentry

可以看到第一个就是我们编译安装好的内核:

修改开机默认使用的内核,其中下面代码中的新内核的值为menuentry后单引号的内容,即CentOS Linux (6.2.0+) 7 (Core):

grub2-set-default '新内核'

或者使用 grub2-set-default 0 设置默认使用的内核为第一个内核,因为新安装的内核默认排在第一位。

8、重启系统

reboot

使用uname -r指令查看当前内核版本,可以看到版本内核变成6.2.0+了:

 

三、内核开发的特点

1、内核编程时既不能访问C库也不能访问标准C头文件

       内核不能链接使用标准C函数库,对于内核来说,完整的C库太大而且太低效了。但你先别急,大部分常用的C库函数都在内核中得到了实现,比如string的实现位于lib/string.c中,只需要包含<linux/string.h>内核头文件,就可以使用。

2、没有内存保护机制

       内核编程时缺乏像用户空间那样的内存保护机制,如果一个用户程序试图进行一次非法的内存访问,内核就会发现这个错误,并结束整个进程。而当内核自己非法访问了内存,那么后果就很难控制了。此外,内核中的内存不分页,也就是说每用掉一个字节,物理内存就减少一个字节,所以往内核中加入新功能时需要仔细考虑。

3、不要轻易在内核中使用浮点数

       在用户空间的进程进行浮点数操作时,内核会完成从整数操作到浮点操作的模式转换,内核会先捕获陷阱(catch a trap),然后着手与操作模式的转变。与用户空间不同,内核本身没那么容易陷入(cannot easily trap itself)。所以最好不要在内核中使用浮点操作。

三、参考书籍

《Linux Kernel Development, 3rd Edition》

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐