关闭

嵌入式 制作x86平台的内核步骤“一”-柱子

437人阅读 评论(0) 收藏 举报
分类:

 

1编写目的

              Ubuntu 10.04的环境下,通过下载新的Linux内核版本,并修改新版本内核中的系统文件,然后编译、加载新内核,从而实现用户添加的系统调用。

2任务概述

2.1下载新内核

       到官网下载最新的内核版本:http://www.kernel.org/

2.2修改新内核文件

       通过修改syscall_table_32.Sunistd.hsys.c三个文件,添加新的系统调用函数,用来判断输入的数字的奇偶性。

2.3进行新内核编译

       修改新版内核后,进行编译、加载、运行,最后编写测试程序对添加的系统调用进行测试。

3操作步骤

3.1查看当前系统的内核版本

       查看当前内核版本:在终端使用命令:uname –r

     

3.2下载新内核

       在官网上下载最新内核,这里使用的内核版本是:

3.3解压新版本内核

      将下载的新版本内核复制到/usr/src目录下

      

       解压新版本内核:linux-3.1.1.tar.bz2,在终端输入cd /usr/src进入src目录,再输入以下命令:

bzip2 -dlinux- 2.6.36.tar.bz2

tar -xvflinux-2.6.36.tar

 

      解压完后发现目录下多两个文件,解压成功

使用命令:ln –s linux-3.1.1linux,对文件稍微修改一下,对文件夹创建文件链接,可以利用该链接直接进入该目录(linux):

/usr/src/linux

 

3.4安装必要工具

       在终端下输入命令:

sudoapt-get install build-essential kernel-package libncurses5-devfakeroot

sudoaptitude install libqt3-headers libqt3-mt-dev libqt3-compat-headerslibqt3-mt

安装结果如图:

 

下载完工具安装后执行一下更新:apt-getupdate,如下图:

 

3.5内核修改

3.5.1添加新的系统调用

       在文件:usr/src/ linux/arch//x86/kernel/syscall_table_32.S 最后增加一个系统表项:.long sys_mycall

 

 

3.5.2添加系统调用号

       usr/src/linux/include/ asm-generic/unistd.h中添加:

 

       #define_NR_mycall   271

#defineNR_syscalls   272

 

3.5.3添加系统调用的处理函数

       usr/src/linux/kernel/sys.c中添加以下处理函数:

 

       函数源码如下:(判断奇偶数)

       asmlinkageint sys_mycall(int n)

{

             if(n%2==0)

                 return1;

             else

                 return0;

}

 

3.6清除以前编译内核时残留的.o 文件和不必要的关联(如果以前没有进行过内核编译的话,则可以省略这步)

       终端切换到:cd /usr/src/linux

       输入以下命令:make mrproper

 

3.7asmlinuxscsi等链接是指向到新内核文件位置

为确保/usr/include/下的asmlinuxscsi等链接是指向要升级的内核源代码。它们分别链向源代码目录下的真正的、该计算机体系结构所需要的include子目录。执行以下代码:

# 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

 

3.8配置内核,修改相关参数

3.8.1配置内核参数

       y:将该功能编译进内核。

n:不将该功能编译进内核。

m:将该功能编译成在需要时动态插入到内核中的模块。

单击“MainMenu”按钮,返回主配置窗口;

单击“Next”按钮,配置下一个配置项;

单击“Prev”按钮,配置上一个配置项。

选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于缩减内核,减少内核消耗的内存。与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。

终端下,修改路径为:cd/usr/src/linux

使用图形界面命令:makexconfig

 

1)文件系统
请务必要选中ext3文件系统,
  Filesystems--->
  [*] Ext3 journalling file systemsupport
  [*] Ext3 Security Labels
  [*] JBD (ext3) debugging support
(
一定要修改)
  以上三项一定要选上,而且要内建(即标*).

 

网卡驱动:

DeviceDrivers--->
  Networkingsupport--->
  Ethernet (10 or 100Mbit)--->
  <*> RealTek RTL-8139C+ PCI Fast Ethernet Adapter support(EXPERIMENTAL)
  <*> RealTek RTL-8139PCI Fast Ethernet Adapter support

 

声卡驱动:

DeviceDrivers --->
  Sound --->
  <*> Sound cardsupport
  Advanced Linux Sound Architecture--->
  <*> Advanced LinuxSound Architecture
  <*> Sequencersupport
  < > Sequencer dummyclient
  <*> OSS MixerAPI
  <*> OSS PCM (digitalaudio) API[*] OSS Sequencer API
  <*> RTC Timersupport
  PCI devices--->
  <*> Inteli8x0/MX440, SiS 7012; Ali 5455; NForce Audio;AMD768/8111
  Open Sound System--->
  < > Open SoundSystem (DEPRECATED)

 

3.8.2生成依赖信息,清除旧的编译结果

       配置内核后,返回命令窗口。为确保关键文件,在正确的位置输入以下命令:make dep(这一步不是必须的)

 

为确保所有有关文件都处于最新版本状态,需要输入命令:make clean

 

