zoukankan      html  css  js  c++  java
  • ubuntu 8.10 添加系统调用函数 及 内核编译

       首先,建议系统直接装,而不是用VM 等虚拟机装。我的很多朋友用虚拟机装的编译内核时老是出现问题。估计是虚拟机的问题。
    1. 下载内核

    编译Linux内核,首先是在官方网站下载Linux内核,我下的是目前最稳定的最新版本:2.6.29.1。是一个完整版。

    1. 解压内核

    把下载的内核拷贝到目录usr/src/下。然后解压:tar -jxvf linux-2.6.29.1.tar.bz2.

    解压完后,在该文件夹下,会产生一个新的文件linux-2.6.29.1

    1. 添加系统调用。

    这一步是很关键的,如果错误了,就不能在我编译的内核里打印我的大名了。这里需要修改三个文件的内容:

    1)首先是kernel/sys.c文件。在这个文件末尾添加系统调用的实现函数:

    asmlinkage long sys_mysyscall(int number)

    {

    printk(KERN_ALERT “这是 林泉居士 写的系统调用函数。\n”);

    return number;

    }

    2)在arch/x86/kernel/syscall_table_32.S中添加:.long sys_mysyscall

    (3) /usr/src/linux-2.6.29.1/arch/x86/include/asm

         unistd_32.h中添加:#define __NR_mysyscall 333 这一步是添加系统调用的入口参数。

    1. 清除以前编译的内核文件。

    修改完以上三个文件就可以了。接下来是激动人心的时刻。要开始编译系统内核了。

    在编译内核之前,可以先用如下命令make mrproper清除以前编译的东西。

    1. 定制内核。

    我直接选择 make oldconfig.用以前的内核配置。

    1. 编译内核

    你可以输入以下命令:make, 然后打开google的个人首页听歌吧,(因为Linux下连网页游戏都玩不了,实在郁闷)。

    以下是编译内核的一个过程的截图(图1-1),大概在60分钟左右吧,会编译结束,出现图2-2 的界面:,

    1. 安装模块。

    接下来该做的就是安装模块了,输入命令:make modules_install

    安装结束会有如下界面(图1-3

    1. 安装内核。

    直接输入命令:make install 。这两步都很快。

    1. 生成镜像文件。

    输入命令:mkinitramfs -o initrd.img-2.6.29.1 2.6.29.1

    完成之后会在目录/usr/src/linux-2.6.29.1下生成一个压缩包一样的东西:initrd.img -2.6.29.1,把这个东西拷贝到/boot 目录下就行了。

    1. 编辑启动文件/boot/grub/menu.lst

    在其中添加以下东西就可:

    title Ubuntu 林泉居士, kernel 2.6.29.1
    root (hd0,4)
    kernel /vmlinuz-2.6.29.1root=/dev/hdd6

    initrd /initrd.img-2.6.29.1
          
    title Ubuntu 林泉居士, kernel 2.6.29.1 (recovery mode)

    root (hd0,4)
    kernel /vmlinuz-2.6.29.1 root=/dev/hdd6 ro single
    initrd /initrd.img-2.6.29.1
          

    1-1 编译内核的过程

    1-2 编译内核结束

    1-3 安装内核

    1. 接下来就安心重启了。在登录界面选择Ubuntu 林泉居士, kernel 2.6.29.1进入系统。

    这时我们可以用VI写一个测试函数,看自己的系统调用是否成功。

    #include”stdio.h”

    // #define __NR_mycall 333

    int main()

    {

    syscall(333,1)//这里也可写成函数名syscall(mycall,1),直接用系统调用号看上去更简单。

    return 0;

    }

    Vi里编译运行一下。不会有什么效果,然后输入命令dmesg,就看到自己的名字了:如图1-4.

    1-4 dmesg命令后打印的结果

    心得体会:

    第一次编译linux系统内核,真的花了不少时间。我对linux系统内核一共编译了6次,其中三次把内核搞坏了,好在我的电脑里装了几个版本的内核,电脑还能正常进入。大概用了两天加一个通宵的时间,这个期间内,我的电脑一直在运行。

    其实,我以前并不是很喜欢用linux系统,第一感觉不熟悉,第二感觉不方便。这次之所以会坚持编译内核,而且在系统崩溃了三次,五次失败的基础上仍然坚持,仅仅是因为我想挑战一下自己。每一次的失败并没有让我灰心,反而更激发了我挑战的决心。

    在这个过程中我遇到的几个问题如下:

    1)由于linux内核更新的比较快,我开始用的是2.6.27.11版本的,而我下载的内核是2.6.29.1版本的。按照老师给的课件,或是按照网上的一些文章修改内核时,发现有一个文件unistd_32.h这个文件找不到。于是我就用搜索,把所有这样的文件都找出来,但有不知道改那个文件,于是干脆都改了。

    2)在配置系统内核时,开始我用的是make menuconfig,因为网上的文章这样推荐,我于是照着做,结果发现里面的选项根本不懂。后来就按照以前的配置直接跳过了:make oldconfig

    (3)有几次在安装内核是突然提示磁盘空间不够,我又迷惑了,然后打开添加删除程序,把一些不常用的软件都删了,可空间仍然不够,我又不知道那些东西能删,那些东西不能删,就干脆直接把以前的内核删了,结果就成功了。

    4)内核编译成功之后,写程序测试我的系统调用,结果就是不出结果,我还以为是我的内核改错了,就有重新修改编译。结果发现仍然不行,机子没有崩溃,人都快崩溃了。最后发现系统的printk不会直接打印出来,而是需要命令:dmesg,于是照着做,竟打印出很多东西,最后一行会有我的名字,最后在网上查了一下这个命令的使用,发现它有一个参数:

    -c,清除缓存中的系统信息。于是每次用dmesg时,都加上这个参数,结果就只打印我需要的信息。

    (截图进放不进去,是png格式的,大概百度不支持)

  • 相关阅读:
    runtest.sh
    写代码:简单的三元运算
    写代码:用户交互显示类似省市县三级联动的选择
    写代码:列举布尔值是False的所有值
    写代码:求集合
    写代码:利用For循环和while输出1-100
    写代码:利用for循环和range输出9*9乘法表
    写代码:查找列表中元素,移除每个元素的空格,并查找以a或A开头并且以c结尾的元素。
    写代码:利用下划线将列表的每个元素拼接成字符串,li=["alex","eric","rain"]
    写代码:购物车程序
  • 原文地址:https://www.cnblogs.com/avril/p/1692828.html
Copyright © 2011-2022 走看看