1、下载内核
apt-get install linux-source
在/usr/src下


2、解压内核
cd /usr/src


tar -jxvf linux-source-3.2.0.tar.bz2


将内核解压到/usr/src
3、修改文件
a/usr/src/linux-source-3.2.0/kernel/sys.c
可以用右键管理员打开或者
gedit /usr/src/linux-source-3.2.0/kernel/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-3.2.0/arch/x86/kernel/syscall_table_32.S
可以用右键管理员打开或者
gedit /usr/src/linux-source-3.2.0/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-3.2.0/arch/x86/include/asm/unistd_32.h
可以用右键管理员打开或者
gedit /usr/src/linux-source-3.2.0/arch/x86/include/asm/unistd_32.h
在一列#define __NR_XXXX NNN后添加几行
#define __NR_mycall 349
#define __NR_addtotal 350
#define __NR_three 351
注意后面那个数字是接着上面那几行下来的

d/usr/src/linux-source-3.2.0/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-3.2.0/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-3.2.0

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"的文件夹,那就是新内核版本号,我的是3.2.50
然后复制内核
cp /usr/src/linux-source-3.2.0/arch/i386/boot/bzImage /boot/vmlinuz-3.2.50-mykernel
6、创建 initrd文件
在创建之前先安装必要的程序
apt-get install bootcd-mkinitramfs


mkinitramfs -o /boot/initrd.img-x.x.x
耐心等待创建完成


7、更新配置GRUB引导列表
可以用右键管理员打开/boot/grub/grub.cfg或者
gedit /boot/grub/grub.cfg
找到下面这种结构
menuentry 'Ubuntu, with Linux 3.2.0-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-3.2.0-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro quiet splash
initrd /boot/initrd.img-3.2.0-27-generic
}
menuentry 'Ubuntu, with Linux 3.2.0-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 3.2.0-27-generic ...'
linux /boot/vmlinuz-3.2.0-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro single
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.2.0-27-generic
}
复制一份在这些结构前粘贴,注意必须贴在

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

……

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

里面,并将粘贴出来的结构中的
linux /boot/vmlinuz-3.2.0-27-generic
initrd /boot/initrd.img-3.2.0-27-generic
改成你的内核文件地址和initrd文件地址
linux /boot/vmlinuz-3.2.50-mykernel
initrd /boot/initrd.img-3.2.50


最好把其他所有版本相关信息号改成3.2.50(新编译的版本号),以便在Grub菜单选择

比如改成

menuentry 'Ubuntu, with Linux 3.2.50' --class ubuntu --class gnu-linux --class gnu --class os {

recordfail

gfxmode $linux_gfx_mode

insmod gzio

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)'

search --no-floppy --fs-uuid --set=root 500bcade-e187-4245-9d3e-e422dd61df83

linux /boot/vmlinuz-3.2.50-mykernel root=UUID=500bcade-e187-4245-9d3e-e422dd61df83 ro quiet splash $vt_handoff

initrd /boot/initrd.img-3.2.50

}

menuentry 'Ubuntu, with Linux 3.2.50-generic-pae (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {

recordfail

insmod gzio

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)'

search --no-floppy --fs-uuid --set=root 500bcade-e187-4245-9d3e-e422dd61df83

echo 'Loading Linux 3.2.50 ...'

linux /boot/vmlinuz-3.2.50-mykernel root=UUID=500bcade-e187-4245-9d3e-e422dd61df83 ro recovery nomodeset

echo 'Loading initial ramdisk ...'

initrd /boot/initrd.img-3.2.50

}

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

还有就是这些menuentry的顺序,有些系统启动引导时会直接进入第一个menuentry,如果第一个menuentry不是你想进的内核,则需要在开机时按Shift进入GRUB引导菜单选择内核。如果你的系统开机是直接打开GRUB引导菜单,则无所谓,选择你想进的内核就行
8
终端执行以下命令cd /boot
cp initrd.img-3.2.50 initrd-3.2.50.old
以上是备份initrid,下面是修改
depmod –a


update-initramfs -k 3.2.50 -c
cd /tmp
gzip -dc /boot/initrd.img-3.2.50 | cpio -id
touch lib/modules/3.2.50/modules.dep
find ./ | cpio -H newc -o > /boot/initrd.img-3.2.50.new
gzip /boot/initrd.img-3.2.50.new
cd /boot
mv initrd.img-3.2.50.new.gz initrd.img-3.2.50

