編譯 linux 內核及添加系統調用
1.下載 linux 內核源碼
2.解壓放到 /usr/src
3.創建軟連接 (不一定非得打文件放到 /usr/src 看個人我直接放桌面)
root@ubuntu:~# cd /usr/src root@ubuntu:/usr/src# ls linux-4.14.14 linux-headers-4.2.0-27-generic linux-headers-4.2.0-27 root@ubuntu:/usr/src# ln -s linux-4.14.14 linux root@ubuntu:/usr/src#
4.安裝必要的工具
root@ubuntu:/usr/src# sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot
sudo aptitude install libqt3-headers libqt3-mt-dev libqt3-compat-headers libqt3-mt
(如果找不到命令,請先sudo?apt-get install?aptitude)
5.內核修改
# cd /usr/include/ # rm -r asm linux scsi # ln -s /usr/src/linux/include/asm-generic asm # ln -s /usr/src/linux/include/linux linux # ln -s /usr/src/linux/include/scsi scsi
root@ubuntu:/usr/src# cd /usr/include/
root@ubuntu:/usr/include# rm -r asm linux scsi
root@ubuntu:/usr/include# ln -s /usr/src/linux/include/asm-generic asm
root@ubuntu:/usr/include# ln -s /usr/src/linux/include/linux linux
root@ubuntu:/usr/include# ln -s /usr/src/linux/include/scsi scsi
root@ubuntu:/usr/include#
6.添加新的系統調用
找到系統調用號的表(下面的linux 是一個剛才設置的軟連接 )
註意版本不同文件地方不同
linux-2.6.32.65 在文件:/usr/src/linux/arch/x86/kernel/syscall_table_32.S
linux-3.5.4 在文件:/usr/src/linux/arch/x86/syscalls/syscall_64.tbl
linux-4.14 在文件:/usr/src/linux/arch/x86/entry/syscalls/syscall_64.tbl
這裏是 4.14.14
添加一個系統調用號 (548)
548 x32 hello sys_hello
聲明系統調用服務例程
打開:include/linux/syscalls.h 也要註意版本 不同版本不同
添加
asmlinkage long sys_hello(const char __user *name);
定義系統調用服務例程
asmlinkage long sys_hello(const char __user *name)
{
char *name_kd;
long ret;
name_kd = strndup_user(name, PAGE_SIZE);
if (IS_ERR(name_kd))
{
ret = PTR_ERR(name);
goto error;
}
printk("Hello, %s!\n", name_kd);
ret = 0;
error:
return ret;
}
kernel/sys.c 只要不插函數 頭包含中間 其它隨便
開始編譯內核:
cd /usr/src/linux
root@ubuntu:/usr/include# cd /usr/src/linux
root@ubuntu:/usr/src/linux# ls
arch Documentation ipc Makefile security
block drivers Kbuild mm sound
certs firmware Kconfig net tools
COPYING fs kernel README usr
CREDITS include lib samples virt
crypto init MAINTAINERS scripts
root@ubuntu:/usr/src/linux#
輸入 make mrproper
輸入 make menuconfig (根據需要選擇相關配置)可能報錯 找不到linux/limits.h
直接安裝apt-get install linux-libc-dev:amd64
來自 :https://blog.csdn.net/u014655590/article/details/38854555
可能又報錯 scripts/kconfig/lxdialog/dialog.h:32: fatal error: curses.h: No such file or directory
解決:
sudo apt-get install libncurses5-dev
出現
不想搞直接保存就好 來自:https://blog.csdn.net/mrzhouxiaofei/article/details/79140435
make 編譯
開始編譯
編譯完後
root@ubuntu:~/Desktop/linux-4.2.2# ls
arch crypto fs Kbuild MAINTAINERS modules.order REPORTING-BUGS signing_key.priv tools vmlinux-gdb.py
block Documentation include Kconfig Makefile Module.symvers samples signing_key.x509 usr vmlinux.o
COPYING drivers init kernel mm net scripts sound virt x509.genkey
CREDITS firmware ipc lib modules.builtin README security System.map vmlinux
root@ubuntu:~/Desktop/linux-4.2.2#
安裝:
make modules_install install
可能報錯:要安裝
sudo apt install libssl-dev
scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: No such file or directory
#include <openssl/opensslv.h>
^
compilation terminated.
scripts/extract-cert.c:21:25: fatal error: openssl/bio.h: No such file or directory
#include <openssl/bio.h>
^
compilation terminated.
make[1]: *** [scripts/extract-cert] Error 1
make[1]: *** Waiting for unfinished jobs....
CC arch/x86/kernel/asm-offsets.s
make[1]: *** [scripts/sign-file] Error 1
HOSTLD scripts/mod/modpost
make: *** [scripts] Error 2
make: *** Waiting for unfinished jobs....
CHK include/generated/asm-offsets.h
UPD include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
root@ubuntu:~/Desktop/linux-4.14.14# sudo apt install libssl-dev
修改 grub 文件
gedit /etc/default/grub
註釋掉:
#GRUB_HIDDEN_TIMEOUT=0
更新
sudo update-grub2
root@ubuntu:~/Desktop/linux-4.2.2# gedit /etc/default/grub
root@ubuntu:~/Desktop/linux-4.2.2# sudo update-grub2
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.2.2
Found initrd image: /boot/initrd.img-4.2.2
Found linux image: /boot/vmlinuz-4.2.0-27-generic
Found initrd image: /boot/initrd.img-4.2.0-27-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
root@ubuntu:~/Desktop/linux-4.2.2#
更換內核:
參考:
https://www.jianshu.com/p/b2d5fa8af581
https://www.jianshu.com/p/a6c33bf39067
編譯 linux 內核及添加系統調用