已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
厦门中软卓越教你如何进行LINUX 内核移植_嵌入式培训嵌入式的就业前景广泛,职业发展方向有很多,可以说只要跟电子控制相关的工作,都可以参与,当然嵌入式这个行业也非常利于个人创业,这也是为什么越来越多的人参加嵌入式培训的原因。想要学习嵌入式,就要掌握LINUX系统操作。接下来厦门中软卓越IT培训机构蒋光曦老师跟各位初学LINUX的朋友分享如何进行LINUX 内核移植。与其它操作系统相比,Linux最大的特点:它是一款遵循GPL(General Public License GNU通用公共许可证(简称为GPL),是由自由软件基金会发行的用于计算机软件的许可证。)的操作系统,我们可以自由地使用、修改、和扩展它。正是由于这一特色,Linux受到越来越多人士的青睐。于是,一个经常会被探讨的问题出现了,即关于Linux系统的移植。对于操作系统而言,这种移植通常是跨平台的、与硬件相关的,即硬件系统结构、甚至CPU不同。下面就让我们来看看在Linux系统移植方面,我们都需要做些什么。Linux系统移植的两大部分对于系统移植而言,Linux系统实际上由两个比较独立的部分组成:即内核部分和系统部分。通常启动一个Linux系统的过程是这样的:1、一个不隶属于任何操作系统的加载程序将Linux部分内核调入内存,并将控制权交给内存中Linux内核的第一行代码。2、此后Linux要将自己的剩余部分全部加载到内存(如果有的话,视硬件平台的不同而不同),初始化所有设备,在内存中建立好所需的数据结构(有关进程、设备、内存等)。到此为止Linux内核的工作告一段落,内核已经控制了所有硬件设备。3、至于操作和使用这些硬件设备,则轮到系统部分上场了。内核加载根设备并启动init守护进程,init守护进程会根据配置文件加载文件系统、配置网络、服务进程、终端等。一旦终端初始化完毕,我们就会看到系统的欢迎界面了。小结一下:(1)内核部分初始化和控制硬件设备,为内存管理、进程管理、设备读写等工作做好一切准备。(2)系统部份加载必需的设备,配置各种环境以便用户可以使用整个系统。一、 内核移植概述1、RedHat 分两个系列:Red Hat Enterprise Linux(企业版) Red Hat 9.0 (2.4)Fedora Core(桌面版) ( 2.6.18) 2、Linux 内核版本号:Linux的版本号又分为两部分:内核(kernel)与发行套件(distribution)版本。内核版本指的是在Linus领导下的开发小组开发出的系统内核的版本号,目前最新的的版本的序号大约是2.6.34 (3.8.8 -2013-4-17发布) XYZZ-WWW X代表类型。X.Y是版本号。其中Y为偶数是稳定版本,奇数是开发版本,一般有一些新的东西加入,是不一定很稳定的测试版本,如2.1,2.3。ZZ是次版本号,此版本号不分奇偶,每1-2个月发布一个。测试版本为主版本号+次版本号+测试号。如 2.6.12-rcl.而一些组织或厂家将Linux系统内核与应用软件和文档包装起来,并提供一些安装界面和系统设定与管理工具,这样就构成了一个发行套件,例如最常见的Slackware,RedHat,Debian等等。实际上发行套件就是Linux的一个大软件包而已。相对于内核版本,发行套件的版本号随发布者的不同而不同,与系统内核的版本号是相对独立的,例如Slackware3.5,RedHat5.1,Debian1.3.1等等。3、新版本的内核的发布有两种形式 一种是full/ Source版本,一般是tar.gz或者是.bz2文件。 另外一种是patch文件,即补丁。 patch文件一般只有几十K到几百K,但是patch文件是针对于特定的版本的,你需要找到自己对应的版本才能使用。 例如:你有2.6.9的源代码,但想移到2.6.10。就可以获得2.6.10的补丁文件,应用patch来修改2.6.9源文件。$ cd /usr/src/linux $ patch pl 树状菜单。选择相应的配置时,有三种选择,它们分别代表的含义如下: Y-将该功能编译进内核 N-不将该功能编译进内核 M-将该功能编译成模块,可以在需要时动态插入到内核中。 选项中是 的,要么是空,要么是“*” ; 是的,可以是空、“*” 或者“M” 是()的,可以在所提供的几个选项中选择一项。配置的原则 大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。 将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块。v 有利于减小内核的长度,减小内核消耗的内存; 不需要的功能就不要选; 与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。3、菜单项:(1)、单个配置选项的定义:关键字是config,后面几行是这个选项的属性。config ARCH_RPC /定义的宏bool RiscPC / 选项的类型 选择提示select ARCH_ACORN /依赖关系 depends 依赖关系select FIQselect TIMER_ACORNhelp /帮助信息 On the Acorn Risc-PC, Linux can support the internal IDE disk and CD-ROM interface, serial and parallel port, and the floppy drive.default y /默认值range 2 32 /数字范围(2)、菜单依赖关系语法说明:= 相等则返回 “y”,否则”n”;!=相等则返回 “n”,否则”y”;( ) 返回表达式的值;& 返回 min 的结果|返回 max 的结果当表达式的值为 “m”“y”时,菜单显示。为“n”不显示。(3)、菜单的组织结构1)显示地声明为菜单Menu “Network device support”Depends NETConfig NETDEVICESEndmenuMenu 与Endmenu 之间 构成Network device support的子菜单,所有子项继承这菜单的依赖关系。2)通过依赖关系确定菜单的结构config REISERFS_FStristate Reiserfs supporthelp Stores not just filenames but the files themselves in a balanced tree. Uses journaling.config REISERFS_CHECKbool Enable reiserfs debug modedepends on REISERFS_FSREISERFS_CHECK依赖于REISERFS_FS,只有REISERFS_FS不是“n”,才显示。 各配置选项的意思见Linux内核的主要配置文档。3)添加与开发板平台支持的选项:/arch/arm/kconfig 是内核主配置文件。从文件中可以找到:menu System Type #定义了各个菜单项choice #choice 语句可以在菜单中生成一个多选项prompt ARM system type #prompt 选择提示 #系统平台选择项列表default ARCH_RPC。config ARCH_S3C2410bool Samsung S3C2410 #对于S3C2410 处理器的支持。source arch/arm/mach-s3c2410/Kconfig #定义了各种S3C2410处理器开发板的选项,和其支持的选项。4)除了手动配置菜单外,还可以通过导入预配置文件(顶层目录的 .config)进行配置,菜单会自动读取指定的配置文件:5)/arch/arm/mach-s3c2410 目录专门用来保存 s3c2410系列处理器相关的程序。其中:1、makefile和kconfig 是用于内核编译的。2、处理器相关的,如:clock.c, clock.h, cpu.c, cpu.h, s3c2410.c 内核中已经支持了各种平台。在Makefile 中可以通过配置来选择编译不同的目录。/arch/arm/makefile 完成这项任务:machine-$(CONFIG_ARCH_S3C2410) := s3c2410 #定义machine-y = s3c2410。ifneq ($(machine-y),)/MACHINE := arch/arm/mach-$(machine-y)/ #包含mach-s3c2410 子目录 2.6.12MACHINE := arch/arm/mach-$(word 1,$(machine-y)/ /2.6.32elseMACHINE :=endif然后编译生成顶层的vmlinux 映像。再由vmlinux压缩为zImage.四、Kbuild MakefileMakefile 包含5部分:1、.config 内核配置文件2、Arch/arm/Makefile 对应的体系结构的Makefile3、顶层目录的Makefile4、Scripts/makefile.* 所有Kbuild Makefile 的通用规则等定义5、各目录下的MakefileKbuild 编译过程:1、 取得.config2、 保存版本信息3、 创建连接符号 include/asm ,连接 /include/asm-$(ARCH)4、 递归地调用各子目录编译所有目标5、 生成顶层目录 vmlinux6、 编译生成最终的引导映像五、编译连接内核先编译连接生成顶层目录的vmlinux ,再把vmlinux 压缩和加上自引导程序连接成 /arch/($ARCH)/boot/zImage。1、编译连接vmlinux2、生成vmlinux.lds连接脚本(由vmlinux.lds.S生成)。(了解 arch/arm/kernel/vmlinux.lds.S)3、连接生成zImage在 arch/arm/Makefile 中: # zImage 的前提是vmlinux,vmlinux编译通过了才能生成zImagezImage Image xipImage bootpImage uImage: vmlinux4、system.map system.map 是一个特定内核的符号表,它包含内核全局变量和函数的地址信息。是编译过程中生成的。六、内核启动过程:1、如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的. (1)、在make zImage之后,用u-boot/tools/mkimage这个工具为内核加上u-boot引导所需要的文件头: /mini2440/u-boot-201003-suok/tools/mkimage -n linux-2.6.32 -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img(2)、下载内核时: nand erase 0x80000 300000 nand write 0x30008000 0x80000 300000 set bootcmd nand read 0x30008000 0x80000 300000;bootm 0x30008000 2、典型的内核映象是zImage,它是经过压缩的、具备自引导能力的linux内核映象。当CPU跳转到zImage的时候,第一个执行的是自引导程序; (1)自引导程序的主要责任是解压zImage中的vmlinux,并且引导vmlinux; (2)自引导程序的入口在 arch/$(ARCH)/boot/compressed/head.S文件中。 它将调用函数decompress_kernel(),这个函数在文件arch/arm/boot/compressed/misc.c中,decompress_kernel()又调用proc_decomp_setup(),arch_decomp_setup()进行设置,然后使用在打印出信息“Uncompressing Linux.”后,调用gunzip()。将内核放于指定的位置。 3、 CPU跳转到vmlinux的入口地址,顺序执行内核启动程序,其中包括: (1)初始化内核各个子系统; (2)初始化驱动程序; (3)挂载根文件系统; (4)启动用户空间的init进程等。 内核首先检查在命令行参数中有没有指定内核执行的第一个应用程序; 如果没有指定,则顺序执行/sbin/init, /etc/init, /bin/init, /bin/sh; 4、 Linux内核在挂载根文件系统之后,要执行文件系统中的应用程序。 具体代码如下:1、 Start:-2、decompress_kernel-3、call_kernel-/arch/arm/boot/compress/head.s/(其中decompress_kerne 是在/arch/arm/boot/compress /misc.c 实现)-start: / 1-wont_overwrite:movr0, r4movr3, r7bldecompress_kernel / 2 调用解压内核映像的C函数 / 在 arch/arm/boot/compressed/misc.c 实现bcall_kernel / 3 调用跳转到内核映像入口的子程序-call_kernel:blcache_clean_flush / 3blcache_offmovr0, #0movr1, r7 restore architecture numbermovpc, r4 call kernel / 5 调用内核-* r4 = kernel execution address / 6 内核执行的地址-arch/arm/boot/compressed/misc.cdecompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p, / 2 int arch_id)arch_decomp_setup(); /*解压前的初始化*/makecrc(); /*CRC 校验*/putstr(Uncompressing Linux.);gunzip(); /*调用解压函数 */putstr( done, booting the kernel.n);return output_ptr;-现在总结一下在进入解压后的内核入口前都做了些什么:(1) 保存从uboot中传入的参数(2) 执行一段处理器相关的代码(3)接着会判断一下要不要重定位,我们这里是不需要重定位,所以开始对bss段清零。(4)之后初始化页表,进行1:1映射。因为打开cache前必须打开mmu,所以这里先对页表进行初始化,然后打开mmu和cache。(5)这些都准备好后,判断一下解压内核是否会覆盖未解压的内核映像。如果会,则进行一些调整,然后开始解压内核;如果不会,则直接解压。最后是刷新cache,关闭mmu和dcache,使 cache和tlb内容无效,跳到解压后的内核入口执行arm相关的内核代码。4、Stext-5、b start_kernel-6、setup_arch()-7、rest_init()-8、init()-9、do_basic_setup()-10、prepare_namespace()-11、execve()/arch/arm/kernel/head.s-ENTRY(stext) /* 4 内核入口点 */ 。 #include head-common.S -/arch/arm/kernel/head-common.S bstart_kernel /* 5 由此跳到C 代码 */- /init/main.c asmlinkage void _init start_kernel(void) /* 5 C 代码的入口 */.setup_arch(&command_line); /* 6 激活处理器 */.rest_init(); /* 7 调用此函数,启动 init 线程*/-static void noinline rest_init(void)kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); /*3 启动init 线程 */.-tatic int _init kernel_init(void * unused) do_basic_setup(); /* 9 初始化设备驱动*/.prepare_namespace(); /* 10 挂载根文件系统*/.init_post(); /* 启动进程 */static noinline int init_post(void)run_init_process(execute_command); /* 启动用户空间的init 进程*/ /*init 进程是通过执行根文件系统中的init程序启动的*/*接下来顺序执行/sbin/init, /etc/init, /bin/init, /bin/sh; */run_init_process(/sbin/init);run_init_process(/etc/init);run_init_process(/bin/init);run_init_process(/bin/sh);panic(No init found. Try passing init= option to kernel.);init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序。init程序需要读取配置文件/etc/inittab。-static void run_init_process(char *init_filename) /内核首先检查在命令行参数中有没有指定内核执行的第一个应用程序;argv_init0 = init_filename;kernel_execve(init_filename, argv_init, envp_init); /* 11 */- -/arch/arm/kernel/sys_arm.cint kernel_execve()ret = do_execve(char *)filename, (char _user * _user *)argv,(char _user * _user *)envp, ®s); /* do_ execve 是执行用户空间的程序 */-/fs/exec.cint do_execve(char * filename,.) executes a new program.七 、 系统环境变量的设置方法1、配置路径 #echo $PATH# vi /.bashrc在其内添加: export PATH=/usr/local/arm/4.3.2/bin:$PATH #reboot 2、在编译的时候配置 #export PATH=/usr/local/arm/3.4.1/bin:$PATH 注意: 如果修改了 .bashrc路径,需要重新启动linux3、编译之前显示编译的版本信息#arm-linux-gcc v八、实验步奏(MINI2440的)1、cp config_mini2440_x35 .config 2、进入内核根目录看Makefile中关于编译器的前缀是否如下(这里是OK的,不用改):3、查看机器码和UBOOT中的是否一致,一致内核才能启动(这里是OK的,不用改):uboot/include/asm-arm/mach-types.h #define MACH_TYPE_MINI2440 1999 2.6.32/arch/arm/tools/mach-types mini2440 MACH_MINI2440MINI24401999查看UBOOT的信息也可看到: 即0x7cf=19994、make menuconfig 5、make zImage 进入/arch/arm/boot目录,用u-boot/tools/mkimage这个工具为内核加上u-boot引导所需要的文件头:/mini2440/u-boot-201003-suok/tools/mkimage -n linux-2.6.32 -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img(解释一下参数的意义:(具体可读mkimage使用详解.docx ) -A = set architecture to arch -O = set operating system to os -T = set image type to type -C = set compression type comp -a = set load address to addr (hex) 参数后是内核的运行地址 -e = set entry point to ep (hex) 参数后是入口地址 -n = set image name to name -d = use image data from datafile)1)如果我们没用mkimage对内核进行处理的话,那直接把内核下载到0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。2)如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。)6、下载内核tftp 0x30008000 uImage.img(1)下载完后可烧进flashnand erase 0x80000 300000nand write 0x30008000 0x80000 300000set bootcmd nand read 0x30008000 0x80000 300000;bootm 0x30008000saveenvreset(2) 也可以直接跳到刚才下载内核的地址去执行 Bootm 0x300080007、设置启动参数setenv bootargs root=/dev/nfs nfsroot=53:/opt/rootfs/ ip=00 init=/linuxrc console=ttySAC0,115200 display=sam320saveenvreset6、对W35屏的补充:W35屏是320*240的,而X35是240*320的,所以如果是W35的屏,应对内核的/arch/arm/mach-s3c2440/mach-mini2440.c 作如下修改,其他的不变:#elif defined(CONFIG_FB_S3C2410_X240320)#define LCD_WIDTH 240#define LCD_HEIGHT 320为:#elif defined(CONFIG_FB_S3C2410_X240320)#define LCD_WIDTH 320#define LCD_HEIGHT 240八、实验步奏(GEC2440的) 1、安装3.4.1 工作链 2、配置路径 3、解压内核原码 #mkdir /root/build_kernel #mkdir /root/build_kernel/linux (路经无关) #cd /root/build_kernel/linux 拷贝gec2440-linux-2.6.12.tar.bz2 #tar -jxvf gec2440-linux-2.6.12.tar.bz2 4、查看makefile # vi makefile 查看选项:ARCH:=arm/即打开arm特有的代码CROSS_COMPILE:=/usr/local/arm/3.4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024标准附条件借款合同书
- 2024二级建造师劳动合同
- 2024商场日常保洁服务合同
- 教育培训岗位聘任合同
- 湖北省武汉市七年级上学期语文期中试卷7套【附答案】
- 建筑工地施工人员合同范本2024
- 学术资源互享互惠协议
- 家庭长期发展规划协议书
- 省级总代理授权协议
- 2023年高考地理复习精题精练-中国的能源安全(新高考专用)(解析版)
- 2023年天津公务员已出天津公务员考试真题
- 2025年高考数学专项题型点拨训练之初等数论
- 教科版三年级科学上册《第1单元第1课时 水到哪里去了》教学课件
- 通信技术工程师招聘笔试题与参考答案(某世界500强集团)2024年
- 国际贸易术语2020
- 国网新安规培训考试题及答案
- 2024至2030年中国节流孔板组数据监测研究报告
- 黑龙江省哈尔滨市师大附中2024-2025学年高一上学期10月阶段性考试英语试题含答案
- 第六单元测试卷-2024-2025学年统编版语文三年级上册
- 【课件】Unit4+Section+B+(Project)课件人教版(2024)七年级英语上册
- 青少年法治教育实践基地建设活动实施方案
评论
0/150
提交评论