实验原理:
内核:内核是整个操作系统的最底层,它负责了整个硬件的驱动以及提供了各种系统所需的内核功能,包括防火墙机制,是否支持LVM或Quota文件系统,以及进程和内存管理和通信功能。其实内核就是系统上面的一个文件而已,它包含了驱动主机各项硬件的检测程序与驱动模块。内核文件通常被放置在/boot/vmlinuz中。(uname –r 命令:显示内核版本信息)
内核模块:由于现在硬件更新速度太快,如果我的内核比较旧,我换了新的硬件,内核肯定无法支持,怎么办?重新拿一个新的内核来处理吗?内核编译的过程是很麻烦的。为了这个缘故,Linux很早之前就已经开始使用所谓的模块化设置了。即将一些不常用的类似驱动程序的内容独立出内核,编译成为模块,然后,内核可以在正常运行的过程当中加载这个模块到内核。这样,在不需要改动内核的前提之下,只要编译出适当的内核模块并加载它,Linux就可以使用新的硬件。模块被放置在/lib/modules/$(uname -r)/kernel中。
内核编译:内核其实是一个文件,由源代码编译而成的,开机读完BIOS并加载MBR内的引导程序后,就开始加载内核到内存当中,所以要将它编译成系统可以认识的数据才行。
实验目的:
通过实验,熟悉Linux 操作系统的使用,掌握构建与启动Linux 内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。
实验过程:
一、首先下载linux-4.10.14.tar(一开始我用的是linux-2.6.33.3.tar经历过七八个小时的各种改错,各种版本不匹配,最后选择换版本,这是一个让人崩溃的过程)
二、然后,共享文件到虚拟机上。
三、解压文件tar -xvf linux-4.10.14.tar.xz
四、然后开始对增加的系统调用添加相关内容
# vim kernel/sys.c ,加入下面的函数
asmlinkage int sys_helloworld(int number) // 该函数名中有下划线
{
printk("hello,world\n"); //printk()函数是系统内核的输出函数,区别 //于printf()。
return number;
}
五、添加系统调用号
vim ./arch/x86/entry/syscalls/syscall_64.tbl(32位系统是syscall_32.tbl)
将第223行改成如图所示
六、修改系统调用表,注册系统调用。
#vim include/linux/syscalls.h
增加一行 asm int sys_helloworld(int number);
七、
第一步到第四步都是在/usr/src/linux-4.10.14 目录下运行。先跳转到该目录下。
第一步:make mrproper 清除内核中不稳定的目标文件,附属文件及内核配置文件
第二步:make clean 清除以前生成的目标文件和其他文件
第三步:make menuconfig 配置内核,采用默认的内核配置即可。(选择exit)
这里会报错,原因是缺少东西,执行一下命令之后重新执行即可。
sudo apt-get install libncurses5-dev
第四步:sudo make ( 该命令等价于make bzImage编译内核 +make modules编译内核模块)
这是一个漫长的过程,基本上很多人都是等了两个半小时左右,因为我分配了1g内存,单核。跑了三个小时。
进入linux-4.10.14系统
以上设置成功,下一步就是进入内核系统。重启电脑,过程中不断按住shift。
出现一下界面
选择ubuntu高级选项回车,进入如下界面
选中如图所示版本,回车
进入系统
写入以下代码:
编译运行运行:
# gcc test.c –o test
# ./test
# dmesg –c