一、实验前的准备:
二、解压内核
tar xvf linux-2.6.32.71.tar
三、增加系统调用
打开sys.c文件。
gedit /usr/src/linux-2.6.32.71/kernel/sys.c
2、
在文件末尾增加系统调用。
asmlinkage intsys_mycall(int number)
{
printk("My Student No. is XXXXX,and My Name is XXXXX*** !");
return number;
}
注:printk就是系统调用输出一行文字,你可以自定义里面内容,便于最终检验。3、
注册系统调用:
gedit /usr/src/linux-2.6.32.71/arch/x86/kernel/syscall_table_32.S
在.long 类型文件末尾添加:
.longsys_mycall
并且按照顺序记住它属于第几个系统调用,在本机中为337。
4、gedit /usr/src/linux-2.6.32.71/arch/x86/include/asm/unistd_32.h
在一系列#define __NR_之后添加:
# define __NR_mycall 337
在这里就需要用到之前记住的数字了。
四、编译内核
进入解压目录:
cd /usr/src/linux-2.6.32.71
make mrproper
make clean
make oldconfig
make bzImage (这个过程和下面的过程非常非常非常长,亲测,建议泡杯茶,或是看个电影,没有两个小时不行)
make modules
make modules_install
五、拷贝内核
cp /usr/src/linux-2.6.32.71/arch/i386/boot/bzImage /boot/vmlinuz-2.6.32.71-mykernel
六、创建initrd文件
mkinitramfs-o /boot/initrd.img-2.6.32.71
七、更新grub引导表
gedit /boot/grub/grub.cfg
但必须在同一个
### BEGIN /etc/grub.d/10_linux ###
……
### END /etc/grub.d/10_linux ###
里面:
recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set 0efd72ba-ba85-470f-8c21-ab68730ca8c9
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=0efd72ba-ba85-470f-8c21-ab68730ca8c9 ro quiet splash
initrd /boot/initrd.img-2.6.35-22-generic
}
menuentry 'Ubuntu, with Linux 2.6.35-22-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set 0efd72ba-ba85-470f-8c21-ab68730ca8c9
echo 'Loading Linux 2.6.35-22-generic ...'
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=0efd72ba-ba85-470f-8c21-ab68730ca8c9 ro single
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-2.6.35-22-generic
}
八、收尾工作
cd /boot
cp initrd.img-2.6.32.71 initrd-2.6.32.71.old
depmod–a
update-initramfs-k 2.6.32.71 –c
cd /tmp
gzip-dc /boot/initrd.img-2.6.32.71| cpio –id
touch lib/modules/2.6.32.71/modules.dep
find./ | cpio -H newc -o > /boot/initrd.img-2.6.32.71.new
gzip /boot/initrd.img-2.6.32.71.new
cd /boot
mvinitrd.img-2.6.32.71.new.gz initrd.img-2.6.32.71
九、重启
linux-2.6.32.71,说明已经成功!
如下:
若是看到这个,你就可以大叫一声庆祝一下了,你已经成功啦!!!!
十、测试自定义系统调用
打开终端,键入gedit,打开gedit工具,继续键入如下代码:
#include<stdio.h>
int main()
{
syscall(337, 1);
return 0;
}
保存为mytest.c
再继续在终端中键入
gcc-o mytest mytest.c(编译C程序)
之后 ./mytest 。
点击运行编译出来的程序,此时并不会显示出效果,在终端中键入dmesg –c查看系统调用信息。
此时,你可以看到