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

原创 2013年12月02日 14:45:02


下面补充一些内容,只说几个这篇文章中没有提到的。

 

Bus options (PCI, PCMCIA, EISA, MCA,ISA)

PCI support

PCI Expresssupport 老式机器没有PCI-E设备的可以选N

ISA support 较新的新机器没有ISA设备,可以选N

MCA support 一般选N

NatSemi SCx200support 一般选N

PCI Hotplug Support

Support for PCI Hotplug(EXPERIMENTAL) 如果没有PCI热插拔设备,选N

这里的选项都要全部编译进内核,而不是以模块形式存在。

 

Device Drivers

Block devices

Packet writing on CD/DVD media

Enable write caching(EXPERIMENTAL) 如果你有刻录机,想启用写缓存功能,选Y

 

ATA/ATAPI/MFM/RLL support

Include IDE/ATA-2 DISKsupport 如果你的/boot是放在IDE硬盘上,那么这里一定要选Y,选M都不行。否则启动时会出现“waiting for root file system”的提示而停滞不前。

SCSI devicesupport 如果有SATA硬盘,就选Y

SCSI disksupport 如果你的/boot放在SATA硬盘上,一定要选Y

Character devices

I2C support 一般可以选Y或者M

Graphicssupport 不建议把显卡驱动编译进内核。,M,编译成模块方便日后升级驱动。

 

File systems

CD-ROM/DVD Filesystems

ISO 9660 CDROM file systemsupport 一般选Y

DOS/FAT/NT Filesystems

VFAT (Windows-95) fssupport FAT32分区就选Y

NTFS file systemsupport NTFS分区就选Y

NTFS writesupport 如果想对 NTFS分区进行写操作,选Y

Native Language Support

Simplified Chinese charset (CP936,GB2312) Y或者M使读取FAT分区不会遇到中文乱码现象

必须将启动盘的文件系统编译进内核,默认是编译成模块,这样无法启动系统。最好是把硬盘上所有用到的分区文件系统全部编译进内核。

 

然后再谈几个常见的问题解决方法:

 

1、编译内核失败,不能进入系统,提示如下:

audit(1129243020.326:0):initialized

kernel panic  not syncing: VFS:Unable to mountroot fs on unknown-block(0,0)

或是:

VFS:Cannot open rootdevice hdxy or unknow-block(0,0)

Please append acorrect root= boot option

kernel panic-not syncing: VFS:Unable to mount rootfs on unknow-block(0,0)

 

解决方法:把

08.05.11<*> RAM disk support

09.27.07<*> Compressed ROM file system support(cramfs) 这两项都要选上!!!!!!否则,呵呵!

 

2、不能挂载ISO文件。

 

解决方法:把

08.05.06<*> Loopback devicesupport

08.05.07<*> CryptoloopSupport 这两项都要选上便可!

 

3、用SATA硬盘,原来内核中硬盘的设备号是/dev/sda,编译新内核后的硬盘设备号由/dev/sda变成/dev/hde,硬盘声音很吵。

 

解决方法:把

08.07SCSI devicesupport >

08.07.01<*> SCSI device support

# 08.07.02 legacy /proc/scsi/support

08.07.03<*> SCSI disksupport 这些选项都选上便可!

 

4、用上新版本内核后,无法安装显示卡的NVIDIA-Linux-x86-1.0-7676-pkg1.run驱动,系统提示如下:

 

 

Unable to load the kernel modules “nvidia.ko ”,

 This is most likely because the kernelmodules was built using

thewrong kernel source files. Please make sure you haveinstalled

 the kernel source files for your kernel;on Red Hat Linux system,

forexample, be sure you have the kernel source “rpm”installed.

Ifyou know the correct kernel source files are installed,

youmay specify the kernel source path with the“–kernel-source-path”

commandline option.

 

解决方法:

重新配置内核,将内核中

