嵌入式linux那点事儿TheEmbeddedLinuxThatSomethingTHEAUTHOR:YANGANGDATE:August27-2013前言最近几年随着android,ios嵌入式操作系统的出现,智能手机风靡全球,造就了许多公司的快速发展,如mi,htc,samsung,HUAWEI,Apple等等,同时悲剧的是NOKIA公司带来了危机。对于嵌入式的爱好者,有些以前从事嵌入式Linux的工作,转向嵌入式android方面的工作;对于我们大学生,也开始学习嵌入式Linux,学习android;也有许多从事计算机的工作者,现在也开始为android手机编写android应用程序。由于android的内核是linux,android的发展也需要linux内核的发展,对于以后想做android工作的同学,需要先学习嵌入式linux,再学习android底层是很容易的,android只是对linux底层做了些封装库;对于想做android应用开发的学生,只需要学习java就可以了,再熟悉下android的系统调用接口即可。本书主要讲的是嵌入式linux的uboot,kernel,busybox中的源码分析,注重函数的调用关系,几乎没讲ARM的裸机程序,大家可以参考别人的书籍,讲解最详细的是内核使用在驱动上的机制,如poll机制,同步,异步,互斥,阻塞,还有驱动的框架,platform平台机制,input输入子系统,但愿对大家学习嵌入式有所帮助。致在校大学生的一封信我是辽宁科技大学的在读大四学生,电子信息工程专业,从大一来的时候的一直好好学习,看数电,模电和电路基础等等课本,但是越看越没有信心,不知道以后能干什么,以后可以干什么,总觉得自己天天上课认真听课,下课认真看书,就是个好学生,就可以找个好的工作。其实错了,天天看单片机的书,却连个单片机也没有见过,学过嵌入式的,到后来也许只记得有个东西叫ARM,如果这样学了几年,最后也许什么也不会,不画画电路板,那些数电和模电也没有用。不是书没有用,而是你不知道书怎么看,我告诉大家,书可以5天看完,但是你通过做实验,需要5个月的时间把书全部弄懂,在大学却恰好相反,讲了5个月,却做了5天的实验。我大二的时候,对大学彻底失望了,也不爱学了,但觉得也不能混日子,还是去外边打工吧,最起码可以挣个生活费,除了上课听个课,下课就出去打工了,但是自己心里也明白打工也不是长久之计,心里还是有点恐慌,怕自己毕业找不到工作,无论如何还是比学那些自己觉得没意思的课本开心点儿,就这样度过了一年。到大三了,开了许多的专业课,在上单片机的课程时,我发现我真的找到了自己的爱好了,后来就开始学习单片机,后来也买了单片机开发板,学习很多的内容,学得非常开心,后来接触了ARM,就准备学习ARM,可开发板就600多块钱,心里还是有点犹豫,后来还是咬牙买了TQ2440。刚开始学习ARM,还是像学习单片机一样的学习,其实错了,ARM有人说入门难,其实不是难在硬件,而是linux系统,涉及linux,就需要学习linux系统的很多东西,后来自己摸索学习,效率不是很高,直到看了韦东山老师的视频,越学越有意思,大三暑假放假,决定回家闭门学习嵌入式linux,开始学裸机,后来分析uboot,后来了解Linux内核,学习busybox,后来是从0开始写linux设备驱动程序,每天早上8点开始学习,直到晚上12点,虽然很累,但是心里是特别的开心,发自内心的开心,我觉得这才是爱好,别把儿时的梦想当作爱好。经过暑假的学习,让我了解了嵌入式系统,了解了Linux,学到里很多东西。我是个嵌入式的爱好者,我也会坚持做嵌入式linux,专业是在念大学时的事,职业是在公司时的事,爱好才是一辈子的事。希望大家找到自己的爱好,只有爱好才会给自己源源不断的动力。大学是最宝贵的学习时间,这是不可否认的,当你在毕业后,大学的时光再也回不去了。希望大家做个有爱好,有梦想,有激情的大学生。闫刚2013年8月27日于辽宁科技大学7WhyLearningARM-Linux1.为什么要选择ARM架构的处理器芯片?答案:ARM处理器芯片的应用是很广泛的,尤其是在智能手机出现之后,几乎垄断了整个市场。2.为什么要选择linux嵌入式系统?答案:linux是开源的,很多的嵌入式爱好者在研究linux,网上关于linux系统的资料很多,Linux是一个非常优秀的操作系统。3.为什么要选择ARM9处理器芯片?答案:ARM9芯片拥有MMU,可以跑标准的Linux内核,有人说先学ARM7,再学ARM9,比较好,我觉得如果你学过ARM7,最好,如果没有学过,直接学ARM9.4.选择什么样的开发板好?答案:其实全世界的开发板都差不多,仅仅是led,key,lcd不同,什么公司的开发板都可以,最好选择销量比较多的,是因为有很多人在学习,你可以互相交流,这里推荐韦东山老师的jz2440.5.不买开发板可以吗?答案:不可以,实在家里贫困,可以出去打工挣钱买。6.学习嵌入式需要买什么书?答案:个人认为不买也可以,买了也许你也不看,网上可以下载书籍的PDF文档,需要学的书很多,不可能全买。7.学习嵌入式的流程是怎么样的?(见下图)ubootkernelbusyboxapps整个嵌入式系统启动流程嵌入式系统启动的流程,程序执行的过程,也就是我们学习的过程,内核启动代码(uboot),内核(linuxkernel),根文件系统(busybox),应用程内序(application)。对于这些内容,并不是所有程序都需要写,很多源码是开源的,我们关注主要是:1.针对不同的开发板,需要移植相应的linux设备驱动程序.2.编写应用程序uboothardware_init()//uboot启动的第一阶段,主要是cpu内部--ldpc,_start_armboot//进入uboot的第二阶段--init_sequence[]//单板外围设备的初始化lcd,gpio,serial--nand_init()--main_loop()--run_command(nandread,0)//读内核到内存--run_command(bootm,0)//启动内核--setup_tag//设置tag,记录内存的大小和,nand的大小--theKernel(0,bd-bi_arch_number,bd-bi_boot_params)//记录机器ID和启动参数//到这里,cpu的控制权交给了内核kernel--bl__lookup_machine_type@r5=machinfo//检查board机器ID,来自于Uboot--adrlr,__enable_mmu//使能MMU--bstart_kernel--parse_tags(tags)//解析tag--kernel_init()//创建内核线程--prepare_namespace--mount_root()//挂载文件系统--init_post()run_init_process(init=/linuxrc)//启动了内核的第一个程序busybox--init_main()--parse_inittab()---run_actions(SYSINIT)//把应用程序写到/etc/init.d/rcS文件中//在这里启动QQ,Google,Facebook啦Apps目录第一章嵌入式编程基础...............................................................11.1嵌入式Linux工具的安装和使用介绍..........................................................................11.1.1ping通主机和宿主机linux和开发板之间的网络........................................11.1.2flashFXP软件的使用..........................................................................................81.1.3secureCRT软件,SSH2协议,登陆linux服务器..........................................101.1.4segger烧写NorFlash.....................................................................................121.1.5在vmware中添加硬盘.......................................................................................141.2Linux下的编程基础......................................................................................................181.2.1GNU风格C语言编程.........................................................................................181.2.2GNU风格基于arm体系架构汇编语法...........................................................211.3Linux下的常用工具......................................................................................................241.3.1命令行的使用.......................................................................................................241.3.2vi编辑器命令的使用..........................................................................................251.3.3Makefile文件格式..............................................................................................291.3.4Kconfig文件......................................................................................................291.3.5TFTP服务器的配置...........................................................................................30第二章Uboot移植......................................................................332.1uboot的启动过程分析..................................................................................................332.1.1分析uboot顶层目录的Makefile文件.............................................