转载:http://www.cnblogs.com/kenjones/archive/2011/03/09/1978611.html

ubuntu 10.10 添加系统调用的方法

http://lxr.free-electrons.com/ident?v=2.6.35;i=sys_read //c查看内核源码,老外的网,有个国内的类似网垃圾啊

主要参考以下文章

向linux内核中添加三个系统调用(Ubuntu9.10) - 耕耘--IT - 博客园     
内核编译的过程(网上收集) - 小楠楠 - 博客大巴     
编译内核(2.6.11)_儒雅_百度空间     
向Linux内核添加系统调用函数_百度文库     
Ubuntu 10.04 编译安装最新版本Linux-2.6.34内核【转】 - - JavaEye技术网站     
    
一般来说都是按照第一篇文章来的,但是中途会遇到几个问题
从头开始讲,分配给ubuntu的空间最好有18G以上,否则会在编译内核时出现空间不足

我在include/linux/syscalls.h中找到了它的声明asmlinkage long sys_read(unsigned int fd, char __user *buf, size_t count);

终于找到了,在这呢.
syscalls.h

#define
 SYSCALL_DEFINEx(x, name, ...)                    /

asmlinkage
long
 sys##name(__SC_DECL##x(__VA_ARGS__))

arch/x86/include/asm/unistd_32.h
#define _NR_read 3

read_write.c
SYSCALL_DEFINE3(read, unsigned int , fd, char __user * , buf, size_t, count)
{
     struct file * file;
     ssize_t ret = - EBADF;
     int fput_needed;
     file = fget_light(fd, & fput_needed);
     if (file)
         {
            loff_t pos = file_pos_read(file);
           ret = vfs_read(file, buf, count, & pos);
           file_pos_write(file, pos);
            fput_light(file, fput_needed);
       }
    return ret;
}

首先在终端执行     
sudo apt-get install nautilus-open-terminal
sudo apt-get install nautilus-gksu     
然后就可以右键在终端打开和右键以管理员打开文件了,如果习惯用终端打开文件的话也可以跳过这一步

同时建议使用VMWare的童鞋安装VMWare tools以便在宿主机与虚拟机之间复制数据

中途如果出现以下错误

greb: /boot/config-XX.XX.XX : no such file or directory

请无视,没什么影响

进行下面的操作前可以先执行sudo su 获取权限
    
1、下载内核     
apt-get install linux-source     
我下载到的内核文件是linux-source-2.6.35.tar.bz2,在/usr/src下
    
2、解压内核     
cd /usr/src
tar -jxvf linux-source-2.6.35.tar.bz2     
将内核解压到/usr/src
    
3、修改文件     
a)/usr/src/linux-source-2.6.35/kernel/sys.c     
可以用右键管理员打开或者
gedit /usr/src/linux-source-2.6.35/kernel/sys.c

然后简单起见按照第一篇文章的函数修改sys.c文件
在文件最后添加
asmlinkage int sys_mycall(int number)
{
 printk("这是我添加的第一个系统调用");
 return number;
}
asmlinkage int sys_addtotal(int number)
{
 int i=0,enddate=0;
 printk("这是我添加的第二个系统调用");
 while(i<=number)
  enddate+=i++;
 return enddate;
}
asmlinkage int sys_three()
{
 printk("这是我添加的第三个系统调用");
 return 0;
}
                                     
b)
/usr/src/linux-source-2.6.35/arch/x86/kernel/syscall_table_32.S     
可以用右键管理员打开或者
gedit /usr/src/linux-source-2.6.35/arch/x86/kernel/syscall_table_32.S
        
然后在一列 .long sys_XXXX的下一行添加
.long sys_mycall
.long sys_addtotal
.long sys_three
并记住 他们分别是第几个 .long sys_XXXX
                     
c)/usr/src/linux-
source -2.6.35/arch/x86/include/asm/unistd_32.h         
可以用右键管理员打开或者
gedit /usr/src/linux- source -2.6.35/arch/x86/include/asm/unistd_32.h
                     
在一列#define __NR_XXXX NNN后添加几行         
#define __NR_mycall 338
#define __NR_addtotal 339
#define __NR_three 340
注意后面那个数字是接着上面那几行下来的
            
d)/usr/src/ linux- source -2.6.35 /ubuntu/omnibook/Makefile
这个是教程里面没有的,不一定要改,如果在后面编译模块时出现

ld: /ubuntu/omnibook/sections.lds: No such file: No such file or directory
make[2]: *** [ubuntu/omnibook/omnibook.o] Error 1
make[1]: *** [ubuntu/omnibook] Error 2
make: *** [ubuntu] Error 2
以上错误,则需要修改,不过我建议还是先改了再说
    
可以用右键管理员打开或者        
gedit / usr/src/ linux- source -2.6.35 /ubuntu/omnibook/Makefile
                     
找到下面两行
#EXTRA_LDFLAGS +=  $(src)/sections.lds
EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds
                
