编译 linux 内核及添加系统调用

后面编译的是 4.2.2 在 gcc4.8 上编译4.14.14 时报不支持堆栈保护 反正都差不多就先编译了 4.2.2
1.下载 linux 内核源码
2.解压放到 /usr/src
3.创建软连接 (不一定非得打文件放到 /usr/src 看个人我直接放桌面)

[email protected]:~# cd /usr/src
[email protected]:/usr/src# ls
linux-4.14.14           linux-headers-4.2.0-27-generic
linux-headers-4.2.0-27
[email protected]:/usr/src# ln -s linux-4.14.14 linux
[email protected]:/usr/src#

4.安装必要的工具

[email protected]:/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

[email protected]:/usr/src# cd /usr/include/
[email protected]:/usr/include# rm -r asm linux scsi
[email protected]:/usr/include# ln -s /usr/src/linux/include/asm-generic asm
[email protected]:/usr/include# ln -s /usr/src/linux/include/linux linux
[email protected]:/usr/include#  ln -s /usr/src/linux/include/scsi scsi
[email protected]:/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

[email protected]:/usr/include# cd /usr/src/linux
[email protected]:/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
[email protected]:/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 编译
开始编译

编译完后

[email protected]:~/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
[email protected]:~/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
[email protected]:~/Desktop/linux-4.14.14# sudo apt install libssl-dev

修改 grub 文件
gedit /etc/default/grub
注释掉:
#GRUB_HIDDEN_TIMEOUT=0

更新
sudo update-grub2

[email protected]:~/Desktop/linux-4.2.2# gedit /etc/default/grub
[email protected]:~/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
[email protected]:~/Desktop/linux-4.2.2#


更换内核:


参考:
https://www.jianshu.com/p/b2d5fa8af581
https://www.jianshu.com/p/a6c33bf39067

原文地址:http://blog.51cto.com/haidragon/2172000

时间: 2024-11-10 09:55:23

编译 linux 内核及添加系统调用的相关文章

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

1 环境准备 运行系统:vmware下安装的ubuntu10.10 32bit桌面版. 编译内核版本: linux-2.6.32.63 内核目录: /home/wanchouchou/linuxKernel/linux-2.6.32.63 为了方便,使用chmod 777 -R linux-2.6.32.63/ 将所有的内核文件都改为全权限,这样就可以在非root状态修改文件进行编译了. 2 添加系统调用 首先进入linux-2.6.32.63目录下.以后的文件路径都是以此目录为“根目录”的.

Linux内核中添加系统调用接口简单示例

1. Linux体系结构 Linux系统的地址空间分为用户空间和内核空间,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移. 2. 系统调用接口 ① 一般情况下,用户进程不能访问内核空间.Linux内核中提供了一组用于实现各种系统功能的子程序,用户可以调用它们访问Linux内核的数据和函数,这些子程序称为系统调用接口(SCI). ② 系统调用和普通函数的区别:系统调用由操作系统内核实现,运行于内核态:普通函数调用由函数库或用户自己提供,运行于用户态. 3. 系统调用分类:主要分3大类 ①

向linux内核中添加外部中断驱动模块

本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内核中添加外部中断驱动模块.7.完整驱动程序代码.linux的内核版本为linux2.6.32.2. 一.linux模块的框架以及混杂设备相关知识 1.内核模块的框架如下图所示,其中module_init()(图中有误,不是modules_init)只有在使用insmod命令手动加载模块时才会被调用,

Vs2012在Linux开发中的应用(8): 编译Linux内核

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在有了UBOOT的编译基础之后,编译Linux内核就简单多了,所不同的只有两个地方,一个是错误信息的转换,另一个是内核需要进行参数配置. 1.1    错误信息转换 UBOOT的错误信息中,文件名是不带路径的,而内核的错误信息中,文件名是带相对路径的,因此我们对转换脚本略做修改: #user code begin classCUBootMake: error=False defBuild(sel

如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载了什么模块. 所以准备重新编译Linux内核3.19.3,结果运行: make?menuconfig 得到错误提示: ? ? ? ? local_lim.h:38:26: fatal error: linux/limits.h ? 应该是在linux目录下找不到limits.h文件.有诸多兄弟碰到过

学习重新编译Linux内核

一.实验目的学习重新编译Linux内核,理解.掌握Linux内核和发行版本的区别. 二.实验内容在Linux操作系统环境下重新编译内核.实验主要内容:A. 查找并且下载一份内核源代码,本实验使用最新的Linux内核2.6.36.B. 配置内核.C. 编译内核和模块.D. 配置启动文件.本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36):然后,配置GNU的启动引导工具grub,成功运行编译成功的内核. 三.主要仪器设备(必填)Linux环境:utuntu10

Ubuntu下载编译Linux内核。

1.安装git工具 2.到官网下载linux内核https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git,这个地址不是很好用 在用下面这个 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git http://vger.kernel.org/vger-lists.html#linux-kernel这个是讨论Linux驱动的邮件组 3.

自定义配置编译linux内核

1 编译linux内核原因一般情况下,我们是不需要重新去编译linux内核的,但如果你发现你需要修改内核的某个部分或者说你需要的某个模块并没有编译进内核,那里你可以通过重新编译内核来满足你的需求,比如当我们需要用bcache时,但默认bcache是没有编译进内核的,我们可以通过修改编译配置文件,将bcache编译进内核,以下的编译操作均是在Centos7.3平台上进行的演示. 2 编译前准备工作2.1 编译用户身份选择官方是强调编译linux内核是强烈不建议以root身份来进行编译的,因为这样有

linux内核学习之四 系统调用

一  概念区分 提到linux系统调用,不得不区分几个比较容易混淆的概念: 系统调用:系统调用就是一种特殊的接口.通过这个接口,用户可以访问内核空间.系统调用规定了用户进程进入内核的具体位置. 应用程序接口(API,Application Programming Interface):是一些预定义的函数.API提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节. c库:c库实现了linux的主要API,包括标准的C库函数和系统调用.同时lin