08.21Graphicssupport 这个选项里面与Nvidia相关的选项全部去掉后,竟然能够正确安装显卡驱动!具体情况如系统提示,不能引导内核模块,或是模块冲突,导致这种故障。

 

设置完,保存即可。

 

构建内核

接下来,就开始构建内核了。首先清理一下东西:

 

$ sudo make-kpkg clean

 

然后

 

$sudo make-kpkg-initrd revision=lk_517 kernel_image kernel_headersmodules_image

 

lk_517是可以自己换得,表示镜像的名字,必须要以数字结尾。最后是生成镜像包和头文件包。你也可以用binary代替,它融合了image.headers.doc.source,是最完整的包。

 

make-kpkg是一个可以自动替换”make dep;make clean;make bzImage;makemodules”命令序列的脚本。而最其最常用的两个参数就是–append-to-version与–revision

 append-to-version这个选项可以让我们来指定一个额外的内核版本,这个可以成为内核名的一问分。我们可以使用数字,”+,,但是不要使用下划线。要避免设置–append-to-version为如”-686,-K7,-sparc”等值,因为这些值常为 Debian的预编译内核所使用。

 

内核模块位于/lib/modules子目录下。每一个内核有他自己的子目录。每次当我们以一个新的名字来安装一个新的内核时,这个包安装程序就会在/lib/modules目录下创建一个新的子目录来保存他自己的模块。这就意味着每一次我们使用– append-to-version的一个新的值来编译一个内核时,我们就可以保证这个内核有一个新的名字,而他的模块也不会与其他的内核模块相冲突。

 

注意:如果我们使用相同的名字来安装一个内核时,安装程序就会覆盖掉已安装的内核及其模块。–revision只会影响Debian软件包本身的名字而不是内核的名字。与–append-to-version相似,我们只可以使用数,”,.”,不要使用下划线”_”。如果我们并没有为–revision指定一个值,make-kpkg就会使用”10.00.Custom.使用不同的–revision的值就可以避免相同名字的内核之间的冲突。

 

在内核构建成功之后,你能在/usr/src目录下看见三个.deb文件。其中包括linux-image-2.6.20-custom_2.6.20-custom-10.00.Custom_i386.deb(包含真实内核) andlinux-headers-2.6.20-custom_2.6.20-custom-10.00.Custom_i386.deb(包含那些编译附加内核模块所需要的文件)

 

kernel-image文件的名字格式如下:

 

kernel-image-(kernel-version)(append-to-version)_(revision)_(architecture).deb

 

我用这种办法安装:

 

sudo dpkg -i xxx.deb

 

你甚至可以将这两个deb包转移到其他的ubuntu系统中,并用相同的办法安装它们。这意味着,你不再需要再一次编译它们了。

 

完成

好了,现在,你可以检查一下你的menu.lst文件,多了两个与新内核有关的部分。现在,重新启动计算机,shutdown-r。如果一切顺利的话,重新启动之后,你使用的就是新的内核了。你可以通过 ” uname-r”命令来看看目前的内核版本。

 

这下就算彻底完成了。重新启动计算机,在GRUB中选择新内核启动。如果启动失败,当你看见屏幕上出现 “Press ESC to enter themenu1″这行字的时候,按下ESC,此时会进入grub的启动菜单,好,选择你的旧版内核,启动系统。现在,你不得不重新编译一次内核,使其能够正常使用。编译之前别忘了,从menu.lst中去除之前的两个不能正常工作的内核区域。

下面首先谈谈理论上编译配置内核需要用哪些步骤:

          1、首先肯定是在www.linux.org上面下载自己需要的linux内核版本啊。建议到官方下载,不要下载经过别人裁剪过的内核。

          2、解压缩。下载的时候可以下载经过gzip压缩的,也可以选择经过bzip2压缩的。经过gzip压缩的用:tar -xvz -f 来解压缩;经过bzip压缩的用:tar -xvj -f来解压缩。
          3
