编辑lichee linux3.0内核时出现如下错误,怎么是linux-2.6.36?

编辑lichee linux3.0内核时出现如下错误,怎么是linux-2.6.36?,第1张

3.0是平板电脑上用的~~~~~~~~

Linux基础知识:内核编译-2.4至2.6

前言

linux-2.6.x内核发布后, 坛子里的兄弟们肯定都迫不及待地要升级原有的2.4.x内核. 但是由于与2.6.x内核配套的系统程序并没有相应的来得及更新, 升级过程会碰到很多问题, 因此觉得有必要把我的经验与大家share一下:-) XD们以后碰到类似问题时, 请先阅读本文, 而不要一上来就盲目发帖.

1. 备份重要的数据

这是个好习惯,就不用多说了:-)

2. 下载最新的2.6.x内核源码包

这个当然要到官方网站或者它的mir...?去下载了, 最好别到那些unknown的网站去下, 因为那些源码包有可能被恶意做了手脚. 最新的linux-2.6.4.tar.bz2源码包大概有33M左右. 下载的时候可以泡杯coffee, 然后点根烟......

在/usr/src/目录下解开源码包, 得到源代码目录/usr/src/linux-2.6.4/. 在对kernel做任何事情之前, 建议你先看一下它的README文件和Documentation/Changes文件, 从中你会得到不少有用的信息. 这些信息会让你在随后的升级过程避免很多不必要的麻烦.

在文档Documentation/Changes中给出了欲成功地升级到kernel-2.6.x所需的最小系统软件要求, 比如对于kernel-2.6.4是这样的:

复制内容到剪贴板代码:

Gnu make 3.79.1 # make --version

binutils 2.12 # ld -v

util-linux 2.10 # fdformat --version

module-init-tools 0.9.10 # depmod -V

e2fsprogs 1.29 # tune2fs

jfsutils 1.1.3 # fsck.jfs -V

reiserfsprogs 3.6.3 # reiserfsck -V 21|grep reiserfsprogs

xfsprogs 2.6.0 # xfs_db -V

pcmcia-cs 3.1.21 # cardmgr -V

quota-tools 3.09 # quota -V

PPP 2.4.0 # pppd --version

isdn4k-utils 3.1pre1 # isdnctrl 21|grep version

nfs-utils 1.0.5 # showmount --version

procps 3.2.0 # ps --version

oprofile 0.5.3 # oprofiled --version

对于RH8/9的用户而言, 上述要求基本上都能满足. 大概只有两个程序需要更新: modutils工具包和mkinitrd程序.

3. 安装module-init-tools-3.0.tar.gz工具包

linux-2.6.x内核的module处理过程有所改变(很多原先在用户态下由modutils处理的工作都放到内核里去完成了), 因此2.4.x下的modutils工具包已经不在适合新的2.6.x内核, 必需将其升级到module-init-tools工具包. 该工具包的最新版本是3.0(ps, 该工具包的版本从0.9.15一下跳到3.0, 其跨度之大...hoho). 可以下载module-init-tools-3.0.tar.gz源码包的地方有两个:

Rusty's Linux Kernel Page:

接下来, 按照下列步骤安装module-init-tools工具包:

复制内容到剪贴板代码:

# configure --prefix=/

# make moveold

# make all install

# ./generate-modprobe.conf /etc/modprobe.conf

命令"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等). NOTE! 这是非常重要的一步, 千万不要省略. 这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下, 新的module-init-tools工具包实际上是倚赖原来"*.old"程序来加载内核模块. 如果忘记了这一步也不要紧张, 可以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了.

新的module-init-tools工具包不再使用原来的/etc/modules.conf配置文件了, 而是使用新的配置文件/etc/modprobe.conf. 因此必需用命令"./generate-modprobe.conf /etc/modprobe.conf"来生成新的配置文件/etc/modprobe.conf. 但是令人不爽的是, 这个生成的新配置文件存在BUG, 下面我们将会提到.

,boot1,u-boot,boot0与boot1源码在lichee/boot/目录下, 机器上电执行boot0,boot0

A20启动代码流程分析:

1:全志的启动包括boot0,boot1,u-boot,boot0与boot1源码在lichee/boot/目录下,

机器上电执行boot0,boot0就会引导boot1,boot1再引导u-boot。

2:在lichee/boot/目录下的Makefile文件指定了boot1的编译目录,例如

make -f make_sdmmc -C boot1/core -j8命令就是调用lichee/boot/boot1/core目录下make_sdmmc脚本编译,

make_sdmmc最终又调用make.cfg脚本编译,所以lichee/boot/目录下的Makefile文件指定的编译路径最终都会

调用各自目录下的make.cfg来编译。

3:使用make_nand与make_sdmmc脚本是core目录生成的boot1_nand.bin与boot1_sdcard.bin,同时在

lichee/boot/workspace/egon/与lichee/tools/pack/chips/sun7i/eGon/目录生成,他们分别调用

lichee/boot/boot1/driver/drv_nand/与lichee/boot/boot1/driver/drv_sd/目录下的文件;

boot1_nand.bin与boot1_sdcard.bin分别对应启动模式:nandflash与inand启动,配置文件是在

lichee/boot/pack/chips/sun7i/configs/android/目录下相应的文件指定,其中storage_type字段指定,

2为inand启动,—1为nandflash启动;Boot_Android是正常启动模式,Boot_Burn是调试模式,Card_Android

是升级模式,他们分别生成boot.axf,prvt.axf与sprite.axf镜像,同时在

