Linux 内核编译(三天吐血经历!)[通俗易懂]

Linux 内核编译(三天吐血经历!)[通俗易懂]写在前面的话:本人大二,东南大学一个软工狗,正在修一门名为《操作系统原理》的坑爹课!前几天做一个实验:编译Linux内核并向其增加一个系统调用。这个实验实在是太让人无语了,各种坑!昨天这个时候,我还在苦苦煎熬中。在今天凌晨四点才做好。为了让其他人少走一些弯路,鄙人就把自己的经验以及教训写下来。里面会有一些不足,希望大家多多指教~废话不多说,那就开始吧:一、实验前的准备:Vm

大家好,又见面了,我是你们的朋友全栈君。

写在前面的话:
本人大二,东南大学一个软工狗,正在修一门名为《操作系统原理》的坑爹课!前几天做一个实验:编译Linux内核并向其增加一个系统调用。这个实验实在是太让人无语了,各种坑!昨天这个时候,我还在苦苦煎熬中。在今天凌晨四点才做好。为了让其他人少走一些弯路,鄙人就把自己的经验以及教训写下来。里面会有一些不足,希望大家多多指教~

废话不多说,那就开始吧:

一、实验前的准备:

Vmware + ubuntu10.10 (32位)+ linux-2.6.32.71.tar.xz
安装虚拟机教程:http://jingyan.baidu.com/article/90895e0f95a07564ec6b0bc7.html
说明:ubuntu 10.10是我试验的最后一个,也是最后成功的那个。当然,更推荐ubuntu 10.04,因为这个支持sudo apt-update 少了一些麻烦。 而由于10.10不支持更新,故我另外新下了linux 2.6.32.71 先将这个文件拖入虚拟机桌面。

附: ubuntu10.10百度网盘分享:链接:http://pan.baidu.com/s/1bnNr8dD 密码:ybg3
        linux-2.6.32.71.tar.xz 百度网盘分享:链接:http://pan.baidu.com/s/1c1cOOtq 密码:epu9(可能已经失效,大家可以去某度上面进行下载。网上资源很多,造成的不便,很抱歉~)

二、解压内核

1、先打开安装好的ubuntu 进入终端 :在桌面按ctrl+alt+T
2、输入sudo su 获取root权限:(会出现一个输入密码的一个命令行,在终端输入密码时,是不显示星号的。你只管把密码输入回车就行了!用惯了window的小伙伴可能会有些不适应)最后如图:
Linux 内核编译(三天吐血经历!)[通俗易懂]
3、先把下载好的内核复制到 /usr/src 文件夹中 : 
      终端输入 cd Desktop(定位到桌面) 回车 ; cp  linux-2.6.32.71.tar.xz  /usr/src 回车
4、解压内核 依次输入以下命令回车执行
      cd /usr/src ;
   xz -d linux-2.6.32.71.tar.xz

     tar xvf  linux-2.6.32.71.tar

三、增加系统调用

1、

打开sys.c文件。

gedit /usr/src/linux-2.6.32.71/kernel/sys.c

2、

在文件末尾增加系统调用。

asmlinkage intsys_mycall(int number)

{

 printk(“My Student No. is XXXXX,and My Name is XXXXX*** !”);

 return number;

}

注:printk就是系统调用输出一行文字,你可以自定义里面内容,便于最终检验。

3、

 注册系统调用:

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

在.long 类型文件末尾添加:

.longsys_mycall

并且按照顺序记住它属于第几个系统调用,在本机中为337。

4、

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

在一系列#define __NR_之后添加:

 

# define __NR_mycall 337

在这里就需要用到之前记住的数字了。

四、编译内核

ps:深吸一口气,前面做的只是准备工作!下面才是真正的开始!打好精神,真正的挑战在下面!
下面的记得一定要一步一步都要做!不要漏掉一步!!!!

进入解压目录:

cd /usr/src/linux-2.6.32.71

make mrproper

make clean

make oldconfig

