前段时间学校某课程(你猜啥课程~)要求进行简单的linux内核编译,并添加自己的系统调用,对于Linux小白来说这可不是件简单的事,的确话费不少时间和精力。趁此博客终于过了之际,来记录一下~

0x01 实验前的准备

环境说明:

Ubuntu10.04(过高版本刚开始编译各种错误)

linux-2.6.39(差不多这个版本编译起来成功概率大点吧oo)

apt-get install build-essential kernel-package libncurses5-dev libqt3-headers

工具说明:

build-essential (基本的编程库(gcc, make等)

kernel-package (Debian 系统里生成 kernel-image 的一些配置文件和工具)

libncurses5-dev (meke menuconfig要调用的)

libqt3-headers (make xconfig要调用的)->这个应该是没有用到的,至少目前是。。

下载内核源代码:

wget http://www.kernel.org/pub/linux/kernel/linux-2.6.39.tar.bz2

tar -jxvf linux-2.6.39.tar.bz2

说明:因为我下载的是tar.bz2格式的文件,所以解压命令参数是这个,如果下载的是不同格式,解压命令可能不同将内核文件解压到usr/src下,自动生成文件夹linux-2.6.39

0x02 添加系统调用

step1

# gedit /usr/src/linux-2.6.39/kernel/sys.c

asmlinkage int sys_mycall(int number) {

printk(KERN_EMERG "hello, world");

return number;

}

打开sys.c文件,在最后添加这样一个函数(最好加上KERN_EMERG,这个表明你的printk优先级较高,不然很有可能在后面看不到想看到的结果

step2

#gedit /usr/src/linux-2.6.39/arch/x86/kernel/syscall_table_32.S

这里我们将223行.long sys_ni_syscall改为.long sys_mycall

名称和刚刚定义的函数对应,格式自行模仿~

step3

#gedit /usr/src/linux-2.6.39/arch/x86/include/asm/unistd_32.h

增加一行,对应上面的223

#define __NR_mycall 223

名称同样也是对应的

0x03 开始编译啦

step1

把正在使用中的内核配置文件/boot/linux-2.6.39-generic 拷到/usr/src/linux-2.6.39/.config目录下

cp /boot/config-2.6.32-21-generic /usr/src/linux-2.6.39/.config

我这个版本自带内核版本是3.6.32-21,大家的可以去boot/目录下查看

step2

make menuconfig

终端会弹出一个配置界面

注意主菜单最后有两项:

load a kernel configuration...

save a kernel configuration...

先选第一项load ....,意思是,利用当前的内核配置详单来设置将要编译的内核,然后选save这一项保存,最后退出配置界面。

step3

执行:

sudo make mrproper

(清除以前曾经编译过的旧文件,如果你是第一次编译,可不执行)

执行:

sudo make -j2

然后:

sudo make install

sudo make modules (编译模块)

sudo make modules_install (安装模块)

最后创建initrd文件:

mkinitramfs -o /boot/initrd.img-2.6.39

执行

update-grub2

这样刚编译成功的内核就加入到了grub文件中,也就是可以启动了~

打开grub.cfg文件,将timeout改为10,这样启动时就有十秒时间来选择启动哪个内核了。

这个执行完,按理说编译应该成功了,但是你启动会提示你有错误,启动不了,这样你可以进入以前内核,执行下列命令,就可以正常启动了(所以说不如第一次编译完就执行这些命令,要是非要看看它是怎么抽风拒绝启动的,倒是也可以尝试一下哇)

cd /boot

cp initrd.img-2.6.39 initrd-2.6.39.old (先做一个备份以防万一,哈哈)

depmod -a

update-initramfs -k 2.6.39 -c

cd /tmp

gzip -dc /boot/initrd.img-2.6.39| cpio -id

touch lib/modules/2.6.39/modules.dep

find ./ | cpio -H newc -o > /boot/initrd.img-2.6.39.new

gzip /boot/initrd.img-2.6.39.new

cd /boot

mv initrd.img-2.6.39.new.gz initrd.img-2.6.39

以上所以命令只针对我这个内核版本,如若是其他版本,可以照这个更改~~

0x04 编写测试函数及总结

#include

int main(){

syscall(223,1);

return 0;

}

写完这个测试函数,再用gcc命令编译一下,再dmesg -c一下,你猜会看到啥?哈哈,就是熟悉的“hello world”,听说你不信?那就赶紧自己去试试吧~

结语

杀死无数脑细胞的任务总算完成了,发现segmentfault写起来还是蛮舒心的,对了,要是第一次编译成功后,后面修改了系统调用后,直接从make modules开始做起就好,这样就能省不少时间,不然那个编译时间。。。谁用谁知道啊真的是。。

linux 3 内核编译环境,Linux编译内核记相关推荐

  1. 开源电子书阅读器 LibreraReader 编译环境与编译

    开源电子书阅读器 LibreraReader 编译环境与编译 https://github.com/foobnix/LibreraReader ============================ ...

  2. linux里面搭建php环境,Linux下搭建PHP环境

    该站下有系列PHP文章. 在Linux下搭建PHP环境比Windows下要复杂得多.除了安装Apache,PHP等软件外,还要安装一些相关工具,设置必要参数.而且,如果要使用PHP扩展库,还要进行编译 ...

  3. 腾讯云服务器CVM(CentOS 7、Tencent Linux)手动搭建LNMP环境(linux+Nginx+Mariadb+PHP)

    手动搭建云服务器运行环境就是喜欢折腾,如果觉得麻烦的网友可以使用LNMP镜像直接启动CVM实例,以便快速建站. 腾讯云服务器CVM(CentOS 7.Tencent Linux)手动搭建LNMP环境( ...

  4. Linux编译程序源码环境,Linux下对nodejs环境进行源码编译并部署云应用

    Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP.Python.Perl.Ruby 等服务端语言平起平坐的脚本语言. 该环境安装非常简单,这里 ...

  5. 自己动手搭建 Linux 0.12 编译环境 — Linux主机

    Hi,又见面了,这两天事情比较少,所以又快速构思这篇的内容. 上篇我用极简模式说完了关于Linux 0.12的模拟环境Bochs,这篇同样沿袭上篇的思路,不过主要内容是关于Linux主机.在搭建Lin ...

  6. linux是否安装java环境,linux是否安装java环境

    linux是否安装java环境 [2021-02-11 10:02:15]  简介: 服务器 Tomcat是基于java语言的web服务器软件,本文主要介绍如何在centos7.5上配置java环境并 ...

  7. linux下opengl开发环境,Linux下配置OpenGL开发环境

    原创:http://blog..net/u013383042/article/details/50344467 1.首先安装build-essential软件包,输入命令:sudo apt-get i ...

  8. linux如何搭建lamp环境,Linux操作系统下搭建LAMP环境

    准备:先在目录home/csy/下建website代码目录,然后新建php文件,命名为test.php. 在test.php编写代码如下: php phpinfo(); ?> 保存并退出. 一. ...

  9. 徒手搭建编译环境,编译Android源码--手把手,嘴对嘴版本

    作为有点点小追求的Android Developer,应该都需要拥有一套自己的Android源码吧,一方面方便自己对源码的理解,另一方面也方便自己验证自己的很多猜想.本文主要记录一下源码从下载到编译成 ...

  10. linux离线配置qt环境,Linux下配置QT环境

    一.下载Qt源码包到本机,然后解压缩 #tar zxvf qt-x11-opensource-src-4.3.2.tar.gz -C /usr/local //将qt-x11-opensource-s ...

最新文章

  1. CFRunLoopRef 的内部逻辑(向 ibireme学习)
  2. 2021 EdgeX中国挑战赛盛大开幕,英特尔赋能开发者,助力创新方案落地
  3. 获取异常信息e.printStackTrace()的内容
  4. 001.Amoeba读写分离部署
  5. RFQ(request for quotation)
  6. C 之父:精通C 很难,但你一天之内就能学习使用C
  7. aix系统升级失败提示java_AIX系统补丁升级失败处理
  8. windows安装Elasticsearch以及下载
  9. SAP License:四类业务四类工厂
  10. Java打卡Day4-算术运算符
  11. 大学计算机课程复习--软件工程
  12. 论文笔记_S2D.25_2007-ACM-ISMAR-小型AR环境的并行跟踪和建图
  13. 闲来无聊,随便看下asp.net Mvc 的收获
  14. 我的工程师进阶之路 - 2022更新
  15. java实验常见错误_求高手点拨一个Java SWING的IM系统实验的错误解决方案。
  16. 经典 CNN 神经网络 LeNet-5 的 C++ 实现(MNIST数据集)
  17. myeclipse加大内存
  18. WEBERP测试实录:一 webERP安装
  19. LinuX 硬盘分区细节详谈
  20. 解读谷歌的AI杀手级专利:Dropout

热门文章

  1. php导出excel格式文件,PHP导入与导出Excel文件的方法
  2. 从“多品牌”到“多品类”,家电行业的颠覆才刚开始
  3. 安装IMail需要注意的几个问题
  4. 为了比亚迪这颗“唐” 我透支了信任
  5. 网页左侧固定宽度,右侧内容宽度自适应
  6. 2022年湖北特种作业操作证应急管理厅怎么报考?甘建二
  7. 勒索病毒猖獗,医疗机构因此损失超920亿美元
  8. elasticsearch和kibana的对应配置(小白向,快速对应配置)
  9. Axure8.0教程:动态面板多级联动
  10. 【数据分析】——Excel图表