lichee/boot/workspace/wboot/bootfs/与lichee/tools/pack/chips/sun7i/wboot/bootfs/目录生成;

lichee/boot/boot1/driver/drv_de/目录是多媒体库源码,是Lcd与HDMI等显示源码,同时在

lichee/boot/workspace/wboot/bootfs/与lichee/tools/pack/chips/sun7i/wboot/bootfs/目录生成

drv_de.drv镜像。

4:arm_start.S(boot1/core/arm_board)->eGon2_swi_handler->eGon2_swi_handler_entry->eGon2_init->

eGon2_start->eGon2_storage_type_set(判断启动模式,加载boot.axf或者sprite.axf),eGon2_run_app->

FS_fread(加载.axf文件),elf_loader[*entry = (__u32)priv->main],func(argc, argv)[该函数就是

BootMain()的指针]->BootMain。

(1)正常启动模式:

BootMain->BoardInit_Display[加载drv_de.drv,判断显示模式,LCD,TV,HDMI等],check_power_status[

检测电压与电池状态,判断是否开机],BootOS_detect_os_type[加载u-boot.bin,PreBootOS->

boot_dsipatch_kernal[设置u-boot的物理地址是*kernal_addr = 0x4a000000]->wBoot_fopen("c:\\linux\\u-boot.bin", "rb")],

BootOS[wBoot_jump_to_linux->EGON2_SWI_JUMP_TO_LINUX->eGon2_jump_to_android_linux直接进入u-boot

接口]。

(2)升级模式:

BootMain->boot_ui_init[加载drv_de.drv,判断显示模式,LCD,TV,HDMI等],card_sprite->

update_flash_hardware_scan[扫描当前存储设备是nand还是inand,update_boot0,update_boot1,

根据sprite_type判断升级nand还是inand]。

5:(1)lichee/tools/pack/pack脚本打包镜像文件。

(2)编译kernel的时候首调用./build.sh -p sun7i_android->buildroot/scripts/common.sh->

lichee/linux-3.3/build.sh->lichee/buildroot/scripts/build_sun7i_android.sh编译。

在编译kernel的时候也编译也u-boot,调用./build.sh -p sun7i_android->buildroot/scripts/common.sh->

lichee/u-boot/build.sh编译。

6:lichee/boot/pack/chips/sun7i/wboot/bootfs.ini或lichee/tools/pack/chips/sun7i/wboot/bootfs.ini

把文件系统盘符映射成C盘,就是代码中使用的c:\\boot.ini","c:\\sprite.axf"等。

lichee/tools/pack/chips/sun7i/configs/android/default/下有env.cfg与image.cfg配置文件,

env.cfg是u-boot使用的配置文件,包括nand_root,mmc_root,loglevel,bootcmd等参数;

image.cfg是boot使用的文件列表与ITEM_ROOTFSFAT32等重要符号。

7:sys_partition.fex文件中各个分区与下载对应的文件如下:

bootloader分区保存bootloader.fex,bootloader.fex就是由boot.axf u-boot.bin等组成。

env分区保存env.fex,env.fex就是lichee/tools/pack/chips/sun4i/configs/crane/default/env.cfg文件,它是u-boot的基本配置。

boot分区保存boot.fex,boot.fex是boot.img的链接,它由kernel与ramdisk组成,使用fastboot下载的时候就是下载boot.img。

system分区保存system.fex,system.fex是system.img的链接,它是android系统,使用fastboot下载的时候就是下载system.img。

recovery分区保存recovery.fex,recovery.fex是recovery.img的链接,它也是由kernel与ramdisk组成,用于系统恢复,使用fastboot下载的时候就是下载recovery.img。

misc分区用于恢复系统设置的时候在uboot中保存一些变量与命令的值。

*.fex文件在lichee/tools/pack/out/目录,*.img在anroid/out/...下。

8:A20的分区如下:

--------fastboot partitions--------

-total partitions:11-

-name--start- -size-

bootloader : 8000 8000

env : 10000 8000

boot: 18000 8000

system : 20000 100000

data: 120000100000

misc: 2200008000

recovery: 22800010000

cache : 23800080000

private : 2b80008000

databk : 2c000080000

UDISK : 3400003e0000

-----------------------------------

其中UDISK就是作为SDCARD分区,bootloader是从16MB开始,在bootloader的前面是

16KB的MBR_SIZE与16KB的DL_SIZE。

9:各个镜像的对应的内存地址:

在read_boot_img()或者do_boota()都可以打印这些信息。

u-boot的地址为0x4a000000,在boot_dsipatch_kernal函数里强制赋值,也在该函数里

使用wBoot_fopen("c:\\linux\\u-boot.bin", "rb")与wBoot_fread((void *)(*kernal_addr), 1, file_length, hd_file)

把u-boot.bin从存储设备加载到0x4a000000内存地址,之后boot1从BootOS(para_addr, kernal_addr)

跳转到u-boot。

*kernal_addr = 0x4a000000。

kernel地址为0x40008000,ramdisk地址为0x41000000,在CONFIG_EXTRA_ENV_SETTINGS

中的boota 40007800其实是把boot.img下载到内存中的地址,由于boot.img中包含了

kernel与ramdisk,也包含了这两个镜像在内存中的地址,还有检查boot.img的magic

是不是ANDROID,从存储设备加载这个两个镜像到内存的 *** 作是在read_boot_img函数里,

在u-boot是do_boota函数里再次检查boot.img的合法性。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7108410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存