make bzImage  (这个过程和下面的过程非常非常非常长,亲测,建议泡杯茶,或是看个电影,没有两个小时不行

make modules

make modules_install

五、拷贝内核

经过了漫长的等待,我们终于到了这一步。
先检验一下我们的结果:

 

 首先查看一下编译好的内核版本,以便命名 打开 /lib/modules  里面应该多了一个
纯数字不带generic”的文件夹,那就是新内核版本号,我们的是2.62.32.71 如下所示:

Linux 内核编译(三天吐血经历!)[通俗易懂]

有了这个就代表前面的没有什么错误了。

接着,就在终端输入: 

cp /usr/src/linux-2.6.32.71/arch/i386/boot/bzImage  /boot/vmlinuz-2.6.32.71-mykernel

六、创建initrd文件

mkinitramfs-o /boot/initrd.img-2.6.32.71

七、更新grub引导表

进行到这一步,也许你感觉到自己差不多了,毕竟都这么久了,你也许有些困了,有些疲惫,
但是,
我告诉你,最难最容易出错的,就在当前这一步!建议你先休息一下,下面需要你投入百分之百的注意力去做,若是出错,你可是要全部重新开始的!
1.

gedit /boot/grub/grub.cfg

2.
在打开的文件中找到类似如下的字段,并复制并粘贴在前面:

但必须在同一个

### BEGIN /etc/grub.d/10_linux ### 

       ……  

### END /etc/grub.d/10_linux ###

里面

字段如下:
menuentry ‘Ubuntu, with Linux 2.6.35-22-generic’ –class ubuntu –class gnu-linux –class gnu –class os {

recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)’
search –no-floppy –fs-uuid –set 0efd72ba-ba85-470f-8c21-ab68730ca8c9
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=0efd72ba-ba85-470f-8c21-ab68730ca8c9 ro   quiet splash
initrd /boot/initrd.img-2.6.35-22-generic
}
menuentry ‘Ubuntu, with Linux 2.6.35-22-generic (recovery mode)’ –class ubuntu –class gnu-linux –class gnu –class os {

recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)’
search –no-floppy –fs-uuid –set 0efd72ba-ba85-470f-8c21-ab68730ca8c9
echo ‘Loading Linux 2.6.35-22-generic …’
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=0efd72ba-ba85-470f-8c21-ab68730ca8c9 ro single 
echo ‘Loading initial ramdisk …’
initrd /boot/initrd.img-2.6.35-22-generic
}


将粘贴后字段里面的

 linux    /boot/vmlinuz-2.6.35-22-generic      initrd    /boot/initrd.img-2.6.35-22-generic  改成你的内核文件地址和initrd 地址:

 linux   /boot/vmlinuz-2.6.32.71-mykernel    initrd    /boot/
initrd.img-2.6.32.71

这一步特别无聊但又必须认认真真做,要不然你就前功尽弃,别问我怎么知道的,我要是牢记这句话,不会到四点才睡觉 ( ╯□╰ )!! 建议全部改完之后,检查几遍。笔者以及室友们都在这步出错,以至于不得不重新开始。全部完成如图所示:

 
红框是改过之后的,篮框里面的是你需要复制的内容 可以看到 ,两者在同一个###BEGIN /etc/**** 里面 黄色下划线部分
(图丑见谅)
Linux 内核编译(三天吐血经历!)[通俗易懂]


八、收尾工作

好了,你若已经检查完毕上面的一切工作,那么,扫尾工作就开始了,这时候,也莫要放松 一步一步来,喝点开水,长呼口气,一步一步来,下面的一步一步落实:

cd /boot

cp initrd.img-2.6.32.71 initrd-2.6.32.71.old

depmod–a

update-initramfs-k 2.6.32.71 –c

cd /tmp

gzip-dc /boot/initrd.img-2.6.32.71| cpio –id

touch lib/modules/2.6.32.71/modules.dep

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

gzip /boot/initrd.img-2.6.32.71.new

cd /boot

mvinitrd.img-2.6.32.71.new.gz initrd.img-2.6.32.71


九、重启

终于到了验证结果的一步了,此时你要克制一下自己的激动心情,在终端键入 reboot 点击回车。慢慢等待一会,若是你重启成功,那么恭喜你,你已经要看到胜利的曙光啦!
重新进入终端,获取权限,过程前面有讲,不再重复。在终端键入 uname -a 回车
此时若是看到

linux-2.6.32.71,说明已经成功!

如下:Linux 内核编译(三天吐血经历!)[通俗易懂]

若是看到这个,你就可以大叫一声庆祝一下了,你已经成功啦!!!!

十、测试自定义系统调用

打开终端,键入gedit,打开gedit工具,继续键入如下代码:

#include<stdio.h>

int main()

{

       syscall(337, 1);

       return 0;

}

保存为mytest.c