调换一下‘#’的位置,如下                 
EXTRA_LDFLAGS +=  $(src)/sections.lds
#EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds     
    
4、编译内核     
这里也是按照教程,首先进入解压目录

cd /usr/src/linux-source-2.6.35

a)make mrproper //清除内核中不稳定的目标文件,附属文件及内核配置文件
b)make clean //清除以前生成的目标文件和其他文件
c)make oldconfig // 采用默认的内核配置,如果这里出现选项,选择默认的选项,就是方括号内的第一个字母,不过我这里没出现选项
d)make bzImage //编译内核,大概需要半小时
e)make modules //编译模块,大概需要两小时,如果出现错误,看看是不是因为上面的第3步的d)没做
f)make modules_install // 安装模块,比较快
    
5、复制内核     
首先查看一下编译好的内核版本,以便命名
打开 /lib/modules
里面应该多了一个纯数字不带"generic"的文件夹,那就是新内核版本号,我的是2.6.35.11
然后复制内核
cp /usr/src/linux-source-2.6.35/arch/i386/boot/bzImage /boot/vmlinuz-2.6.35.11-mykernel
            
6、 创建 initrd文件
在创建之前先安装必要的程序
apt-get install bootcd-mkinitramfs
mkinitramfs -o /boot/initrd.img-2.6.35.11
耐心等待创建完成
            
7、 更新配置GRUB引导列表     
可以用右键管理员打开/boot/grub/grub.cfg 或者
gedit /boot/grub/grub.cfg     
找到下面这种结构
menuentry 'Ubuntu, with Linux 2.6.35-27-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd1,msdos1)'
    search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2
    linux    /boot/vmlinuz-2.6.35-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro   quiet splash
    initrd    /boot/initrd.img-2.6.35-27-generic
}
menuentry 'Ubuntu, with Linux 2.6.35-27-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd1,msdos1)'
    search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2
    echo    'Loading Linux 2.6.35-27-generic ...'
    linux    /boot/vmlinuz-2.6.35-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro single
    echo    'Loading initial ramdisk ...'
    initrd    /boot/initrd.img-2.6.35-27-generic
}     
复制一份在这些结构前粘贴,注意必须贴在

### BEGIN /etc/ grub.d/10_linux ###

……

### END /etc/grub.d/10_linux ###

里面,并将粘贴出来的结构中的
linux    /boot/vmlinuz-2.6.35-27-generic     
initrd    /boot/initrd.img-2.6.35-27-generic
改成你的内核文件地址和initrd文件地址
linux    /boot/vmlinuz-2.6.35.11-mykernel     
initrd    /boot/initrd.img-2.6.35.11     
最好把其他所有版本相关信息号改成2.6.35.11(新编译的版本号),以便在Grub菜单选择

比如改成

menuentry 'Ubuntu, with Linux 2.6.35.11' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd1,msdos1)'
    search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2
    linux    /boot/vmlinuz-2.6.35.11- mykernel root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro   quiet splash
    initrd    /boot/initrd.img-2.6.35.11
}
menuentry 'Ubuntu, with Linux 2.6.35.11 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd1,msdos1)'
    search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2
    echo    'Loading Linux 2.6.35.11 ...'
    linux    /boot/vmlinuz-2.6.35.11-mykernel root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro single
    echo    'Loading initial ramdisk ...'
    initrd    /boot/initrd.img-2.6.35.11
}

注意检查一下/boot/目录下是否存在上面这两个文件,如果没有,证明上面的几部还没成功

还有就是这些menuentry的顺序,有些系统启动引导时会直接进入第一个 menuentry,如果第一个 menuentry不是你想进的内核,则需要在开机时按Shift进入GRUB引导菜单选择内核。如果你的系统开机是直接打开GRUB引导菜单,则无所谓,选择你想进的内核就行

8、最后的一点工作     
到这里就差不多了,但是如果你现在就重启很可能会出错
warning:can't open directory /lib/modules/2.6.35/modules.dep
如果按照第一篇文章所说的执行update-grub2,重启后极有可能出现kernel panic
实际上不用执行这个命令
    
继续在终端执行以下命令(参考最后一篇文章)
cd /boot
cp initrd.img-2.6.35.11 initrd-2.6.35.11.old     
以上是备份initrid,下面是修改
depmod -a
update-initramfs -k 2.6.35.11 -c
cd /tmp
gzip -dc /boot/initrd.img-2.6.35.11| cpio -id
touch lib/modules/2.6.35.11/modules.dep
find ./ | cpio -H newc -o > /boot/initrd.img-2.6.35.11.new
gzip /boot/initrd.img-2.6.35.11.new
cd /boot
mv initrd.img-2.6.35.11.new.gz initrd.img-2.6.35.11     
    
9、重启     
重启ubuntu,如果能进入系统,证明基本上没问题了。
打开终端输入
uname -a     
查看版本号,如果是2.6.35.11就可以安心了
    