、清理。下载后,最好清理下 。这里介绍三个清理命令:

                       makeclean remove all generate files but configfiles

                       makemrproperremove all generate files include configfiles
                       makedistclean
mrproper and remove editor backup andpatch files

           4、配置。配置,有四个配置命令,下面分别说明:
                       make config
:交互式文本配置。

                       makemenuconfig:菜单式配置。一般选取这个配置。

                       makexconfig:只能在有xwindow的情况下配置,在纯粹命令行界面的时候不能够使用,而上面两个配置能够使用。

                 一般配置选项有很多,使用make menuconfig后,会在内核的根目录下面生成.config的配置文件。我们可以选取一个已经配置好的.config文件,修改这个文件即可。

          5、编译内核。编译内核的命令有:

                      make zImage :在x86平台下,只能够编译生成小于512K的内核;

                       makebzImage:没有大小的限制。

          6、编译内核模块。编译内核模块的命令:

                       make modules

                  之所以要编译内核模块,是因为在配置选项里面的那些选择“M”的,只编译,没有连接;而“*”既要编译也要连接,最后生成zImage。都是以内核模块的形式加载到内核的。

          7、安装内核模块。安装内核模块命令:

                      make modules_install

          8、制作init ramdisk。制作ramdisk的命令:

mkinitrd/boot/initrd.img 2.6.26

mkintramfs2.6.26 -o /boot/initrd.img

 

                      mkinitramfs initrd-$Version$Version 其中第二个$Version为内核的实际版本。

                 initramdisk作用:提供一种让内核可以简单实用ramdisk的能力。这些能力包括:格式化一个ramdisk、加载文件系统到ramdisk、将ramdisk作为根文件系统

          9、安装内核。

                由于Linux系统启动时候,会从/boot目录下来寻找文件与init ramdisk,所以需要将编译好的内核和init ramdisk复制到/boot目录下;

                为了让grub在启动时能提供一项我们自己制作的linux内核的选择项,需要修改grub配置文件。

 

下面列出自己编译和配置内核的步骤:
         1
、创建目录,存放内核源码:              

[cpp] view plaincopy

[root@localhost /]# mkdir linux_kernel  

           2、进入该目录,解压下载的linux内核源码:

[cpp] view plaincopy

[root@localhost linux_kernel]# ls  

linux-2.6.29.tar.gz  

[root@localhost linux_kernel]# tar -xvz -f linux-2.6.29.tar.gz   

            3、进入内核源码根目录,清理痕迹:

[cpp] view plaincopy

[root@localhost linux_kernel]# cd linux-2.6.29  

[root@localhost linux-2.6.29]# make distclean  

           4、配置内核。这里使用正在运行的fedora9的配置文件作为此内核的配置文件:

[cpp] view plaincopy

[root@localhost linux-2.6.29]# cp /boot/config-2.6.25-14.fc9.i686 .config  

[root@localhost linux-2.6.29]# make menuconfig  

            5、按照配置文件的说明手册对文件进行配置。

            6、编译内核。编译完成后,生成的内核位于:/arch/x86/boot目录下。

[cpp] view plaincopy

[root@localhost linux-2.6.29]# make bzImage  

            7、编译好内核后,就可以编译模块了。

[cpp] view plaincopy

[root@localhost linux-2.6.29]# make modules  

            8、编译好模块后,就可以安装模块了。

[cpp] view plaincopy

[root@localhost linux-2.6.29]# make modules_install  

              完成安装后,编译好的内核模块会从内核源代码目录拷贝至/lib/modules下面。

           9、制作 init ramdisk

[cpp] view plaincopy

[root@localhost linux_kernel]# mkinitrd initrd-2.6.29 2.6.29  

           10、拷贝内核和制作好的init ramdisk/boot目录下面。

[cpp] view plaincopy

[root@localhost linux_kernel]# cp /linux_kernel/linux-2.6.29/arch/x86/boot/bzImage  /boot/vmlinuz-2.6.29  

