1. 程式人生 > >編譯 linux 內核及添加系統調用

編譯 linux 內核及添加系統調用

服務 grub2 one 內核源碼 apt urn www. offset porting

後面編譯的是 4.2.2 在 gcc4.8 上編譯4.14.14 時報不支持堆棧保護 反正都差不多就先編譯了 4.2.2
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 內核及添加系統調用