操作系统开发技术(Linux内核编译)-新系统调用设计实验

操作系统开发技术(Linux内核编译)-新系统调用设计实验

这确实是一个让人头疼的实验。好不容易在网络上找到一篇博客,写的非常好,我参照这篇博客进项操作,很成功。

首先把博客的地址分享出来:
http://blog.csdn.net/qq_34247099/article/details/50949720
接下来我进行一些简单的梳理与补充。


一、文件准备
ubuntu10.10 (32位)+ linux-2.6.32.71.tar.xz
原博客中分享了下载地址,为尊重版权,此处不再粘贴。
然后在Vmware中,新近ubuntu32位虚拟机,安装此系统。
建议安装Vmware Tools,方便将源码文件复制到虚拟机中。
放到桌面吧。


二、解压内核
cd desktop
注:中文版的执行:cd 桌面

xz -d linux-2.6.32.71.tar.xz
注:ubuntu10.10默认没有xz工具,请先在高版本的Linux虚拟机中将源码解压出来,然后将linux-2.6.32.71.tar复制进去。

tar -xvf  linux-2.6.32.71.tar
注:没有-z,只有xvf这3个参数。

sudo su
注:/usr目录的访问需要管理员权限,之后的一些操作,也是需要管理员权限的。

mv linux-2.6.32.71 /usr/src
注:将源码移动到/usr/src目录下,其实,只有make modules_install这一步是需要在/usr/src下的,为了方便就都在此目录下操作了。


三、增加系统调用
注:以下操作需要root权限。
1、打开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+1;
}
注:printk就是系统调用输出一行文字,你可以自定义里面内容,便于最终检验。number+1看效果比较容易。
另注:asmlinkage是一个已经存在的宏。
3、注册系统调用:
gedit /usr/src/linux-2.6.32.71/arch/x86/kernel/syscall_table_32.S
在.long 类型文件末尾添加:
.long sys_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

注:上面的操作都是针对源码的,下面这一步才开始影响到现在运行的系统。害怕出问题的话,可以提前备份了。这一步会在系统的/lib/modules下创建安装文件。现在可以先打开这个目录看看,运行完后再看看多了什么。
make modules_install

注:实际真正需要的,就是这个生成的bzImage文件,和上一步的modules。
cp /usr/src/linux-2.6.32.71/arch/i386/boot/bzImage /boot/vmlinuz-2.6.32.71-mykernel


五、更新开机引导
1.创建initrd文件
mkinitramfs -o /boot/initrd.img-2.6.32.71

2.更新grub引导表
gedit /boot/grub/grub.cfg
找到下面字段:
### BEGIN /etc/grub.d/10_linux ### 
       ……  
### END /etc/grub.d/10_linux ###
修改
linux /boot/vmlinuz-2.6.35-22-generic
initrd /boot/initrd.img-2.6.35-22-generic
为我们的内核与引导文件:
linux /boot/vmlinuz-2.6.32.71-mykernel
initrd /boot/initrd.img-2.6.32.71
这段文字中一共有2处,都修改。

3.修改initrd文件
cd /boot
cp initrd.img-2.6.32.71 initrd-2.6.32.71.old
depmod –a
注:depmod –a用于列举所有模块。
update-initramfs -k 2.6.32.71 –c

注:update-initramfs是一个单词。中共建的2.6.32.71就是make modules_install时,/lib/modules下新生成那个目录的名字。


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
mv initrd.img-2.6.32.71.new.gz initrd.img-2.6.32.71


六、重启
重启之前,看一下自己的系统版本:uname -a
重启:reboot
重启之后,再看一次:uname -a
成功的话,两次是不一样的。


七、测试
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a=syscall(337, 1);
printf("%d",a);
    return 0;
}

怎么编译运行就不用讲了,看到打印结果:2
就说明我们成功添加了系统调用。
再不放心的话,执行:dmesg –c
查看系统调用信息,会看到我们的printk那句话。

完成。
此处仅仅是抛砖引玉,实验指导书后面的更加复杂的要求,期待大家的探索。


--------------------------------------------------------------------------------


参考文章出处:

http://blog.csdn.net/qq_34247099/article/details/50949720



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值