9、重启
重启ubuntu,如果能进入系统,证明基本上没问题了。
打开终端输入
uname -a

10、检查系统调用
打开编译器,新建工程来测试
在main函数中使用syscall(函数号,参数)测试系统调用
比如
syscall(349,1);
syscall(350,10);
syscall(351);


编译运行,然后打开终端输入
dmesg -c
查看是否有添加系统调用成功信息

转载于:https://www.cnblogs.com/shenerguang/p/3381491.html

NeuSoft(2)添加系统调用相关推荐

  1. linux 3.5.0-23-generic内核版本系统调用数目,Linux操作系统分析(三)- 更新内核与添加系统调用...

    环境:Ubuntu 12.10     学号:SA****199 1.更新内核: 直接安装的系统内核版本一般不是最新,用 uname -a 查看一下 自己的版本,OK,我的是: Linux chenh ...

  2. MIPS(loongson)linux 中添加系统调用

    在基于MISP(loongson)架构处理器与基于 x86 架构处理器的 linux 内核中添加系统调用时更改的文件是不同的,x86 中需要更改 arch/x86/kernel/syscall_tab ...

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

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

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

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

  5. 【内核驱动】 内核驱动中添加系统调用

    开发环境: Redhat6.5 开发板: Tiny4412 (ARM Cortex A9) 1. 系统调用概述 系统调用请点击 系统调用概述 2. 实现系统调用的步骤 添加一个系统调用比较简单,下面以 ...

  6. linux 2.6 添加系统调用,在Fedora 13里编译内核(linux-2.6.36)+添加系统调用

    在Fedora 13里编译内核(linux-2.6.36)+添加系统调用 首先说明:我系统本来内核是2.6.33版本,我编译的是2.6.36版本 第一步:下载内核源代码.我下载的是linux-2.6. ...

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

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

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

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

  9. linux内核syscall_define6,linux中添加系统调用

    1)在内核里添加系统调用,函数形式是:asmlinkage type sys_func_name(...) 2)在文件include/asm-arm/unistd.h里面添加 define __NR_ ...

最新文章

  1. oracle11g数据库升级
  2. 三十四、段页式管理方式
  3. java 中线程的创建方式
  4. EJB_消息驱动发展bean
  5. Azure正式对外发布容器服务,支持Swarm和Mesos
  6. Android工程模块化平台的设计
  7. Count The Repetitions
  8. iphone开发JSON库之BSJSONAdditions
  9. Qt文档阅读笔记-QWebEngineView及QML WebEngineView
  10. redmine测试使用小结
  11. JS报错:Cannot read property 'type' of undefined
  12. [转]asp.net webform 与mvc 共享session
  13. 数据分享 | 高光谱遥感影像数据集汇总
  14. win10 更新 英特尔显示器音频 后显示器音箱没有声音
  15. sidirect 连接西门子_INTOUCH DASSIDirect3.0 DASSIDirect3.0驱动是西门子PLC与Intouch连接通讯的必备驱动程序 - 下载 - 搜珍网...
  16. kindle索引_Kindle 卡索引问题解决方法汇总
  17. 【idea配置】idea右下角不显示版本分支
  18. R语言--rep函数
  19. android在root权限下实现apk的静默卸载,静默安装,重启
  20. 计算机应用最普遍的汉字字符编码是什么,计算机中,目前最普遍使用的汉字字符编码是__________...

热门文章

  1. MMDetection库部署和训练
  2. Java机器学习库ML之三Sampling(采样)
  3. 关于word插入特殊符号不显示的问题及解决
  4. java的知识点34——线程通信 || 生产者与消费者问题
  5. jQuery中wrap、wrapAll和wrapInner用法以及区别
  6. Regex解析字符串
  7. Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...
  8. Oracle 数据库设置最大进程数参数方法,oracle最大进程数满了处理方法,sysdba管理员登录报“maximum number of processes (150) exceeded“问题解决
  9. PyQt5 技术篇-在clipboard.dataChanged.connect()里如何写入剪切板示例演示,pyqt5监听剪切板变动并写入剪切板内容
  10. 正则验证车牌号码,包括新能源车牌