[root@localhost linux_kernel]# cp /linux_kernel/initrd-2.6.29 /boot/  

             注意:vmlinuz-2.6.29可以任意取名,只是下面修改grub的时候,注意名字要一致就行。

            11、修改grub 启动项。

[cpp] view plaincopy

[root@localhost linux_kernel]# vi /etc/grub.conf   


             
在里面添加:

[cpp] view plaincopy

menuentry"Anosi Linux(2.6.34.14)" {

145     insmodgzio

146     insmodpart_msdos

147     insmodext2

148     setroot='(hd0,msdosl)'

149     search--no-floppy --fs-uuid --set=rootba13f25e-ee60-4acd-b2f9-5b61555643d6

150     echo    'LoadingLinux 2.6.34.14 ... '

151     linux   /boot/vmlinuz-2.6.34.14root=UUID=ba13f25e-ee60-4acd-b2f9-5b61555643d6

152     echo    'Loadinginitial ramdisk ... '

153     initrd  /boot/initrd.img-2.6.34.14

154}
      
到此为止,就已经完成了linux内核的编译、配置了,很简单的。下次启动的时候就会出现双启动项。         


linux内核编译出错 解决方法(x86平台)

(1) 编译

# makebzImage(编译内核,生成使用gzip压缩的内核,生成的文件位于/usr/src/linux/arch/i386/boot/目录下)

# makemodules(编译可加载模块)

# makemodules_install(安装可加载模块,安装成功后,系统会在/lib/modules目录下生成一个.8子目录,里面存放着新内核的所有可加载模块。)

# makeinstall(安装新内核)

:make install的时候可能会出现如下错误信息:

No moduleBusLogic found for kernel mkinitrd failed

此问题一般只出现在SCSI硬盘+VMWARE+REDHAT架构中,因为BusLogic被编译进了内核而不是一个module的形式(2.4内核的Buslogic模块即使静态编译进内核也不行)

解决方式是直接将BusLogic.o文件复制过去:

# cp/usr/src/linux-/drivers/scsi/BusLogic.o/lib/modules/2.6.10/kernel/drivers/scsi

复制过后再执行一下make install

(2) 编译错误解决汇总

①错误1

