Linux内核编译与模块编程

写在前面的话:
作为一个做完这个实验的软工狗.表示心里几经波澜 , 一招不慎可能全盘皆输,从头再来.
我也不多说什么,做过这个实验的人,我们相视一笑吧. :)
我把整个过程分享在下面,包括我碰到的问题, 以及怎么解决这些问题的. 希望对你有所帮助….谢谢

实验准备
- virtualBox虚拟机
- Ubuntu 系统(我用的是16.04LTS)

Linux内核下载

在官网上https://www.kernel.org/下载最新 版本的内核

Linux内核解压

在root模式下进行解压:
在终端输入 sudo su 回车
然后输入密码(没有*) ,直接输完就回车吧
然后就调到了root模式
把下载好的内核复制 /usr/src 文件夹中 : 在下载内核的路径下输入 cp linux-4.15.12.tar.xz /usr/src
然后解压:(是哪个命令解压去了,我忘了….)
内核解压到usr/src目录下了

空间不足

虚拟机扩容

解压完了之后,出现虚拟机硬盘空间不足……
所以下面先给虚拟机扩下容吧,如果硬盘空间够的话可以跳过了~~

1 在cmd下定位到VirtualBox的安装路径,然后输入 VBoxManage modifyhd

2 输入VBoxManage list hdds
然后可以得知映像的uuid

3 然后使用命令
VBoxManage modifyhd b4dfa481-854f-45c7-a54d-8 5a08f7c9204 –resize 40960
扩容到40G(40*1024 = 40960MB),则resize 40960

这个时候还没有完

通过 VBoxManager 工具对 vdi 进行扩容后, 你还得告诉 Ubuntu 你扩容了,让Ubuntu 重新扫描磁盘分区. 这就好比, 你买了个新的硬盘插入到电脑上, 你不对新的磁盘进行分区, 格式化, 并且让 windows磁盘管理器管理的话, 你插入的磁盘是不会被 windows 认可的, 也是不可用的.

4 Ubuntu中可用 sudo apt-get install gparted来安装gparted工具。工具是图形化界面的。安装好之后,输入命令sudo gparted即可打开界面。


5 然后依次删除/dev/sda5和/dev/sda2,删除后,就会剩下/dev/sda1(14GB)和未分配的(15GB),不然的话你怎么都无法将unallocated部分挂载。


6 接下来重新调整/dev/sda1的大小,我这里调整为30720(30GB),然后剩下10GB作为linux_swap,重新将未分配的10GB格式化,先new出一个extended的分区,然后再在这个extended的分区里new一个逻辑分区,并且file system选择为linux-swap,最后选择绿色的钩钩,完成保存。最后执行完后,如下图所示

7 大功告成! 撒花~

扫描二维码关注公众号,回复: 1754577 查看本文章

内核编译

这是关键的时刻了, 好好把握…
祝你一路顺风~~~~~

(1)安装基本的工具软件。

逐次在终端执行以下四条命令:

sudo apt-get install libncurses5-dev libssl-dev

sudo apt-get install build-essential openssl

sudo apt-get install zlibc minizip

sudo apt-get install libidn11-dev libidn11
如下图

(2)在终端进入你的解压的内核源码的目录,比如我内核源码解压后在usr/src/linux-4.15.12 ,那么进入终端后就是:

(3)
依次执行以下三条命令:

sudo make mrproper

sudo make clean

sudo make menuconfig

其中mrproper为清除编译过程中产生的所有中间文件,clean为清除上一次产生的编译中间文件,在menuconfig中出现选择的图形化界面后,直接按右方向键选择到exit退出,退出提示中选择保存,实现内核的默认配置。

4)执行命令:

sudo make –j8
因为我的笔记本cpu是i7双核核八线程,所以我直接用8个线程并行编译,这样编译速度就是普通的make命令的8倍。
参考博文:
https://www.cnblogs.com/acm-icpcer/p/8029656.html

swap分区与挂载