10、检查系统调用     
打开编译器,新建工程来测试
在main函数中使用syscall(函数号,参数)测试系统调用
比如
syscall(338,1);
syscall(339,10);
syscall(340);
编译运行, 然后打开终端输入
dmesg -c
查看是否有添加系统调用成功信息
                    
完成,反正我是成功了,但是不能保证你也成功喔
不行再说吧

添加系统调用的方法,2.6.35(没有测试)相关推荐

  1. ubuntu 10.10 添加系统调用的方法

    主要参考以下文章 向linux内核中添加三个系统调用(Ubuntu9.10) - 耕耘--IT - 博客园     内核编译的过程(网上收集) - 小楠楠 - 博客大巴     编译内核(2.6.11 ...

  2. Linux 系统调用(二)——使用内核模块添加系统调用(无需编译内核)

    本文将介绍Linux使用内核模块添加系统调用的方法(无需编译内核),思路就是修改映射在内存中的系统调用表,把一个空闲的系统调用表项指向自己写的模块中的函数,如果是已使用的表项,甚至可以实现系统调用劫持 ...

  3. Linux内核2.6.34.14添加系统调用及编译方法(CentOS-6.4-x86_64)

    <?xml version="1.0" encoding="UTF-8"?> //我添加系统调用步骤,仅供参考,尤其是系统调用的实现部分,建议大家自 ...

  4. linux内核添加系统调用(详细)

    linux内核添加系统调用(详细) 说在前面: 这是我第五次编译内核,分别踩了很多坑.中途问过wz佬,佬让我用qemu.我还是最后换ubuntu虚拟机跑了.现在已经有点emo了. 这篇博客是我第五次的 ...

  5. 【Linux】Linux添加系统调用以及内核编译过程

    在想要替换原有系统内核或者需要在原来的系统中添加一些系统调用的时候就会涉及到Linux内核的编译.但是内核编译虽然步骤简单,但是需要注意的东西还是太多了.首先一点就是由于Linux的开源性导致的版本问 ...

  6. Linux-0.11内核学习-添加系统调用

    1.参考资料 赵炯博士的网站oldlinux Linux内核完全注释 Linux0.11 源码 2.概要 操作系统作为软件应用层和底层硬件之间的部分,向下提供服务,向上提供接口.系统调用便是操作系统向 ...

  7. 操作系统实验:添加系统调用修改主机名(hostname)

    实验环境配置 Ubuntu18.04.5,Linux内核:5.9.6,VMware Workstation Pro,内存:4G,CPU:4x1=4核,外存:128G. ubuntu安装.内核源码下载及 ...

  8. 【Linux、进程隐藏】在Linux环境下添加系统调用实现进程隐藏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [进程隐藏]在Linux环境下添加系统调用实现进程隐藏 前言 一.环境设置: 二.实现方法步骤: 1.思路图 2.利用strace命令 ...

  9. Ubuntu20.04+Linux5.8.8 添加系统调用实现进程隐藏

    Ubuntu20.04+Linux5.8.8 添加系统调用实现进程隐藏 虚拟机版本 主机信息 VMware 15 Thinkpad carbon X1 2020 + win10 目录 Ubuntu20 ...

最新文章

  1. Java设计模式—模板方法模式
  2. 如何把VS Code的Language Server Protocol整合到Eclipse中来
  3. 多态定义、多态实现、多态分类。
  4. libevent for android
  5. react 组件怎么公用_用 react 做一个跟随组件的 tooltip
  6. 2015.12.20 自动化运维
  7. Abaqus二次开发的一些自制脚本
  8. sql 分组 行列转换
  9. c语言变量ppt,C语言数据类型和变量课件PPT
  10. 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
  11. 企业邮箱客户端服务器异常,企业邮箱使用客户端连接提示“不知道这样的主机”的解决...
  12. Go语言Web开发Revel框架搭建
  13. Unity 性能优化之合批
  14. android最新固件版本,Android获取系统(ROM)类别及版本号
  15. 直通车roi提升优化方法 如何判断直通车权重高低
  16. HACKTHEBOX——Help
  17. bzoj3054 Rainbow的信号(位运算+瞎搞)
  18. 2022最新CSS高频面试题指南
  19. 笔记:caffe ssd gpu训练自己的数据集
  20. 大三考研期间能不能参加蓝桥杯?

热门文章

  1. Composer 国内镜像大全(可用镜像列表)
  2. 关于dijkstra算法的个人总结
  3. 使用vue报错Cannot use ‘in‘ operator to search for
  4. 数据库基础之位图索引
  5. JavaScript-关闭窗口(window.close)
  6. C语言及程序设计(公开课)主页
  7. AS3多人游戏开发—同步人物移动
  8. 把html页面转换为pdf
  9. 纯javascript的HTML在线编辑器
  10. Java格式化json格式文本数据