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
查看是否有添加系统调用成功信息

NeuSoft(2)添加系统调用的更多相关文章

  1. Linux3.18.6内核添加系统调用(32位系统)

    1.将已经下载好的内核解压,我的目录是 /home/shangsongchao/LinuxKernel/testlinux-3.18.6/linux-3.18.6 2.添加系统调用表: 在/home/ ...

  2. Linux添加系统调用的两种方法

    前言 系统调用的基本原理 系统调用其实就是函数调用,只不过调用的是内核态的函数,但是我们知道,用户态是不能随意调用内核态的函数的,所以采用软中断的方式从用户态陷入到内核态.在内核中通过软中断0X80, ...

  3. 在Linux内核中添加系统调用,并编译内核

    1 环境准备 运行系统:vmware下安装的ubuntu10.10 32bit桌面版. 编译内核版本: linux-2.6.32.63 内核目录: /home/wanchouchou/linuxKer ...

  4. Lab1:Linux内核编译及添加系统调用(详细版)

    实验一:Linux内核编译及添加系统调用(HDU) 花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了 ...

  5. Linux添加系统调用

    Linux添加系统调用 1 概述 通常添加系统调用有两种方案: * 重新编译内核 * 添加内核模块 此处我们采用重新编译内核的方式增加系统调用. 实验环境:X86_64 GNU/Linux 4.15. ...

  6. 编译linux内核以及添加系统调用的全过程

    参考链接: https://www.zybuluo.com/hakureisino/note/514321# 北京邮电大学操作系统实验: https://wenku.baidu.com/view/6d ...

  7. [转] 添加新的系统调用 _syscall0(int, mysyscall)

    实验目的阅读 Linux 内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程.通过用kernel module的方法来实现一个系统调用实验,进一步理解Lin ...

  8. 添加linux系统调用的两种方式

    原文:https://blog.csdn.net/sdulibh/article/details/51889279 向linux内核添加系统调用,一是通过编译内核添加,二是通过内核模块的方式添加: 一 ...

  9. 如何在Linux中添加新的系统调用

    系统调用是应用程序和操作系统内核之间的功能接口.其主要目的是使得用户 可以使用操作系统提供的有关设备管理.输入/输入系统.文件系统和进程控制. 通信以及存储管理等方面的功能,而不必了解系统程序的内部结 ...

随机推荐

  1. Codeforces Round #375 (Div. 2) - C

    题目链接:http://codeforces.com/contest/723/problem/C 题意:给定长度为n的一个序列.还有一个m.现在可以改变序列的一些数.使得序列里面数字[1,m]出现次数 ...

  2. 豆制品厂开车超市送货智能手持PDA POS打票机-手持票据打印机

    豆制品厂开车拉着豆腐到某一个超市送货,到达后秤出斤数后就用票据打印机开单 能直接开单,单子一式两份,一张给客户一张留底,到月底时客户要根据客户的量返点的,单子统计.能现场开单,单子上显示哪个超市,豆制 ...

  3. 页面内容排序插件jSort的使用

        当页面列表内容很多的时候,我们可能需要将内容按照某个方式进行排序,比如按照字母或者大小等排序.本文将使用排序插件jSort来对页面内容进行排序. jSort插件可以对页面任何内容进行排序(ta ...

  4. http://chenzhou123520.iteye.com/blog/1811340

    http://chenzhou123520.iteye.com/blog/1811340

  5. SpringBoot的简单应用以及部署

    1. 项目目录结构

  6. data.table包

    data.table 1.生成一个data.table对象 生成一个data.table对象,记为DT. library(data.table) :],V3=round(rnorm(),),V4=:) ...

  7. Oracle 中的游标(用Javase中Iterator 类比之)

    当使用 pl/sql 查询 Oracle 数据库时,有时我们想输出多条记录的数据.:select * from scott.emp; 这时,我们一定会想利用循环来输出.但是,在pl/sql 中是没有数 ...

  8. Java的集合类

    转自:Q.Mr的博客 http://www.cnblogs.com/zrtqsk/p/3472258.html (本人第一次写博客,部分内容有参照李刚老师的疯狂java系列图书,如有遗漏错误,请多指教 ...

  9. ACM n-1位数

    n-1位数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的 ...

  10. 野路子土鳖ASP.NETer谈互联网的发展趋势

    有些话别在憋在心里太久了,容易伤身体,总得找个借口吐槽一下,今日不小心看到园有关于互联网发函趋势的文章,作为一名ASP.NET程序员,自然要说说什么是趋势,机会找到了,好高兴. http://zzk. ...