主要参考以下文章

向linux内核中添加三个系统调用(Ubuntu9.10) - 耕耘--IT - 博客园    
内核编译的过程(网上收集) - 小楠楠 - 博客大巴    
编译内核(2.6.11)_儒雅_百度空间    
向Linux内核添加系统调用函数_百度文库    
Ubuntu 10.04 编译安装最新版本Linux-2.6.34内核【转】 - - JavaEye技术网站    
    
一般来说都是按照第一篇文章来的,但是中途会遇到几个问题
从头开始讲,分配给ubuntu的空间最好有18G以上,否则会在编译内核时出现空间不足
    
首先在终端执行    
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
查看是否有添加系统调用成功信息
                    
完成,反正我是成功了,但是不能保证你也成功喔
不行再说吧

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

ubuntu 10.10 添加系统调用的方法相关推荐

  1. 添加系统调用的方法,2.6.35(没有测试)

    转载:http://www.cnblogs.com/kenjones/archive/2011/03/09/1978611.html ubuntu 10.10 添加系统调用的方法 http://lxr ...

  2. Ubuntu环境变量添加的安全方法

    vim /etc/profile文件(尾部) export PATH=/home/azheng/application/appxxxxxx:$PATH 别的方式容易引起问题... 当然也可以不通过添加 ...

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

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

  4. linux添加HP网络打印机,在Ubuntu 18.10系统下安装HP网络打印机的方法

    本文介绍在Ubuntu 18.10系统下安装HP网络打印机的方法,只需要四个步骤就可以了.同样的方法也适合在Ubuntu 18.04系统下. 背景 最近做了个双系统Windows+Ubuntu 18. ...

  5. ubuntu 9.10 输入法问题解决方法

    ubuntu 9.10 输入法问题解决方法 源自:http://www.msnfun.cn/archives/150.html 发现ubuntu 9.10输入法的拼音不能整句输入,于是上网查找,终于找 ...

  6. linux英伟达显卡偶尔加载失败,Ubuntu 8.10环境下出现NVIDIA显卡无法正常工作的解决方法...

    部分朋友反映升级到Ubuntu 8.10后,NVIDIA显卡工作不正常,如果无法在受限驱动里更新显卡驱动的话,可以试试下文介绍的方法,下载NVIDIA最新的驱动包自己编译安装. 2.如果你曾经在源中安 ...

  7. 无线无法解释服务器域名,科学网—Ubuntu 17.10 WIFI无线网络无法解析DNS域名的解决方法 - 徐勇刚的博文...

    把笔记本电脑(联想Y460)的操作系统从Ubuntu 16.04LTS升级到了Ubuntu 17.10, 发现WIFI无线网络能够连接上, 但就是上不了网, 比如无法访问百度(www.baidu.co ...

  8. Ubuntu 11.10 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答

    学技术怎么能不会用服务器,阿里云服务器现8折优惠,还有更多优惠券限量发放 https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.ht ...

  9. 红旗linux添加usb无线网卡,在Ubuntu 8.10中安装无线网卡RTL8187SE驱动

    本人的笔记本是微星的Wind U90,自带的无线网卡是RTL8187SE.这款无线网卡在一般的Linux下是没有驱动的,微星的官方也仅仅提供在OpenSUSE下的驱动.为了在我的Ubuntu下使用这个 ...

最新文章

  1. 2022-2028年中国氢化丁腈橡胶行业市场深度分析及投资规模预测报告
  2. 网站爬取工具_浅析阻碍网站内容被蜘蛛抓取的原因有哪些?
  3. Hibernate中session的get方法和load方法的区别
  4. Android设置Alpha值实现图片渐变效果
  5. DevExpress v17.2新版亮点—Analytics Dashboard篇(一)
  6. opengl显示汉字
  7. require include php5中最新区别,百度上好多错的。
  8. 创业团队如何在低成本的情况下保护网站安全
  9. 使用Storyboard 创建ViewController
  10. jdk Double类具体实现
  11. 从网站抓取数据的3种最佳方法
  12. office 2010 安装时出错 MSXML版本6.10.1129.0终极解决方案
  13. 儿童python编程入门-青少年Python编程入门 PDF 超清版
  14. c语言里的字体怎么设置,C语言中如何添加文字
  15. 使用nat123动态解析公网ip
  16. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例
  17. Docker容器实现跨宿主机通信
  18. matplotlib 配色之内置 colormap
  19. HTML入门笔记(案例+截图)
  20. 民宿类APP开发功能

热门文章

  1. Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸
  2. Mapnik使用postgres中的栅格数据
  3. 说明多级指针与动态变量,静态变量关系的几个简单程序
  4. IIS 之 未能加载文件或程序集“IBM.Data.DB2”或它的某一个依赖项。试图加载格式不正确的程序。...
  5. Firefox 浏览器被“http://hao.169x.cn/?m=sov=1023”劫持
  6. [转载] 大型网站的 HTTPS 实践(一)—— HTTPS 协议和原理
  7. windows 2003 网络负载平衡设置实战
  8. Linq to SQL 语法记录....并发写事务
  9. Java生成指定范围随机数的方法
  10. 机器学习算法(1)——贝叶斯估计与极大似然估计与EM算法之间的联系