再继续在终端中键入

gcc-o mytest mytest.c(编译C程序)

之后 ./mytest

点击运行编译出来的程序,此时并不会显示出效果,在终端中键入dmesg –c查看系统调用信息。

此时,你可以看到

Linux 内核编译(三天吐血经历!)[通俗易懂]

说明之前写的sys_mycall调用成功!
到这一步,算是全部成功啦!!庆祝一下,去装个逼吧~~~~
 
写在最后的话:


由于笔者是新手,里面的步骤有些显得很笨重,希望大手们看到之后多多指教!谢谢!!
另外,做这个实验一定要有耐心,若是你做的时候一直很小心,每一步都认真做,那么你一次就可以成功!!别像笔者这样做了不知多少遍。
最后,祝大家成功!!   有不足,也希望大家指出,谢谢@~@
 
ps:
参考文档:http://wenku.baidu.com/view/40af3b6727d3240c8447efd8.html?qq-pf-to=pcqq.c2c

第一篇博文,谢谢大家的浏览o(^▽^)o


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163585.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • CentOS7开启端口(永久)

    CentOS7开启端口(永久)redis等服务启动后,外网默认是无法访问的,因为防火墙不允许,所以要开启防火墙,让其可以访问这些端口号。方法一:使用firewall1、运行命令:firewall-cmd–get-active-zones运行完成之后,可以看到zone名称,如下:2、执行如下命令命令:firewall-cmd–zone=public–add-port=6379/tcp–per…

  • 利用Java+DOS批处理实现网站刷流量

    利用Java+DOS批处理实现网站刷流量最近开了个小店,木流量更木信誉,虽然东西已经便宜到要低于进价了。在不断向广大亲朋好友推荐的同时,想身为程序猿的我应该要做些什么,于是想到能否编程刷流量,网上一大堆刷流量的软件不敢用,搞不好店就得关门,还是自己解决吧。刷流量需要解决两个题,一是怎样访问算流量;二是怎样获取多个IP来访问,因为大家知道像淘宝这样的大型商城肯定是有各种防刷机制,一个IP肯定刷不了多少,搞不好就被封了,况且一个IP刷只能…

  • 虚拟机ping不通主机,但是主机可以ping通虚拟机

    虚拟机ping不通主机,但是主机可以ping通虚拟机我在Windows10系统安装了虚拟机,设置的主机与虚拟机的连接方式是桥接,安装好后,发现虚拟机ping不通主机,但是主机可以ping通虚拟机。我的操作是:关闭防火墙,发现虚拟机可以ping通主机了。说明是Windows10防火墙阻止了。现在存在的问题是:如果我一直关闭防火墙也不是个事啊?这样做会影响我的电脑安全的。于是我想我要先确定防火墙阻止了什么,导致需要关闭防火墙?于是网上查看资…

    2022年10月23日
  • 防短信验证码轰炸怎么防_接口幂等性解决方案

    防短信验证码轰炸怎么防_接口幂等性解决方案企业短信防火墙【新昕科技】+短信验证码【中昱维信】Java应用实例一、企业短信防火墙的实现1.1简介1.2第一步:获取防火墙帐号密钥1.3第二步:下载防火墙服务器1.4第三步:业务系统前后端接入1.5丰富可视化实时风险大盘,二、短信验证码的实现2.1简介2.2短信服务商接入一、企业短信防火墙的实现1.1简介新昕科技在交易反欺诈核心上,通过AI快速学习机制,结合国际领先的设备指纹技术,首次推出无需图形验证码机制的企业短信防火墙,三步完成下载对接。1.2第一步:获取防火墙帐号密钥

  • loadlibrary函数失败,错误码:126

    loadlibrary函数失败,错误码:126在项目中调用LoadLibrary函数加载dll文件,目录和文件名都是正确的,但是函数报错,GetLastError函数返回126.一直没有找到解决办法,使用depends.exe查看dll链接的其他dll,都是黄色的,还以为是这里的问题,后来再使用depends工具查看能正常运行的dll,发现也是黄色的。感觉应该是加载其他dll时出的问题,为了省事,在编译时,有些不是太重要的dll文件都

  • TGZ文件解压_TGZ文件

    TGZ文件解压_TGZ文件tar打包之后有用gzip压缩的文件windows系统可以用WinRAR打开Linux系统用命令tarzxvffilename.tgz解压

    2022年10月30日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号