linux内核移植笔记
- 格式:pdf
- 大小:173.97 KB
- 文档页数:7
第一章移植内核1.1 Linux内核基础知识在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux 内核的版本和分类说起。
1.1.1 Linux版本Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:VERSION = 2PATCHLEVEL = 6SUBLEVEL = 29EXTRAVERSION = .1其中的“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。
“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。
“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。
1.1.2 什么是标准内核按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在/维护和获取的内核,实际上它也有平台属性的。
这些linux内核并不总是适用于所有linux支持的体系结构。
实际上,这些内核版本很多时候并不是为一些流行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux系统上,这个站点上的内核首先确保的是在Intel X86体系结构上可以正常运行,它是基于X86处理器的内核,如对linux-2.4.18.tar.bz2的配置make menuconfig时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III/Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 选项,而没有类似Samsun 2410等其他芯片的选择。
本文主要描述在EVB335X-II以Device Tree的方式移植新TI官网AM335X系列最新的linux-3.14.43版本内核以及移植Debian文件系统的过程及遇到的一些问题。
整个Device Tree牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式(即.dts文件),又增加了编译这一文本的工具,同时Bootloader也需要支持将编译后的Device Tree传递给Linux内核。
以下是修改步骤:一、修改uboot,支持Device TreeEVB335X-II在linux-3.2版本内核移植的时候已经有uboot,因此只需在该uboot上增加Device Tree支持即可,以下是修改步骤:1、修改include/configs/com335x.h文件,增加支持DT的宏定义:/* Flattened Device Tree */#define CONFIG_OF_LIBFDT2、修改uboot启动参数,增加dtb文件的加载和启动(由于目前只是移植EMMC版本的EVB335X-II,因此只需修改EMMC的启动参数即可,大概在405行),修改如下:#elif defined(CONFIG_EMMC_BOOT)#define CONFIG_BOOTCOMMAND \"run mmcboot;"#define CONFIG_EXTRA_ENV_SETTINGS \"lcdtype=AUO_AT070TN94\0" \"console=ttyO0,115200n8\0" \"mmcroot=/dev/mmcblk0p2 rw\0" \"mmcrootfstype=ext4 rootwait\0" \"mmcargs=setenv bootargs console=${console} noinitrd root=${mmcroot} rootfstype=${mmcrootfstype} lcdtype=${lcdtype} consoleblank=0\0" \"mmcdev=" MMCDEV "\0" \"loadaddr=0x81000000\0" \"dtbfile=evb335x-ii-emmc.dtb\0" \"bootenv=uEnv.txt\0" \"bootpart=" BOOTPART "\0" \"loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \"importbootenv=echo Importing environment from mmc ...; " \"env import -t $loadaddr ${filesize}\0" \"loadaddr-dtb=0x82000000\0" \"loadimage=load mmc ${bootpart} ${loadaddr} uImage\0" \"loaddtb=load mmc ${bootpart} ${loadaddr-dtb} ${dtbfile}\0" \"mmcboot=mmc dev ${mmcdev}; " \"if mmc rescan; then " \"echo SD/MMC found on device ${mmcdev};" \"if run loadbootenv; then " \"echo Loaded environment from ${bootenv};" \"run importbootenv;" \"fi;" \"run mmcargs;" \"if run loadimage; then " \"run loaddtb;" \"bootm ${loadaddr} - ${loadaddr-dtb};" \"fi;" \"fi; \0"#endif以上,红色为修改部分。
linux笔记全(⽆图版)1、ls 查看当前⽬录下的所有内容⿊⾊的是⽂件,蓝⾊的是⽂件夹,也就是⽬录2、rm -f anaconda-ks. cfg 彻底删除⽂件(如不确定,则需要先保存备份,也就是快照)3、ifconfig 查看⽹卡的配置信息(ip地址等)4、ifconfig ens33 192.168.18. 201 /24(⽹络地址/⼦⽹掩码)更改ip地址5、systemctl restart network 重启⽹络服务6、桥接模式,直接可以进⾏通信(同⼀⽹段,配置ip)7、能不能通信的2个条件:在同⼀个物理⽹络内,ip地址也在同⼀⽹段内8、仅主机模式,虚拟机和物理机不能进⾏通信,相当于虚拟机和物理机进⾏了隔离与笔记本(真机)通信截图9、NAT模式,⾃动分配⽹络地址和⽹关,以及dns,可以直接上⽹可以访问互联⽹内的主机,但互联⽹内的主机不能访问本机(max特点)10、route -n 查看⽹关11、cat /etc/resolv. conf 查看dns(注意cat后⾯有⼀个空格,空格不可少)12、验证nat模式可以直接上⽹13、shell:通常指linux的字符界⾯,图形界⾯和字符界⾯都属于shell,但图形界⾯的shell常称为gui,字符界⾯的shell常称为cli14、cat /etc/shells 查看⽂件内容(linux⾥⾯提供的所有的shell)15、linux默认使⽤的shell是bash的shell16、echo $SHELL 查看当前使⽤的shell17、shell默认指的是bash,它的应⽤是最⼴泛的18、linux是彻底的多⽤户多任务,它可以直接多个⽤户同时进⾏操作19、ctrl+alt+f2-f6 对应5个shell ctrl+alt+f1 开始图形界⾯shell 作⽤:如何开始shell(也就是如何打开命令界⾯)20、虚拟终端的缩写为tty, 在字符界⾯下执⾏“tty"命令就可以显⽰⽤户⽬前所在的终端编号(终端名称)。
linux操作系统课程学习笔记,我的Linux学习笔记·Linux操作系统基础今天的笔记主要是关于Linux操作系统根底的相关学问。
那就从我⾯前的电脑开端讲起。
计算机和操作系统计算机主要包括五个部分:运算器,控制器,存储器,输⼊设备和输出设备。
通常,运算器,控制器再加上其他⼀些部件如寄存器等构成了我们通常所说的CPU(central processing unit),存储器则主要是内存。
运算器,控制器和存储器可以实现数据的处理.但是数据从何⽽来,运算之后的结果去往哪⾥?这就需要输⼊设备和输出设备(I/O设备)。
我们通常⽤到的输⼊设备包括键盘⿏标等,输出设备为屏幕,打印机等。
值得⼀提的是,计算机中有个叫做硬盘的东西,它并不是存储器,⽽是⼀个I/O设备。
在将数据读取到内存时,它是⼀个输⼊设备;⽽将结果保存到磁盘时,它就变成了⼀个输出设备。
这么多设备整合在⼀起,就成了⼀台计算机。
它可以接收我们的指令(键盘⿏标),通过运算(CPU),把结果展⽰给我们(屏幕,硬盘等)。
但是这么多硬件是如何协调作⽤,共同完成⼀个任务⽽不会我⾏我素地乱来呢?我们需要⼀个东西,它可以控制硬件有序地⼯作,各⾃执⾏⾃⼰的任务,这个东西就是操作系统(Operating System)。
操作系统是⼀个特殊的软件,它的任务就是硬件管理—控制CPU的运算,控制内存的分配,控制计算机的⼏乎⼀切。
假如⼀台电脑没有操作系统,它可能只是⼀个艺术品,或者⼀堆废铁。
⼀个完整的操作系统包括内核和⼀些辅助软件。
内核的主要任务就是进⾏硬件管理,它是⼀个操作系统最基础最底层的东西。
内核若想很好地控制硬件并使其发挥相应的功能,需要和硬件相识相知相爱,他俩可以成为完美的⼀对,全都仰仗于驱动的帮忙。
驱动是硬件的灵魂,它向操作系统提供了访问和使⽤硬件的接⼝,以便在某项任务中最⾼效地调⽤硬件。
什么是LinuxLinux就是⼀个操作系统,它可以管理整个计算机硬件,并且可以接收我们的指令,来指挥硬件完成相应的任务,并把结果反馈给我们。
嵌入式μCLinux系统移植XX:1007-9416(20XX)04-0086-01嵌入式Linux系统在开发过程中需要对Linux内核进行重新定制,所以熟悉内核配置、编译和移植是非常重要的。
掌握一定的Linux内核的内容,是对Linux进行手动内核移植前必须要做的。
1 Linux内核移植Linux内核移植,通俗讲马上内核由一种硬件平台移植到另一种硬件平台上运行的方式。
虽然大部分的处理器和硬件平台,嵌入式Linux系统都可以支持,但最好还是以自己定制的硬件板为主,移植工作也可通过硬件平台的变化进行调整。
本文以Linux2.6.32.4版本内核为例,过程是如何将其移植到RM内核S3C2440处理器上,该处理器是Smsung公司出产的。
1.1 内核修改(1)解压内核源码。
加压命令:tr jxvf linux-2.6.32.4.tr.bz2。
(2)修改Mkefile。
Mkefile是贯穿整Linux内核的生命线,并以此完成编译和链接。
具体过程为:内核源码目录――进入一级目录(通过编译工具)――找到Mkefile文件――修改相关变量。
(3)修改目标板输入时钟。
内核源目录――找到文件rch/rm/mch-s3c2440/mch-smdk2440.c并打开(通过编译工具)――找到函数mini2440_mp_io(void)的实现代码:s3c24xx_init_clocks(12000000)。
此代码单位是Hz,是目标板中处理器晶振的频率的意思。
依照目标板实际晶振震荡器的大小进行修改,本文以12MHz晶振为例。
(4)修改MTD分区。
MTD驱动程序在Linux下,其接口分为用户模块和硬件模块两种。
将MTD子系统编译到内核中,是为了访问特定的闪存设备,并在它上面放置文件系统,这包括选择适当的MTD硬件和用户模块。
MTD子系统就目前而言,支持绝大多数的闪存设备,且不断的有更多的驱动程序添加进来,以用于不同的闪存芯片。
Linux2.6内核移植系列教程第一:Linux 2.6内核在S3C2440平台上移植此教程适合2.6.38之前的版本,其中2.6.35之前使用同一yaffs补丁包,2.6.36--2.6.28 yaffs文件系统有所改变,2.6.39之后的暂时不支持,源码下载请到:/1.解压linux-2.6.34.tar.bz2源码包#tar jxvf linux-2.6.34.tar.bz22.修改linux-2.6.34/Makefile文件,在makefile中找到以下两条信息并做修改ARCH ? =armCROSS_COMPILE?=/usr/local/arm/4.3.2/bin/arm-linux-注意:交叉编译器的环境变量也需要改为4.3.2#export PATH=/usr/local/arm/4.3.2/bin/:$PATH其中ARCH变量用来决定:配置、编译时读取Linux源码arch目录下哪个体系结构的文件PATH 用来决定交叉编译器版本3.修改机器类型ID号Linux源码中支持多种平台的配置信息,内核会根据bootloader传进来的mach-types决定那份平台的代码起作用,本人手里的板子是仿照三星公司官方给出的demo板改版而来,所以采用arch/arm/mach-s3c2440/mach-smdk2440.c此配置文件,打开此文件,翻到最后,有以下信息:MACHINE_START(S3C2440, "SMDK2440")/* Maintainer: Ben Dooks <ben@> */.phys_io= S3C2410_PA_UART,.io_pg_offst= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,.boot_params= S3C2410_SDRAM_PA + 0x100,.init_irq= s3c24xx_init_irq,.map_io= smdk2440_map_io,.init_machine= smdk2440_machine_init,.timer= &s3c24xx_timer,MACHINE_ENDMACHINE_START(S3C2440, "SMDK2440")决定了此板子的mach-types,可以在以下文件中找到S3C2440对应的具体数字,"arch/arm/tools/mach-types"文件查找S3C2440,362,这里刚好与我们的bootloader相同,所以不用做修改,直接保存退出即可,如果不同则根据bootloader的内容修改此文件,或根据此文件修改boorloader的内容(在vivi中可通过param show查看,u-boot在Y:\test\u-boot_src\u-boot_edu-2010.06\board\samsung\unsp2440\unsp2440.c文件:gd->bd->bi_arch_number = MACH_TYPE_S3C2440;中决定)。
描述Linux内核的移植过程
Linux内核的移植过程可以分为以下几个步骤:
1. 确定目标平台:首先需要确定要将Linux内核移植到哪个目标平台上,这个平台可以是嵌入式设备、服务器、桌面电脑等。
2. 获取源代码:从Linux官网或其他开源代码库获取Linux内核的源代码。
3. 配置内核:根据目标平台的硬件特性和需求,对内核进行配置。
可以使用make menuconfig、make xconfig或make config等命令进行配置。
4. 编译内核:使用交叉编译工具链对内核进行编译。
交叉编译工具链是一组针对特定平台的编译器、链接器、调试器等工具,可以在开发主机上编译生成目标平台上的可执行文件。
5. 生成镜像文件:将编译生成的内核、设备树、启动程序等文件打包成一个镜像文件。
镜像文件的格式可以是uImage、zImage、vmlinux等。
6. 烧录镜像文件:将生成的镜像文件烧录到目标平台的存储设备上,例如闪存、SD卡、硬盘等。
可以使用dd、fastboot、flash等命令进行烧录。
7. 启动内核:将目标平台连接到开发主机,通过串口或网络连接进行调试和启动。
可以使用bootloader或者直接从存储设备启动内核。
8. 调试内核:在目标平台上运行内核时,可能会遇到各种问题,例如驱动不兼容、内存泄漏、死锁等。
需要使用调试工具对内核进行调试,例如gdb、kgdb、strace等。
以上就是Linux内核的移植过程,需要根据具体的目标平台和需求进行调整和优化。
以下资料由IC人才网整理
我的内核移植笔记linux-2.6.25.8移植到OK-2440-III
写给比我晚接触嵌入式的嵌入式爱好者们!!
接触嵌入式有一段时间了,这段时间里多亏了飞凌工程师帮忙,解答了我发在论坛里的很多弱弱的问题。
这里我把这段时间里我移植内核到飞凌的OK-2440-III板子的详细步骤发出来,希望能对朋友们有所帮助,也当作一种回报给论坛。
交叉编译工具链:cross-3.4.1(飞凌的随板子光盘里面提供了,或者自己可以去百度搜)
内核:linux-2.6.25.8 (可以到去下载)
目标板:飞凌公司的ARM9开发板OK-2440-III
平台:虚拟机redhat linux-9
移植开始!
还有不知道有没有必要说,以下我说的执行XX命令都是在虚拟机linux的终端执行。
一、首先正确配置虚拟机,安装Vmtools,使虚拟机linux可以和windows共享文件(怎么安装虚拟机linux 就不用说了吧,不会的去百度吧):
VMware工具的安装:
1.在虚拟机开机时,在VMware菜单中选择VM->Install VMware tools选项安装VMware工具。
注意:其实通过这步操作并没有真正安装上。
你可以看一下,你设的共享目录仍然没有,分辩率也没法设。
2.在虚拟机linux里打开光驱,有两个文件,其中一个是VMware Tools的tar文件,我现在的是VMware-Tools-5.5.3-34685.tar.gz。
3.copy这个tar文件到~/temp下(你的主目录下的哪个目录下都行)。
4.解压这个文件到当前目录,会发现~/temp下多了一个解压出的vmware-tools-distrib目录。
5.cd到这个目录下,执行./vmware-install.pl(安装很简单一路回车就OK)。
6.cd vmware-tools-distrib/bin目录下执行./vmware-config-tools.pl来配置工具(这个过程需要虚拟机上已经安装了GCC,过程也很简单,根据提示作就可以完成)。
重新启动虚拟机,会发现我们在第六步设置的分辨率起作用了,我们设的共享目录也可以看到了(在/mnt/hgfs目录下)。
设置好之后在windows端你设置的共享文件夹里放入需要共享到虚拟linux的文件,然后在linux 的/mnt/hgfs目录下就可以找到。
至此,搞定windows和虚拟linux文件共享问题!
二、安装交叉编译工具链
在/usr/local目录下,新建arm/目录,将共享的交叉编译工具cross-3.4.1.tar.bz2复制到里面(即复制到/usr/local/arm目录),新建终端,执行:cd /usr/local/arm,切换到/usr/local/arm目录,执行:tar jxvf cross-3.4.1.tar.bz2命令将交叉编译工具解压到当前目录,会生成3.4.1文件夹,将来编译所需的工具就在里面。
至此交叉编译环境搭建好了。
三、内核移植
将共享的linux-2.6.25.8.tar.bz2复制到/home目录,执行:tar jxvf linux-2.6.25.8.tar.bz2命令将内核解压到当前目录,在终端执行:cd /home/linux-2.6.25.8命令切换到内核源码目录。
真正的移植开始。
1、执行:gedit Makefile命令打开顶层的Makefile文件(注意Makefile的第一个字母是大写,linux里面是区分大小写的),找
ARCH ?=(SUBARCH) 和CROSS_COMPILE ?=
将其改为:
ARCH ?= arm
CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-
(相信很多人在网上会看到资料说:CROSS_COMPILE ?=arm-linux- ,但是这样就需要设置环境变量,还不如直接写全路径的好)
2、执行:gedit arch/arm/mach-s3c2440/mach-smdk2440.c找到
Smdk2440_map_io函数,将16934400修改为12000000(此处为平台输入时钟,OK-2440-III用的是12MHz 的外部时钟
3、修改MTD分区
执行:gedit arch/arm/plat-s3c24xx/common-smdk.c命令
在109行左右,找到内核的分区信息:
将它修改为和bootloader的分区一致,即:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot",
.size = 0x00100000,
.offset = 0
},
[1] = {
.name = "MyApp",
.size = 0x003c0000,
.offset = 0x00140000, },
[2] = {
.name = "Kernel",
.size = 0x00300000,
.offset = 0x00500000,
},
[3] = {
.name = "fs_yaffs",
.size = 0x03c00000,
.offset = 0x00800000,
},
[4] = {
.name = "WINCE",
.size = 0x03c00000,
.offset = 0x04400000,
}
};
4、修改drivers/mtd/nand/s3c2410.c禁止flash ECC校验
找到s3c2410_nand_init_chip()函数,在该函数体最后把:
chip->ecc.mode = NAND_ECC_SOFT;
修改成:
chip->ecc.mode = NAND_ECC_NONE;
修改完成后保存,关闭。
做完这些后,内核的基本修改已经完成,接下来可以简单配置一下内核,然后编译,再下载到板子上看看效果,但是现在还没有进行文件系统的移植,一定会报错的,没关系,只要能看到你内核分区的打印信息就说明上面的修改生效了,然后就可以继续移植文件系统了。
5、移植yaffs文件系统
说明一下,这里的移植文件系统还不是真正的移植,只是给内核打上文件系统补丁,让内核支持yaffs文件系统,因为O-2440-III的板子预先烧写好的文件系统就是yaffs的,所以这里咱们先利用预先烧写好的文
件系统来测试移植的内核,换句话说就是:如果内核移植和配置的没有问题的话,是可以正确挂载板子上预先烧写的文件系统的。
Understand?
好了,废话少说,开始干活。
首先到/cgi-bin/viewcvs.cgi 下载一个yaffs文件系统的补丁,打开网页后,点击Download tarball 下载补丁。
然后利用上面做好的windows和虚拟机linux共享文件的方法把下载好的压缩包复制到/home目录下,假如你下载的这个压缩包名字为:root.tar.gz
解压到当前目录:tar xvzf root.tar.gz
进入解压出来的yaffs2目录
执行:./patch-ker.sh c /home/linux-2.6.25.8/ (注意最前面有个“.”)
此时在内核源码的fs/目录下你将会看到一个新添加的名为“yaffs2”的目录,同时fs/目录下面的Makefile 文件和Kconfig文件也添加了yaffs2的配置和编译条件。
至此基本的移植工作已经完成(除一些相关驱动移植,驱动移植在后面慢慢完成),下面将自己移植的内核配置一下就可以烧进板子检验一下了。
6、配置内核
切换到内核目录:cd /home/linux-2.6.25.8
执行:make s3c2410_defconfig 载入缺省的2410内核配置,因为2410的配置和2440的相近,这样我们就可以在2410的配置的基础上进行更改,节省一些力气。
执行:make menuconfig 打开内核配置界面,
然后配置如下:
平台配置
----------------------------------------------
人生重要的不是所站的位置,而是所朝的方向!。