编译内核两次, 没有成功,第一次花了5个小时给了我一个internal错误.
第二次, 提示内存不够,Virtual memory exhausted……虚拟内存不够
百度了一下,
要swap分区
1 使用dd命令创建swapfile 的swap 交换文件(文件名和目录任意)
dd if=/dev/zero of=/var/swapfile bs=1024 count=2097152

2 执行完毕,对交换文件格式化并转换为swap分区
mkswap /var/swapfile
3 挂载并激活分区:
swap /var/swapfile
备注: 执行这个命令可能会出现:”不安全的权限0644,建议使用0600”,实际已经激活了,可以忽略提示
参考网址:
https://www.jianshu.com/pacd4cdb34e7

这个时候再执行make命令sudo make -j8.编译内核

这里没几个小时不行,当然性能好的电脑时间短点.所以这个时候看会电影或者和朋友出去玩一下,打个篮球什么的.
记得这次晚饭后开始编译,晚上22:30 半还没编译好…

第二天来看…..
恩,编译好了

(5)
1 执行命令:
sudo make modules_install

2 执行命令:sudo make install
好不容易install完了, 只剩最后sudo make install了, 觉得应该可以松口气了.
然而 提示硬盘空间又不足!!!!30GB 不够用? 我服了!

我的天.难道又要重来!

恩,得冷静一下.

那就现在增加硬盘空间吧 前面也写了:用gparted 图形界面来进行虚拟机的扩容

这不, 继续执行sudo make install.. 又跑起来了~~~~

下面就求上天保佑,不要再出差错了~
怀着忐忑的心情, 看着它慢慢的跑, 希望它不要调皮啊啊啊

done!!!!

到这里,基本上算是胜利了.
昨天晚上编译的时候, 电脑特地设置为不休眠不睡眠,
作为过来人 , 只想告诉你们,, 硬盘空间搞大点!

接着继续
重启reboot
安装shift不动:

本来觉得是胜利在望了.结果

出现 end of kernel, out of memory and no killable processes

(不截图, 这个时候心态崩了….没心思截图了….蓝瘦香菇—–)

傻了一段时间 计院的男子汉得坚强点!!!!!

网上百度了一下, 把内存调大一点就好了.

谢天谢地,总算成功了, scream!!!!!!!!!!!!
victory :)

通过uname -a

主机名:
jzt-virtualBox
内核版本:
4.15.12
编译时间:
2018年3月25日星期日 20:43

模块编程

相关知识补充:参考网址
https://www.linuxidc.com/Linux/2016-03/129476.htm

关于内核源码:
安装Ubuntu的时候是没有安装源码的 ,在/usr/src目录下只有两个包含内核的头文件的文件夹的.
然后再安装内核源码,也就是前面所做的.(下载内核源码->源码解压->编译源码->安装内核…)
Linux内核模块机制:
模块(Module)机制:用户可以根据需要,在不需要对内核重新编译的情况下,可以将模块动态载入或移出内核.
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行,它在运行时被链接到内核,作为内核的一部分在内核空间运行.
模块通常由一组函数和数据结构组成,用来实现一种文件系统,一个驱动程序或其他内核上层的功能.
内核模块是Linux内核向外提供的一个插口,其全称为动态可加载内核模块(Loader kernel Module ,LKM),简称为模块

hello.c文件

在终端可以通过 gedit hello.c 命令进行编辑
首先编辑 hello.c文件:

makefile

然后编辑makefile文件:

make 命令

加载模块命令

insmod hello.ko
这里写图片描述

查看模块命令

lsmod

删除模块命令

rmmod hello

写在后面的话:

本人也是os新手, 这个也算是实验作业, 查阅了相关资料,解决了其中出现的问题和错误. 有什么不对的地方,敬请指教. 其中参考的资料也给出了网址. 这个年代, 百度是最好的老师…
END

猜你喜欢

转载自blog.csdn.net/zimojiang/article/details/79704667