OBJCOPYarch/i386/boot/compressed/vmlinux.bin
BFD: Warning: Writing section `.bss' to huge (ie negative) fileoffset 0xc0277000.
objcopy: arch/i386/boot/compressed/vmlinux.bin: Filetruncated
make[2]: *** [arch/i386/boot/compressed/vmlinux.bin] Error 1
make[1]: *** [arch/i386/boot/compressed/vmlinux] Error 2
make: *** [bzImage] Error 2

解决方法:

arch/i386/Makefile里面做一些修改:

OBJCOPYFLAGS改成如下的:

OBJCOPYFLAGS :=-O binary --change-section-lma.bss-0xc0000000 –R .note -R .comment –S

然后重新make bzImage.

编译成功提示如下:

OBJCOPYarch/i386/boot/compressed/vmlinux.bin

GZIP   arch/i386/boot/compressed/vmlinux.bin.gz

LD     arch/i386/boot/compressed/piggy.o

LD     arch/i386/boot/compressed/vmlinux

OBJCOPYarch/i386/boot/vmlinux.bin

HOSTCCarch/i386/boot/tools/build

BUILD  arch/i386/boot/bzImage

Rootdevice is (8, 1)

Bootsector 512 bytes.

Setup is7498 bytes.

System is1191 kB

Kernel:arch/i386/boot/bzImage is ready (#3)

②错误2

ERROR:"crypto_free_tfm" [net/rxrpc/af-rxrpc.ko] undefined!
ERROR: "crypto_alloc_base" [net/rxrpc/af-rxrpc.ko] undefined!
make[1]: *** [__modpost] Error 1
make: *** [modules] Error 2

解决方法:

选中Cryptographic options ---> [*]CryptographicAPI     

  

  

  

  

  

makeinstall时总报错:No module BusLogic found for kernel2.4.22
后来google了一下,
/etc/modules.conf中删除BusLogic的加载项
#alias scsi_hostadapter BusLogic
然后编译就成功了。

  

内教你修改linux内核启动logo

成都达内教你修改linux内核启动logo

 

系统环境:ubuntu 10.04 +x86

$ sudoapt-get install netpbm

$ pngtopnmloongson.png > loongson.pnm

说明:用来转换的图片必须为 png 格式,否则会有如下提示:

pngtopnm:input file not a PNG file

$ pnmquant224 loongson.pnm > loongson224.pnm

pnmcolormap: making histogram…

pnmcolormap: 5854 colors found

pnmcolormap: choosing 224 colors…

pnmremap:222 colors found in colormap

注意:此处 pnmquant 必须输出到另一个不同名的文件,否则会出现如下错误提示

eg:$pnmquant 224 loongson.pnm > loongson.pnm

pnmcolormap: EOF / read error reading magicnumber

pnmcolormap failed, rc=256

$pnmtoplainpnm loongson224.pnm > loongson224.ppm

然后用转换好的 loongson224.ppm 替换 kernel

/drivers/video/logo/logo_linux_clut224.ppm(最好先做好备份)

,然后删除同一目

录下的 logo_linux_clut224.c 文件,重新编译内核即可

$ cd/home/work/kenrel/linux26_3210/drivers/video/logo

$ mvlogo_linux_clut224.ppm{,-bk}

$ cp/home/loongson/Dowload/loongson224.ppm ./

$ mvloongson224.ppm logo_linux_clut224.ppm

$ rmlogo_linux_clut224.c

$ cd///

$ makemenuconfig //在内核里面选上logo 支持

DeviceDrivers --->

[*]Graphics support --->

[*] Bootuplogo --->

[*]Standard black and white Linux logo

[*]Standard 16-color Linux logo

[*]Standard 224-color Linux logo

$make

$ sudoapt-get install netpbm
$ pngtopnm loongson.png > loongson.pnm
说明:用来转换的图片必须为 png 格式,否则会有如下提示:
pngtopnm: input file not a PNG file

$ pnmquant 224 loongson.pnm > loongson224.pnm
pnmcolormap: making histogram...
pnmcolormap: 5854 colors found
pnmcolormap: choosing 224 colors...
pnmremap: 222 colors found in colormap
注意:此处 pnmquant 必须输出到另一个不同名的文件,否则会出现如下错误提示
eg:$ pnmquant 224 loongson.pnm > loongson.pnm
pnmcolormap: EOF / read error reading magic number
pnmcolormap failed, rc=256

$ pnmtoplainpnm loongson224.pnm >loongson224.ppm
然后用转换好的 loongson224.ppm 替换 kernel
/drivers/video/logo/logo_linux_clut224.ppm(
最好先做好备份)
,
然后删除同一目
录下的 logo_linux_clut224.c 文件,重新编译内核即可
$ cd /home/work/kenrel/linux26_3210/drivers/video/logo
$ mv logo_linux_clut224.ppm{,-bk}
$ cp /home/loongson/Dowload/loongson224.ppm ./
$ mv loongson224.ppm logo_linux_clut224.ppm
$ rm logo_linux_clut224.c
$ cd ../../../ 
$ make menuconfig  //
在内核里面选上logo 支持
 Device Drivers --->  
  [*] Graphicssupport  --->
    [*] Bootup logo  --->
       [*]   Standard black and whiteLinuxlogo      
       [*]   Standard 16-color Linuxlogo                             
       [*]   Standard 224-color Linuxlogo    
$ makeinitrd
主要用来把系统的启动划分为两个阶段:初始启动的内核只需保留最精简的驱动程序最小集,此后,在启动必须加载附加的模块时,从initrd中加载。

initrd进行的操作
使用initrd的时候,典型的系统启动的流程变为:

1  BootLoader读入内核镜像以及initrd文件

2  内核将initrd文件转成普通RAM盘,并且释放掉initrd文件占用的内存。

3 initrd被当作root文件系统,以可读可写(readwrite)方式安装。

4 /linuxrc被执行(它可以是任何可执行文件,包括脚本在内;它以uid0身份执行,基本上能完成所有init程序可以做的工作)

5 linuxrc安装实际root文件系统

6 linuxrc通过pivot_root系统调用将root文件系统放置在root目录下。

7  常用的启动流程(比如调用/sbin/init)开始执行。

8  卸载initrd文件系统。

注意,这是一个典型流程。其实initrd机制可以通过两种方式使用:要么就是作为一个普通的root文件系统使用,这样的话第5、第6两个步骤可以被略过,直接执行/sbin/init(我们的试验系统就是利用这种方法);要么作为一个过渡环境使用,通过它内核可以继续装载实际root文件系统。

 

相关文章推荐

嵌入式 制作x86平台Linux跟文件系统initrd.img

什么是初始 RAM 磁盘? 初始 RAM 磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd 与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:44
  • 1304

在Linux中分别安装应用于不同平台的QT:PC;嵌入式X86;ARM。

在Linux中分别安装应用于不同平台的QT:PC;嵌入式X86;ARM。        这三者PC版、嵌入式X86版和ARM版的区别主要体现在:当configure时分别加了不同的参数,具体区别是:...
  • bobbat
  • bobbat
  • 2016年05月19日 19:22
  • 1714

基于嵌入式ARM的工控主板与X86工控主板的比较

作者:wincemobile 转自:http://blog.csdn.net/wincemobile/article/details/5911599 基于嵌入式ARM工控主板相对于X8...
  • whw8007
  • whw8007
  • 2014年02月12日 08:53
  • 700

MiniGUI开发环境搭建全记录(嵌入式计X86)

在LINUX入门边上,最近一直在学习。。。本来打算用QT的。。发现那东西太大,,,,最还是选择MINIGUI。。 下面是安装过程及出现问题的一些解决方法。 选择MINIGUI1.6.2,下载地址:...

有了解arm嵌入式主板与x86主板的优势和劣势的吗?

对于学习嵌入式的人或者已经工作的人我想大家心中都有这么一个疑惑吧!是什么呢!就是大家不知道X86主板和ARM主板的有适合劣势都有哪些?下面就由业内人事凌阳教育的老师为大家分享一下他们手中的资料是怎么叙...

嵌入式ARM架构主板和X86架构主板的优缺点

相对于X86主板的优点:     (1)、功耗:这是ARM主板最大的优点之一,一般的VIA的X86主板,功耗都在40W左右或者以上,而ARM主板的功耗极低,如:广州三青创工自动化科技有限公司的Win...
  • sqcg999
  • sqcg999
  • 2013年07月10日 14:23
  • 1832

Linux 驱动程序开发步骤(X86平台)

Linux 驱动程序开发步骤(X86平台) 本文转自:http://blog.sina.com.cn/s/blog_75f3979401015cwr.html 编写好驱动,通过挂载的方法将驱动程序挂载...

X86平台Linux内核配置编译与启动

重新在x86平台上面配置编译了一下linux内核,并且设置启动。所有的工作是在虚拟机下面进行的。 下面首先谈谈理论上编译配置内核需要用哪些步骤: 1、首先肯定是在www.linux.org...

基于Linux内核定制X86平台的微操作系统

基于Linux内核定制X86平台的微操作系统   本文转自:http://blog.sina.com.cn/s/blog_64fc6b14010133cl.html     摘 要:...

x86平台内核配置、编译和安装

1.先解压内核     命令:tar jxvf linux.2.6.29.tar.bz2     备注:执行此命令前需要先把linux.2.6.29.tar.bz2复制到/usr/src/文件下。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 制作x86平台的内核步骤“二”-柱子
举报原因:
原因补充:

(最多只允许输入30个字)