linux 3 内核编译环境,Linux编译内核记
前段时间学校某课程(你猜啥课程~)要求进行简单的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编译内核记相关推荐
- 开源电子书阅读器 LibreraReader 编译环境与编译
开源电子书阅读器 LibreraReader 编译环境与编译 https://github.com/foobnix/LibreraReader ============================ ...
- linux里面搭建php环境,Linux下搭建PHP环境
该站下有系列PHP文章. 在Linux下搭建PHP环境比Windows下要复杂得多.除了安装Apache,PHP等软件外,还要安装一些相关工具,设置必要参数.而且,如果要使用PHP扩展库,还要进行编译 ...
- 腾讯云服务器CVM(CentOS 7、Tencent Linux)手动搭建LNMP环境(linux+Nginx+Mariadb+PHP)
手动搭建云服务器运行环境就是喜欢折腾,如果觉得麻烦的网友可以使用LNMP镜像直接启动CVM实例,以便快速建站. 腾讯云服务器CVM(CentOS 7.Tencent Linux)手动搭建LNMP环境( ...
- Linux编译程序源码环境,Linux下对nodejs环境进行源码编译并部署云应用
Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP.Python.Perl.Ruby 等服务端语言平起平坐的脚本语言. 该环境安装非常简单,这里 ...
- 自己动手搭建 Linux 0.12 编译环境 — Linux主机
Hi,又见面了,这两天事情比较少,所以又快速构思这篇的内容. 上篇我用极简模式说完了关于Linux 0.12的模拟环境Bochs,这篇同样沿袭上篇的思路,不过主要内容是关于Linux主机.在搭建Lin ...
- linux是否安装java环境,linux是否安装java环境
linux是否安装java环境 [2021-02-11 10:02:15] 简介: 服务器 Tomcat是基于java语言的web服务器软件,本文主要介绍如何在centos7.5上配置java环境并 ...
- linux下opengl开发环境,Linux下配置OpenGL开发环境
原创:http://blog..net/u013383042/article/details/50344467 1.首先安装build-essential软件包,输入命令:sudo apt-get i ...
- linux如何搭建lamp环境,Linux操作系统下搭建LAMP环境
准备:先在目录home/csy/下建website代码目录,然后新建php文件,命名为test.php. 在test.php编写代码如下: php phpinfo(); ?> 保存并退出. 一. ...
- 徒手搭建编译环境,编译Android源码--手把手,嘴对嘴版本
作为有点点小追求的Android Developer,应该都需要拥有一套自己的Android源码吧,一方面方便自己对源码的理解,另一方面也方便自己验证自己的很多猜想.本文主要记录一下源码从下载到编译成 ...
- linux离线配置qt环境,Linux下配置QT环境
一.下载Qt源码包到本机,然后解压缩 #tar zxvf qt-x11-opensource-src-4.3.2.tar.gz -C /usr/local //将qt-x11-opensource-s ...
最新文章
- CFRunLoopRef 的内部逻辑(向 ibireme学习)
- 2021 EdgeX中国挑战赛盛大开幕,英特尔赋能开发者,助力创新方案落地
- 获取异常信息e.printStackTrace()的内容
- 001.Amoeba读写分离部署
- RFQ(request for quotation)
- C 之父:精通C 很难,但你一天之内就能学习使用C
- aix系统升级失败提示java_AIX系统补丁升级失败处理
- windows安装Elasticsearch以及下载
- SAP License:四类业务四类工厂
- Java打卡Day4-算术运算符
- 大学计算机课程复习--软件工程
- 论文笔记_S2D.25_2007-ACM-ISMAR-小型AR环境的并行跟踪和建图
- 闲来无聊,随便看下asp.net Mvc 的收获
- 我的工程师进阶之路 - 2022更新
- java实验常见错误_求高手点拨一个Java SWING的IM系统实验的错误解决方案。
- 经典 CNN 神经网络 LeNet-5 的 C++ 实现(MNIST数据集)
- myeclipse加大内存
- WEBERP测试实录:一 webERP安装
- LinuX 硬盘分区细节详谈
- 解读谷歌的AI杀手级专利:Dropout
热门文章
- php导出excel格式文件,PHP导入与导出Excel文件的方法
- 从“多品牌”到“多品类”,家电行业的颠覆才刚开始
- 安装IMail需要注意的几个问题
- 为了比亚迪这颗“唐” 我透支了信任
- 网页左侧固定宽度,右侧内容宽度自适应
- 2022年湖北特种作业操作证应急管理厅怎么报考?甘建二
- 勒索病毒猖獗,医疗机构因此损失超920亿美元
- elasticsearch和kibana的对应配置(小白向,快速对应配置)
- Axure8.0教程:动态面板多级联动
- 【数据分析】——Excel图表