3.9编译二进制内核映像文件

       “/usr/src/linux”目录下建立二进制的内核映像文件,命令如下:make bzImage

       生成镜像文件过程:

 

 

3.10编译和安装模块

3.10.1编译模块

       执行命令:make modules(接近2个小时)

 

 

3.10.2安装模块

执行命令:makemodules_install(大概7分钟)

 

 

3.11配置启动信息和启动管理器

3.11.1配置启动信息

       为了能够使用新版本的内核,我们还需要做一些改动:

#cp/usr/src/linux/System.map /boot/System.map-2.6.39
#cp /usr/src/linux/arch/i386/boot/bzImage/boot/vmlinuz-2.6.39

#cp  .config   /boot/config-2.6.39

#mkinitramfs  -o  /boot/initrd.img-2.6.392.6.39

 

       下面修改/boot下的两个链接System.mapvmlinuz,使其指向新内核的文件:

#cd/boot;rm -f System.map vmlinuz
#ln -s vmlinuz-2.6.39 vmlinuz
#ln -s System.map-2.6.39 System.map

 

3.11.2配置启动管理器

       在终端输入以下命令:sudo apt-get install startupmanager

 

执行完之后,通过菜单栏中“SystemàAdministrationàStartUpManager”打开管理器

 

在管理器里选择已编译的新内核版本:

 

3.12重启系统,查看内核版本

重启系统后在终端键入命令查看内核版本:uname–r

 

通过系统监视器查看内核版本信息:

 

到此,修改、编译内核完成。

4测试新系统内核

4.1编写测试程序

 

#include<stdio.h>
#define _NR_mycall 270;
int main()
{
 int n;
 printf("Please input a number: ");
 scanf("%d",&n);
 if(mycall(n))
  printf("The number you set iseven number!\n");
 else
  printf("The number you set isodd number!\n");
}

 

修改ubuntu6.10上的/bin/sh

ubuntu6.10上,/bin/sh默认是链接到/bin/dash的,当你从源代码编译软件的时候,dash可能会导致一些错误,至少我遇到过 类似问题,因此,我把/bin/sh的连接改为了/bin/bash。(估计中国绝大部分使用者都是用的bash吧)

如果你使用的就是6.10,那么应该这样做:

 

$ rm -f /bin/sh

$ ln -s /bin/bash /bin/sh

 

 

安装相关的软件,包括

aUbuntu Dapper Drake 6.06 LTS首选“软件”,自己想办法安装吧

bbuild-essential,里面有gcc,make等东西要用到。

c. kernel-package,里面有make-kpkg要用。

d. qt库,主要是为了用make xconfig图形界面配置,你要安装libqt3-headers,libqt3-mt-dev

e. libncurses5-dev,主要是用make menuconfig,我就用这个。

f. gtk库,用于make gconfig。安装gtk2.0,相关lib

 

下载源码

www.kernel.org下载当前最新版的源代码。下载的分类有pf等区别,要下f类型的连接,不要下补丁。下好的源代码应该有40M。然后解压缩源代码。

 

# tar xjvf linux-2.6.20.tar.bz2 -C/usr/src/linux-2.6.20

# cd /usr/src/linux-2.6.20

 

补丁

如果需要给内核源代码打补丁,首先下载相对应的补丁,在这里我们以patch.bz2代替。将其放到/usr/src目录下,然后用下来的命令来使其生效:

 

# bzip2 -dc /usr/src/patch.bz2 | patch -p1dry-run

# bzip2 -dc /usr/src/patch.bz2 | patch-p1

 

注意!此时,你应该一直处于/usr/src/linux-2.6.20目录下。

 

第一个命令仅仅是试验性质的,它并不会对你的源代码产生什么变动。如果没有产生什么错误信息,你才能用第二个命令来对源代码产生真正的修补动作,如果第一条指令就出错了,请别继续执行下去,看看错误出在哪里。

 

同样,你也可以向你的内核提供预补丁,例如,一旦你发现有一个自己需要的特性在2.6.19 rc4中提供,但这个版本的内核并没有发行所有的完整源代码,只有patch-2.6.19-rc4.bz2是可选的。于是,你就可以提供这个patch2.6.18的内核中,但不是2.6.8.1,或者2.6.8.2

 

创建链接

创建一个指向新内核代码的符号

 

sudo ln -s /usr/src/linux-2.6.16ck12linux

 

然后进入这个目录:

 

cd /usr/src/linux

 

清理

运行命令

 

 

make mrproper

 

来清一下包。

 

配置

可以用现有的配置文件作为新内核配置文件的基础,先复制已经存在的配置文件到/usr/src/linux目录中

 

cp /boot/config-`uname -r` ./.config

 

然后运行

 

sudo make menuconfig

 

或者

 

sudo make xconfig

 

如果希望自己配置,那么就在这里面详细选。对选项如何选择不熟悉的,请参考这篇文章。看不懂中文?参考这里。

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:978551次
    • 积分:17621
    • 等级:
    • 排名:第540名
    • 原创:741篇
    • 转载:522篇
    • 译文:0篇
    • 评论:105条
    最新评论