NeuSoft(2)添加系统调用
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("這是我添加的第一個系統(tǒng)調用");
return number;
}
asmlinkage int sys_addtotal(int number)
{
int i=0,enddate=0;
printk("這是我添加的第二個系統(tǒng)調用");
while(i<=number)
enddate+=i++;
return enddate;
}
asmlinkage int sys_three()
{
printk("這是我添加的第三個系統(tǒng)調用");
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
注意后面那個數(shù)字是接著上面那幾行下來的
d)/usr/src/linux-source-3.2.0/ubuntu/omnibook/Makefile
如果在后面編譯模塊時出現(xiàn)
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 //清除內核中不穩(wěn)定的目標文件,附屬文件及內核配置文件
b)make clean //清除以前生成的目標文件和其他文件
c)make oldconfig// 采用默認的內核配置,如果這里出現(xiàn)選項,選擇默認的選項,就是方括號內的第一個字母,不過我這里沒出現(xiàn)選項
d)make bzImage //編譯內核,大概需要半小時
e)make modules //編譯模塊,大概需要兩小時,如果出現(xiàn)錯誤,看看是不是因為上面的第3步的d)沒做
f)make modules_install// 安裝模塊,比較快
5、復制內核
首先查看一下編譯好的內核版本,以便命名
打開 /lib/modules
里面應該多了一個純數(shù)字不帶"generic"的文件夾,那就是新內核版本號,我的是3.2.50
然后復制內核
cp /usr/src/linux-source-3.2.0/arch/i386/boot/bzImage /boot/vmlinuz-3.2.50-mykernel
6、創(chuàng)建 initrd文件
在創(chuàng)建之前先安裝必要的程序
apt-get install bootcd-mkinitramfs
mkinitramfs -o /boot/initrd.img-x.x.x
耐心等待創(chuàng)建完成
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的順序,有些系統(tǒng)啟動引導時會直接進入第一個menuentry,如果第一個menuentry不是你想進的內核,則需要在開機時按Shift進入GRUB引導菜單選擇內核。如果你的系統(tǒng)開機是直接打開GRUB引導菜單,則無所謂,選擇你想進的內核就行
8、
終端執(zhí)行以下命令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,如果能進入系統(tǒng),證明基本上沒問題了。
打開終端輸入
uname -a
10、檢查系統(tǒng)調用
打開編譯器,新建工程來測試
在main函數(shù)中使用syscall(函數(shù)號,參數(shù))測試系統(tǒng)調用
比如
syscall(349,1);
syscall(350,10);
syscall(351);
編譯運行,然后打開終端輸入
dmesg -c
查看是否有添加系統(tǒng)調用成功信息
轉載于:https://www.cnblogs.com/shenerguang/p/3381491.html
總結
以上是生活随笔為你收集整理的NeuSoft(2)添加系统调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 四种强制类型转变与区别之处
- 下一篇: Django1.5 自定义用户模型(总结