ARM嵌入式LINUX应用程序设计_第1页
ARM嵌入式LINUX应用程序设计_第2页
ARM嵌入式LINUX应用程序设计_第3页
ARM嵌入式LINUX应用程序设计_第4页
ARM嵌入式LINUX应用程序设计_第5页
已阅读5页,还剩591页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM嵌入式LINUX应用

程序设计课程介绍嵌入式程序设计是嵌入式系统概论后修课程。该课程基于ARM+linux硬软件平台进行程序开发,具体的开发平台是EDUK4;该课程重点是在掌握嵌入式系统开发流程的基础上,搭建嵌入式交叉编译平台,实现基于平台的基本应用程序设计,接口驱动程序设计和高级应用程序设计。2023/2/12教材弓雷.ARM嵌入式Linux系统开发详解(第2版).清华大学出版社.2014,2.2023/2/13参考资料基于S3C2410嵌入式Linux开发实验与实践,实验开发平台的实验指导书,深圳市英蓓特信息技术有限公司从实践中学嵌入式LINUX应用程序设计,华清远见嵌入式学院,培训规划教材ARM嵌入式linux培训班视频教学(14.4G)深入LINUX设备驱动程序内核机制嵌入式linux系统工程师培训标准教材2023/2/14第1章LINUX开发基础2023/2/15内容摘要Linux的诞生与发展Linux的内核结构Linux存储管理Linux进程管理Linux内核启动与初始化进程2023/2/16Linux的诞生与发展2023/2/17UNIX操作系统是美国贝尔实验室于1969年夏在DECPDP-7小型计算机上开发的一个分时操作系统Linux操作系统的诞生、发展和成长过程始终依赖着以下五个重要支柱:MINIX系统是由AndrewS.Tanenbaum(AST)1987年开发的,主要用于学生学习操作系统原理GNU计划旨在开发一个类似Unix、并且是自由软件的完整操作系统:GNU系统。POSIX可移植操作系统接口标准是由IEEE开发的,由ISO/IEC标准化的一簇标准。该标准是基于现有的UNIX实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。如果没有Internet网,没有遍布全世界的无数计算机黑客通过网络的无私奉献,那么Linux绝对不可能发展到现在的水平。Linux的诞生与发展从Linux诞生开始,Linux内核就从来没有停止过升级,从0.02版本到1999年具有里程碑意义的2.2版本,一直到我们现在看到的4.0版本。2023/2/18Linux内核版本有两种:--稳定版和开发版Linux内核的命名机制:

num.num.num--第一个数字是主版本号--第二个数字是次版本号--第三个数字是修订版本号从未停止过升级Linux的应用领域2023/2/19服务器桌面系统嵌入式应用LinuxLinux嵌入式系统开发平台2023/2/110系统软件平台系统硬件平台嵌入式Linux系统需要下面三个基本元素:系统引导工具——用于机器加电后的系统定位引导。Linux微内核——内存管理、程序管理。始化进程

但如果要它成为完整的操作系统并且继续保持小型化,还必须加上硬件驱动程序、硬件接口程序和应用程序组。选定硬件平台前,首先要确定系统的应用功能和所需要的速度,并制定好外接设备和接口标准。这样才能准确地定位所需要的硬件方案,得到性价比最高的系统。应用功能速度1外接设备接口标准2+=性价比第1节Linux操作系统概述2023/2/111建立交叉开发环境交叉编译和链接交叉调试系统测试建立交叉开发环境2023/2/112商业类型ARMSoftwareDevelopmentToolkitSDSCrosscompiler

MetrowerksCodeWarrior交叉开发环境GNU工具链交叉开发环境是指编译、链接和调试嵌入式应用软件的环境。它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式。常用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型代表是GNU工具链。开放类型交叉编译和链接在完成嵌入式软件的编码之后,就是进行编译和链接,以生成可执行代码。由于开发过程大多是在Intel公司x86系列CPU的通用计算机上进行的,而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器这就要求在建立好的交叉开发环境中进行交叉编译和链接。2023/2/113建立交叉开发环境交叉编译和链接交叉调试系统测试交叉调试2023/2/114硬件调试:如果不采用在线仿真器,可以让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。软件调试:在Linux内核中设置一个调试桩用作调试过程中和宿主机之间的通信服务器。然后在宿主机中通过调试器的串口与调试桩进行通信应用软件的调试:

嵌入式上层应用软件的调试可以使用本地调试和远程调试两种方法。

嵌入式

Linux交叉调试系统测试2023/2/115

测试技术指的是软件测试的专门途径,以及能够更加有效地运用这些途径的特定方法。在嵌入式软件测试中,常常要在基于目标机的测试和基于宿主机的测试之间做出折衷。基于目标机的测试需要消耗较多的时间和经费,而基于宿主机的测试虽然代价较小,毕竟是在仿真环境中进行的。嵌入式软件测试中经常用到的测试工具:内存分析工具性能分析工具覆盖分析工具缺陷跟踪工具嵌入式Linux面临的挑战2023/2/116Linux的实时扩充性改变Linux内核体系结构完善Linux的集成开发环境123Solution

扩展Linux的实时性能向外扩展向上扩展Linux的内核体系采用的是

Monolithic内核体系结构

Microkernel一个完整的嵌入式系统的集成开发环境一般需要提供的工具是:编译/连接器内核调试/跟踪器集成图形界面开发平台编辑器调试器软件仿真器监视器整体集成开发环境还有待提高和完善嵌入式Linux的发展及应用前景由于Linux具有对各种设备的广泛支持性,因此,能方便地应用于机顶盒、IA设备、PDA、掌上电脑、WAP手机、寻呼机、车载盒以及工业控制等智能信息产品中。与PC相比,手持设备、IA设备以及信息家电的市场容量要高得多,而Linux嵌入式系统的强大的生命力和利用价值,使越来越多的企业和高校表现出对它极大的研发热情。Linux嵌入式操作系统所具有的技术优势和独特的开发模式给业界以新异,有理由相信,它能成为Internet时代嵌入式操作系统中的最强音。2023/2/117Linux内核特点2023/2/118Linux内核编程容易可移植性可量测性模块化稳定性和可靠性安全性标准化和互用性完善的网络支持Linux内核既能支持32位体系结构又能支持64位体系结构。Linux内核全部源代码是遵守GPL软件许可的免费软件开发者可以免费得到社区的贡献、支持、检查代码和测试。驱动程序可以免费发布给其他人,可以静态编译进内核。以源码形式发布驱动程序,可以不必为每一个内核版本和补丁版本都提供二进制的程序Linux内核的组成2023/2/119进程调度程序(SCHED)负责控制进程访CPU。保证进程能够公平地访问CPU,同时保证内核可以准时执行一些必需的硬件操作;内存管理程序(MM)使多个进程可以安全地共享机器的主存系统,并支持虚拟内存;虚拟文件系统(VFS)通过提供一个所有设备的公共文件接口,VFS抽象了不同硬件设备的细节。此外,VFS支持与其他操作系统兼容的不同的文件系统格式;网络接口(NET)提供对许多建网标准和网络硬件的访问;进程间通信(IPC)子系统为进程与进程之间的通信提供了一些机制。这5部分之间是相互依赖的关系存储管理2023/2/120内存管理任务屏蔽各种硬件的内存结构并向上层返回统一的访问界面页式存储管理机制每个页面的大小随处理机芯片而异支持虚拟内存

硬件无关部分进程的映射和逻辑内存的对换硬件相关部分为内存管理硬件提供了虚拟接口分类页表每个进程保留一张页表,用于将本进程空间中的虚拟地址变换成物理地址。进程调度2023/2/121当需要选择下一个进程运行时,由调度程序选择最值得运行的进程,依据每个进程的task_struct结构policypriorityrt-prioritycounter

policy是进程的调度策略两类Linux进程:普通进程与实时进程实时进程的优先级高于其他进程

priority是调度管理器分配给进程的优先级

是进程允许运行的时间rt_priority用于实时进程间的选择

调度器使用这个域给每个实时进程一个相对优先级可以通过系统调用来改变实时进程的优先级。counter是进程剩余的时间片内核源代码目录结构2023/2/122documentationscriptslibnetfskernelipcdriversmminitincludearch内核源代码目录结构Linux存储管理2023/2/123进程虚存空间的管理虚存空间的映射和虚存区域的建立

Linux的分页式存储管理物理内存空间的管理内存的分配与释放内存分配与释放的数据结构内存分配函数kmalloc()虚拟内存的申请和释放进程虚存空间的管理2023/2/124每一个进程,用一个mm-struct结构体来定义它的虚存用户区。

mm_struct结构体首地址在任务结构体task-struct成员项mm中:structmm-struct*mm。Linux的存储管理主要是管理进程虚拟内存的用户区Linux操作系统采用了请求式分页存储管理方法。系统为每个进程提供4GB的虚拟内存空间。各个进程的虚拟内存彼此独立。进程运行时能访问的存储空间只是它的虚拟内存空间。对当前该进程而言只有属于它的虚拟内存是可见的。mm_struct结构定义在/include/linux/schedul.h中进程虚存空间的管理2023/2/125structmm_struct{intcount;pgd_t*pgd;unsignedlongcontext;unsignedlongstart_code,end_code,start_data,end_data;unsignedlongstart_brk,brk,start_stack,start_mmap;unsignedlongarg_start,arg_end,env_start,env_end;unsignedlongrss,total_vm,locked_vm;unsignedlongdef_flags;structvm_area_struct*mmap;structvm_area_struct*mmap_avl;structsemaphoremmap_sem;};mm_struct结构定义在/include/linux/schedul.h中进程虚存空间的管理2023/2/126structvm_area_struct{structmm_struct*vm_mm;unsignedlongvm_start;unsignedlongvm_end;pgprot_tvm_page_prot;unsignedshortvm_flags;shortvm_avl_height;structvm_area_struct*vm_avl_left;structvm_area_struct*vm_avl_right;structvm_area_struct*vm_next;structvm_area_struct*vm_next_share;structvm_area_struct*vm_prev_share;structvm_operations_struct*vm_ops;unsignedlongvm_offset;structinode*vm_inode;unsignedlongvm_pte;};定义在/include/linux/mm.h中每个虚拟区域用一个vm-area-struct结构体进行描述虚存空间的映射和虚存区域的建立2023/2/127虚拟存储技术用户的代码和数据(可执行映像)等并不是完整地装入物理内存,而是全部映射到虚拟内存空间。在进程需要访问内存时,在虚拟内存中“找到”要访问的程序代码和数据等unsignedlongdo_mmap(structfile*file,unsignedlongaddr,unsignedlonglen,unsignedlongprot,unsignedlongflags,unsignedlongoff)Linux使用do_mmap()函数完成可执行映像向虚存区域的映射Linux的分页式存储管理2023/2/128页表是从线性地址向物理地址转换中不可缺少的数据结构,而且它使用的频率较高。页表必须存放在物理存储器中。Linux采用了三级页表结构,以利于节省物理内存。三级分页管理把虚拟地址分成四个位段:页目录、页中间目录、页表、页内编址。系统设置三级页表系列页目录PGDPaGeDirectory页中间目录PMDPageMiddleDirectory页表PTEPageTablE物理内存空间的管理2023/2/129物理内存的页面管理

空闲页面的管理—Buddy算法

Linux对物理内存空间按照分页方式进行管理,把物理内存划分成大小相同的物理页面。Linux设置了一个

mem_map[]数组管理内存页面。mem_map[]在系统初始化时由free_area_init

()函数创建,它存放在物理内存的底部(低地址部分)内存空闲空间的管理采用Buddy

算法Buddy算法是把内存中的所有页面按照2n划分,其中n=0~5,对一个内存空间按1个页面、2个页面、4个页面、8个页面、16个页面、32个页面进行六次划分。对于每种页面块按前后顺序两两结合成一对Buddy“伙伴”。内存分配与释放的数据结构2023/2/130Linux中用于内存分配和释放的函数主要是kmalloc()和kfree(),它们用于分配和释放连续的内存空间blocksize表page_descriptorsizes表block_header

kmalloc()和kfree()分配和释放内存是以块(block)为单位进行的可以分配的空闲块的大小记录在blocksize表中,它是一个静态数组

加在页面块前部的信息头称为页描述符

Linux设置了sizes[]数组,对页面块进行描述数组元素是size_descriptor结构体blocksize[]与sizes[]元素数目相同,它们一一对应由sizes[]管理的各个页面块中每个块的头部还有一个对该块进行描述的块头block_header内存分配函数kmalloc()2023/2/131void*kmalloc(size_tsize,intpriority)voidkfree(void*__ptr)参数size是申请分配内存的大小priority是申请优先级ptr是kmalloc分配的内存空间的首地址GFP_KERNELGFP_ATOMIC

GPF_DMA虚拟内存的申请和释放2023/2/132在申请和释放较小且连续的内存空间时,使用kmalloc()和kfree()申请和释放较大的内存空间时,使用vmalloc()和vfree()void*vmalloc(unsignedlongsize)voidvfree(void*addr)用法和kmalloc()和kfree()一样由vmalloc()申请的内存空间在虚拟内存中是连续的,它们映射到在物理内存时,可以使用不连续的物理页面,而且仅把当前访问的部分放在物理页面中由vmalloc()分配的虚存空间称为虚拟内存块(虚存块)Linux进程管理介绍2023/2/133Linux是一个多用户多任务的操作系统。指多个用户可以在同一时间使用计算机系统多任务是指Linux可以同时执行几个任务操作系统监控着一个等待执行的任务队列,这些任务包括用户作业操作系统任务邮件打印作业操作系统根据每个任务的优先级为每个任务分配合适的时间片进程与作业2023/2/134

Linux系统上所有运行的东西都有可以看成进程在自身的虚拟地址空间运行的一个单独的程序随时都可能发生变化的使用系统运行资源的动态的++程序+进程进程和作业的概念也有区别:一个正在执行的进程称为一个作业作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令作业控制指的是控制正在运行的进程的行为。手工启动2023/2/135启动一个进程有两个主要途径:手工启动调度启动由用户输入命令,直接启动一个进程便是手工启动。手工启动进程又分为前台启动和后台启动前台启动是手工启动一个进程的最常用的方式。一般用户键入一个命令“ls–l”,这就已经启动了一个进程,而且是一个前台的进程直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。调度启动2023/2/136有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,要使用自动启动进程的功能,就需要掌握以下几个启动命令:at命令cron命令crontab命令用户使用at命令在指定时刻执行指定的命令序列。也就是说,该命令至少需要指定一个命令、一个执行时间才可以正常运行。可以不断重复一些命令cron命令是不应该手工启动的crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。每个用户都可以有自己的crontab文件。进程的挂起与恢复2023/2/137作业控制允许将进程挂起并可以在需要时恢复进程的运行,被挂起的作业恢复后将从中止处开始继续运行。只要在键盘上按【Ctrl+Z】,即可挂起当前的前台作业。使用jobs命令可以显示Shell的作业清单,包括具体的作业、作业号以及作业当前所处的状态。恢复进程执行时,有两种选择:用fg命令将挂起的作业放回到前台执行;用bg命令将挂起的作业放到后台执行。进程管理2023/2/138由于Linux是个多用户系统,同时也是一个多进程系统,经常需要对这些进程进行一些调配和管理,就要知道当前的进程情况。who命令w命令ps命令top命令kill命令该命令主要用于查看当前线上的用户情况可以显示出当前用户当前正在进行的工作是非常强大的进程查看命令top命令和ps命令的基本作用是相同的该命令可以终止后台进程nohup命令使进程在用户退出后仍继续执行Linux内核启动和初始化进程2023/2/139开机自检核心引导阶段bootsect阶段setup阶段head.S阶段main.c阶段init进程和inittab引导脚本确定用户登录模式执行内容/etc/rc.d/rc.sysinit启动内核的外挂模块及各运行级的脚本开机自检2023/2/140在刚开机时,根据X86CUP的特性,代码段寄存器的值为全1,指令计数器的值为全0,即CS=FFFF、IP=0000。这时CPU根据CS和IP的值执行FFFF0H处的指令,FFFF0H处的指令一般总是一个JMP指令,这个地址通常是ROMBIOS的入口地址。接着,ROMBIOS进行开机自检,如检查内存,键盘等。在自检过程中,ROMBIOS会在上位内存中进行扫描,看看是否存在合法的设备控制卡ROMBIOS(如:SCSI卡上的ROM),如果有,就执行其中的一些初始化代码。最后,ROMBIOS读取磁盘上的第一个扇区并将这个扇区的内存装入内存。核心引导阶段2023/2/141在Grub或者Lilo等引导程序成功完成引导Linux系统的任务之后,Linux就可从它们手中接管了CPU的控制权。在这个过程中主要用到该目录下的这几个文件:bootsect.S、setup.S以及compressed目录下head.S等。首先要介绍一下,Linux的内核通常是压缩过后的,包括如上述提到的那几个重要的汇编程序,它们都是在压缩内核vmlinuz中的。因为Linux中提供的内核包含了众多驱动和功能,因而比较大,所以采用压缩内核可以节省大量的空间。bootsect阶段2023/2/142当grub读入vmlinuz后,会根据bootsect,把它自身和setup程序段读到不大于0x90000开始的内存里,然后grub会跳过bootsect那512bytes的程序段,直接运行setup里的第一条指令。就是说bzImage里bootsect的程序没有再被执行了,而bootsect.S在完成了指令搬移之后就退出了。之后执行权就转到了setup.S的程序中。内核启动过程setup阶段2023/2/143setup.S的主要功能就是利用ROMBIOS中断读取机器系统数据,并将系统参数保存到0x90000~0x901FF开始的内存中位置。此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,它还会设置CPU的控制寄存器CR0,从而进入32位保护模式运行,并跳转到绝对地址为0x100000,同时执行startup_32。CPU0x100000startup_32head.S阶段2023/2/144当运行到head.S时,系统已经运行在保护模式,而head.S完成了一个重要任务就是将内核解压。就如本节前面提到的,内核是通过压缩的方式放在内存中的,head.S通过调用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0X100000的。接下来head.S程序完成寄存器、分页表的初始化工作,但要注意的是,这个head.S程序与完成解压缩工作的head.S程序是不同的,它在源代码中的位置是arch/i386/kernel/head.S程序与完成解压缩工作的head.S程序是不同的在完成了初始化之后,head.S就跳转到start_kernel()函数中去了。main.c阶段2023/2/145start_kernel()是“init/main.c”中的定义的函数,start_kernel()调用了一系列初始化函数,进行内核的初始化工作。要注意的是,在初始化之前系统中断是被屏蔽的,另外内核也处于被锁定状态,以保证只有一个CPU用于Linux系统的启动。在start_kernel()的最后,调用了init()函数输出Linux版本信息设置与体系结构相关的环境页表结构初始化使用“arch/alpha/kernel/entry.S”中的入口点设置系统自陷入口使用alpha_mv结构和entry.S入口初始化系统IRQprintk(linux_banner)setup_arch()paging_init()trap_init()Init_IRQ()init进程和inittab引导脚本2023/2/146init进程是系统所有进程的起点,内核在完成内核引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。inittab是以行为单位的描述性(非执行性)文本,每一个指令行都具有以下格式:id:runlevel:action:process入口标识符运行级别运行级别具体的执行程序id一般要求4个字符以内,对于getty或其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。runlevel是init所处于的运行级别的标识,一般使用0-6以及S或s。initdefault是一个特殊的action值,用于标识缺省的启动级别,sysinit、boot、bootwait等action将在系统启动时无条件运行,确定用户登录模式2023/2/147在“/etc/inittab”中列出了登录模式,其中的单人维护模式是类似于Windows中的“安全模式”,在这种情况下,系统不加载复杂的模式,从而使系统能够正常启动。其中本系统中默认的为5,也就是X-Windows多用户模式。单人维护模式多用户无网络模式文字界面多用户模式X-Windows多用户模式登录模式?执行内容/etc/rc.d/rc.sysinit2023/2/148rc.sysinit中最常见的动作就是:激活交换分区检查磁盘加载硬件模块如果没有其他boot、bootwait动作运行级别3/etc/rc.d/rc将会得到执行命令行数3/etc/rc.d/rc3.d/目录下的文件rc3.d下的文件都是指向/etc/rc.d/init.d/目录下各个Shell脚本的符号连接。getty和login2023/2/149mingetty程序能打开终端,设置模式。同时它会显示一个文本登录界面,这个界面就是经常看到的登录界面,在这个登录界面中会提示用户名,而用户输入的用户名将作为参数传给login程序来验证用户的身份。login程序在getty的同一个进程空间中运行,接受getty传来的用户名参数作为登录的用户名。当用户登录通过了这些检查后,login将搜索/etc/passwd文件用于匹配密码、设置主目录和加载shell在设置好shell的uid、gid,以及TERM,PATH等环境变量以后,进程加载shell,login的任务也就完成了mingettyusername:passwd:login等待用户登录2023/2/150系统初始化完毕后,INIT为每一个虚拟控制台和终端启动一个GETTY进程。GETTY进程负责接受和检验用户的登录要求。至此,LINUX系统的启动工作全部完成。不同核心版本的LINUX的启动过程有一定的差异,不同发行版本的LINUX的启动也可能稍有不同,但基本过程是类似的。另外,在“BOOT:”后,利用“LINUXSINGLE”命令可以迫使LINUX进入单用户模式,除不要求用户登录和不启动虚拟终端以外,启动过程的其它部分也基本类似。Linux常用命令2023/2/151常用命令及帐户管理用户管理用户组管理文件权限设定文件、目录操作命令使用光盘和U盘文件、目录操作命令使用光盘和U盘Linux命令格式2023/2/152Linux命令的组成部分命令字命令选项命令参数command[option][arguments]执行的命令命令的选项,说明对命令的要求命令的参数,描述命令作用的对象表示选项或参数可有可无,即参数并非必须命令格式举例2023/2/153$ls-l/home命令参数命令提示符命令字命令选项命令组成部分用空格进行分隔命令中的其他组成2023/2/154命令提示符表示命令输入的状态管理员root用户的提示符“#”[root@localhost~]#普通用户提示符“$”[teacher@localhost~]$命令的各组成部分之间用空格分隔命令的输入以回车键结束获得命令帮助2023/2/155help命令$helppwd“--help”命令选项$touch--help使用man命令阅读手册页$manls使用info命令阅读信息页$infols文件、目录操作命令2023/2/156目录操作命令lspwdcdmkdirrmdir文件操作命令filetouchcprmmvfind文本文件查看命令catmorelessheadtail目录命令实例2023/2/157列目录$ls$ls-l显示当前目录名称$pwd更改当前目录$cd/etc$cd../bin建立和删除目录$mkdirmydir$rmdirmydir路径的表示2023/2/158相对路径是以“.”或“..”开始的目录路径表示形式cd./testls../bin绝对路径是以“/”开始的路径表示形式ls/cd/home文件操作命令2023/2/159命令功能file显示指定文件的类型touch建立指定名称的文件或更新文件时间cp复制文件或目录rm删除文件或目录mv移动文件或目录,文件或目录重命名find在指定目录查找符合条件的文件文件命令实例2023/2/160检测文件类型$file/etc/passwd建立空文件$touchtfile文件查找按文件名进行查找$find.-namefile*按文件属主进行查找$find.-userteacher复制和删除文件$cpfileafileb$rmfilea文件移动与重命名$mvfileafileb$mvfileadira/文本文件查看命令2023/2/161命令功能cat显示文本文件内容more分页显示文本文件内容less分页显示文本文件内容,并可方便反复浏览head显示文件首部内容tail显示文件尾部内容文本查看实例2023/2/162显示文本$cat/etc/passwd分页显示文本$more/etc/passwd分页文本浏览$less/etc/passwd显示文件首$head-5/etc/passwd显示文件尾$tail-5/etc/passwd用户系统命令2023/2/163命令功能su用于将普通用户身份转变为超级用户ps显示当前系统中由该用户运行的进程列表kill删除执行中的程序或工作fdisk查看硬盘分区情况及对硬盘进行分区管理网络相关命令2023/2/164命令功能ifconfig网络信息查看ping测试和远程计算机的联网状态telnet进入指定的目录ftp创建指定名称的目录光盘的基本使用2023/2/165光盘驱动器设备文件/dev/cdrom挂载光盘使用mount命令#mount-tiso9660/dev/cdrom/media/cdrom/光盘内容的读取使用命令访问光盘挂载点目录#ls/media/cdrom/卸载光盘使用umount命令#umount/dev/cdrom光盘驱动器托盘的弹出与收回2023/2/166弹出光盘驱动器托盘#eject收回光盘驱动器托盘#eject-t光盘镜像文件操作2023/2/167使用cp命令制作光盘镜像文件#cp/dev/cdrommydatacd.iso使用mount命令挂载光盘镜像文件#mount-oloop-tiso9660mydatacd.iso/media/cdrom/通过挂载点目录访问ISO镜像文件的内容#ls/media/cdrom/使用umount命令卸载光盘镜像文件#umount/media/cdrom/U盘的使用方法2023/2/168识别USB存储设备包括USB硬盘、U盘、MP3播放器等/dev/sda /dev/sdb……#fdisk-l使用mount命令挂载U盘#mount-tvfat/dev/sda1/mnt/通过挂载点目录访问U盘的内容#ls/mnt使用umount命令卸载U盘#umount/mnttar命令建立归档2023/2/169对文件和目录进行归档$tarcfmyfiles.tarfiles/对文件和目录进行压缩归档$tarczfmyfiles.tar.gzfiles/命令名命令选项c表示建立归档z表示对归档进行压缩f用于指定建立的归档文件名命令参数,归档文件名命令参数,需要进行归档的文件或目录名查看归档中的文件列表2023/2/170查看归档文件中的目录列表$tartfmyfiles.tar.gz查看压缩归档文件中的目录列表$tartzfmyfiles.tar

命令名命令选项t表示查看归档z表示归档文件是压缩格式f用于指定归档文件名命令参数,需要查看的归档文件名恢复归档文件2023/2/171恢复归档文件$tarxfmyfiles.tar恢复压缩的归档文件$tarxzfmyfiles.tar.gz恢复归档文件到指定目录$tarxzfmyfiles.tar.gz-Crestore/

命令名命令选项x表示回复归档z表示归档是压缩格式f用于指定归档文件名归档文件名-C指定归档恢复的目标目录归档恢复的目录名创建、查看、恢复归档和压缩文件2023/2/172归档和压缩

tarcvfredhat.tarredhat tarz(j)cvfredhat.tar.gz(bz2)redhat查看归档和压缩文件

tartvf redhat.tar tartz(j)vf redhat.tar.gz(bz2)恢复归档文件和压缩文件

tarxvf redhat.tar tarz(j)xvf redhat.tar.gz(bz2)Linux软件的安装目前在Linux界软件安装方式最常见方法是:dpkg

最早是由DebianLinux社群所开发出来的,透过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息。只要是衍生于Debian的其他Linux发行版大多使用dpkg这个机制来管理软件,如B2D、Ubuntu等等。RPM

最早是由RedHat这家公司开发出来的,很多Linux发行版

使用该机制来作为软件安装的管理方式,如Fedora、CentOS、SuSE等等。2023/2/173Linux软件的在线升级2023/2/174Linux软件管理机制使用指令线上升级机制(指令)RedHat/FedoraRPMrpmYUM(yum)Debian/UbuntuDPKGdpkgAPT(apt-get)目前新的Linux开发商都有提供这样的『线上升级』机制,透过这个机制,原版光盘(ISO)就只有第一次安装时需要用到而已,其他时候只要有网路,妳就能够取得原本开发商所提供的任何软件了呢!在dpkg管理机制上就开发出APT的线上升级机制,RPM则依开发商的不同,有RedHat系统的yum,SuSE系统的YastOnlineUpdate(YOU),Mandriva的urpmi软件等。Linux软件包安装2023/2/175目的rpm用法dpkg用法安装指定包rpm-ipkgfile.rpmdpkg-ipkgfile.debLinux软件包信息查询2023/2/176目的rpm用法dpkg用法显示所有已安装包名称rpm-qadpkg-l(小写L)显示包内的所有文件rpm-ql软件(小写L)dpkg-L软件名称显示特定文件所属包名称rpm-qf/path/to/filedpkg-S/path/to/file查询包信息rpm-qippkgfile.rpm(显示包信息)

rpm-qlppkgfile.rpm(小写L,显示包内所有文件)dpkg-Ipkgfile.deb(大写i)

dpkg-cpkgfile.deb显示指定包是否安装rpm-q软件(只显示包名称)

rpm-qi软件(显示包信息)dpkg-l软件(小写L,显示简单信息)

dpkg-s软件(显示详细信息)

dpkg-p软件(显示详细信息)Linux软件包卸载2023/2/177目的rpm用法dpkg用法卸载指定包rpm-e软件名称dpkg-r软件(会留下包配置信息)dpkg-P软件(完全移除)Debian下使用alien处理RPM包2023/2/178alien可处理.deb、.rpm、.slp、.tgz等格式文件的格式转换或安装。在Debian系Linux下安装非Debian系包时,可使用alien进行安装。安装alien包:apt-getinstallalien在Debian安装RPM包:alien-iquota-3.12-7.i386.rpm制作成deb的包格式:alien-dquota-3.12-7.i386.rpm制作成rpm的包格式:alien-rquota_3.12-6_i386.debAPT2023/2/179apt-setup设定/etc/apt/souces.listapt-getupdate软件资料库同步apt-getinstall软件1[软件2]安装软件apt-getremove软件1[软件2...]移除软件(保留设定档)apt-get--purgeremove软件1[软件2...]移除软件(不保留设定档)apt-cachesearch软件名称列出所有sofrwarename的包apt-upgrade[软件1软件2...]更新包,不指定包名则更新所有可更新的包apt-getclean(autoclean)删除系统暂存的deb(autoclean只会将比目前系统旧版的包删除)apt-getdist-upgrade转换系统的版本(需在/etc/apt/sources.list指定stable,testing或unstable)YUM2023/2/180yuminstall软件1[软件2]安装包yumupdate[软件

1软件

2...]更新包,不指定包名则更新所有可更新的包yumlist列出目前在yumserver上面有的包yuminfo类似rpm-qiyumclean移除下载到本机的packages或headersyumremove软件1[软件2]移除已经安装的包Ubuntu常用ROOT命令2023/2/181命令功能sudo+命令以root权限执行命令sudo-i切换到root用户模式下sudonautilus以root权限打开文件或是文件夹sudo

passwdroot为root用户设置密码suroot切换到root用户模式下,需先调用:sudo

passwdroot用户管理命令2023/2/182命令功能adduser添加用户帐号passwd设置(更改)用户口令userdel删除用户帐号(及宿主目录)usermod设置用户属性用户帐号管理2023/2/183建立用户帐号#adduserst01设置用户口令#passwdst01删除用户帐号#userdel-rst01设置用户帐号属性锁定用户帐号禁止登录#usermod-Lst01用户组管理命令及文件2023/2/184命令功能groupadd添加指定名称的用户组帐号groupdel删除指定名称的用户组帐号文件功能/etc/group保存用户组帐号信息用户组帐号管理2023/2/185添加用户组#groupaddclass1

在建立用户时指定用户组#adduser-gclass1st03更改用户的组帐号#usermod-gclass1st01删除用户组#groupdelclass1用户帐号相关文件和目录2023/2/186用户帐号信息保存在passwd文件中/etc/passwd用户的加密口令保存在shadow文件中/etc/shadow用户的宿主目录是home目录中与用户名称相同的目录/home/teacher用户的初始配置文件来在skel目录(配置模版)/etc/skel查看文件的权限属性2023/2/187文件权限(-rw--r--r--)#ls-linstall.log-rw-r--r--1rootroot26195Dec1710:42install.log权限表示权限项读写执行读写执行读写执行字符表示(r)(w)(x)(r)(w)(x)(r)(w)(x)数字表示421421421权限分配文件所有者文件所属组用户其他用户使用chmod命令更改文件属性2023/2/188chmod命令用于更改文件对于某类用户的操作权限chmod[ugoa...][[+-=][rwx]FILE...设置权限的对象,可以是用户、组、其他人或所有人属性操作符+增加权限-减少权限=设置权限为权限内容,可以是读、写、执行权限的组合被设置属性的文件或目录文件权限设置实例2023/2/189使用chmod命令设置文件权限查看文件权限$ls-lafile-rw-rw-r--1st01class10Apr316:52afile增加文件属主st01的执行权限(x)$chmodu+xafile去除文件属组class1的写权限(w)$chmodg-wafile设置其他用户的文件权限为可执行$chmodo=xafile

设置文件属主和属组2023/2/190chown命令用于设置文件的属主和属组命令格式chownOWNER[:[GROUP]]FILE...

设置文件afile的属主为用户st01#chownst01afile

设置文件afile的属组为用户组class1#chown:class1afile设置文件afile的属主为st03,并设置文件的属组为class2#chownst03:class2afile

文本编辑器vi2023/2/191vi是在Linux操作系统的字符界面下使用的全屏幕文本编辑器。和常用的图形界面下的文本编辑器不同,它只能编辑字符,不能对字体和段落进行排版,没有菜单,只有命令,而且命令繁多。但是,由于在字符界面下操作Linux可以使用户更好地了解Linux的运行状况,保证各项设定的正确执行,因此,常用vi来编辑和修改文件内容,实现系统管理、系统设定、服务器参数设定等工作。vi仍旧是Unix/Linux系列操作系统中非常重要的文本编辑器,也可以说是一款非常经典的字处理软件。提示:Linux系统中的参数文件几乎都是ASCII码的纯文本文件,因此利用任何一款文本编辑软件都可以修改Linux的参数文档。文本编辑器vi的三种模式命令模式(又称为一般模式):当用vi打开一个文件时,默认的工作模式就是命令模式。编辑模式:按下“i,I,o,O,a,A,r,R”等字母之后可以进入编辑模式。最后行模式(又称为末行模式):在命令模式中输入“:”就可以将光标移动到屏幕最后一行。2023/2/192vi三种工作模式的相互转换关系2023/2/193命令模式编辑模式最后行模式ESC自动返回i,o,a:/移动光标,查找,替换,删除字符,删除整列,复制整列,粘贴整列。可输入任何字符。保存文件,退出vi。vi三种模式进入vi的命令模式启动vi的命令格式为:vi[文件]说明:如果不指定文件或者指定的文件不存在,则新建一个文件;如果指定的文件存在,则打开该文件在vi的命令模式下所有输入的字母都被当作编辑命令解释并执行,而不会在屏幕上显示。如果行首有“~”符号,则表示此行为空行。2023/2/194进入vi的命令模式举例:建立一个名为test.txt的文件[root@testroot]#vitest.txt打开的vi界面分为两部分:编辑区和命令/状态区最后一行左下角显示这个文件的当前状态:如果是新建文件,则显示“文件名”[NewFile];如果是已存在文件,则显示当前文件的名称,行数和字符数,如“文件名”XL,XXC2023/2/195进入vi的编辑模式在命令模式下,只要输入i,I,o,O,a,A任何一个字母就可以进入编辑模式。在编辑模式中,最后一行的左下角会出现--INSERT--字样,这表明此时在编辑区可以输入任意字符要想退出编辑模式,只需要按下ESC键即可2023/2/196进入最后行模式在命令模式下输入“:”,光标会移动到最后一行,在该模式下,可以实现字符的替换,设置行号,保存文件并退出vi等操作例如“:wq”表示存盘并退出当前vi2023/2/197VI命令模式下有关光标移动的命令2023/2/198h或←光标向左移动一个字符j或↓光标向下移动一个字符k或↑光标向上移动一个字符l或→光标向右移动一个字符Ctrl+f屏幕向前翻动一页Ctrl+b屏幕向后翻动一页Ctrl+d屏幕向前翻动半页Ctrl+u屏幕向后翻动半页+光标移动到非空格符的下一行-光标移动到非空格符的上一行VI命令模式下有关光标移动的命令2023/2/199n<space>按下数字后再按空格键,光标会在当前行向右移动n个字符,如20空格

0移动到光标所在行的第一个字符处$移动到光标所在行的最后一个字符处H光标移动到当前屏幕最上方那一行M光标移动到当前屏幕中央的那一行L光标移动到当前屏幕最下方那一行G光标移动到文件的最后一行nG光标从文件开头向下移动到第n行,例如20G,可以和setnu配合使用n<enter>光标从当前位置处向下移动n行命令模式下有关查找和替换的命令2023/2/1100/word在光标之后查找名为word的字符串?word在光标之前查找名为word的字符串n继续查找满足条件的字符串N改变查找的方向,继续查找满足条件的字符串命令模式下的删除、复制和粘贴2023/2/1101x,Xx为向后删除n一个字符,X为向前删除一个字符nx向后删除n个字符dd删除光标所在的那一整列ndd删除光标所在列的向下n列,例如20dd,向下删除20列d1G删除光标所在行到第一行的所有数据dG删除光标所在行到最后一行的所有数据yy复制光标所在行nyy复制光标所在行的向下n列,例如20yy,向下复制20列y1G复制光标所在列到第一列的所有数据yG复制光标所在列到最后一列的所有数据p,Pp为复制的数据粘贴在光标下一行,P为粘贴在光标的上一行J将光标所在列与下一列的数据结合成一列u撤销前一个动作.重复前一个动作VI编辑模式下有关光标移动的命令vi编辑器中“上下左右”变为“ABCD”的问题先卸载vim-tiny:sudoapt-getremovevim-common

再安装vimfull:sudoapt-getinstallvim这是因为ubuntu预装的是vimtiny版本,安装vimfull版本即可解决。2023/2/1102编辑模式下的常用命令2023/2/1103i在当前光标所在处插入要输入的字符,光标后面的字符会向后退I将光标移动到当前行的行首插入字符a从当前光标的下一个字符的位置添加字符,已存在的字符会向后退A将光标移动到当前行的行尾添加字符o在光标所在行的下方插入一行O在光标所在行的上方插入一行r替换光标所指的那一个字符R一直替换光标所指的字符,直到按下Esc为止ESC退出编辑模式,回到命令模式最后行模式下的常用命令

2023/2/1104:w将编辑的数据保存至硬盘文件中:w!若文件属性为只读,强制写入该文件:q退出vi,若文件被改动,则提示无法退出信息:q!不保存文件,直接退出vi:wq保存文件后退出:wq!强制保存文件后退出:w[filename]将数据保存到另一个文件中,相当于另存为:r[filename]将另一个文件的内容加入到当前文件光标所在行的后面最后行模式下的常用命令2023/2/1105:setnu显示行号,设定之后,会在每一行前面出现行号:setnonu取消行号:n1,n2con3将从n1行到n2行之间(包括n1,n2行本身)的所有文本复制到n3行之下:n1,n2mn3将从n1行到n2行之间(包括n1,n2行本身)的所有文本移动到n3行之下:n1,n2d删除从n1行到n2行之间(包括n1,n2行本身)的所有文本:n1,n2s/$1/$2/g将n1行到n2行之间(包括n1,n2行本身)所有字符串1用字符串2替换第2章嵌入式Linux编程基础2023/2/1106Linux程序开发过程2023/2/1107编辑编译链接运行调试对源代码进行编辑,VI(GEDIT)对源代码编译,生成目标程序,GCC将分散的模块组成一个可执行的整体运行编译好的程序./目标文件名调试运行时的错误GDB初识GCCGNUprojectCandC++CompilerGNUCompilerCollectiongcc是一个全功能的

ANSI

C

兼容编译器,它是所有UNIX系统可用的C、C++编译器。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。2023/2/1108GCC安装确认网络正常连接;在终端界面中输入指令:sudoapt-getinstallbuild-enssential或sudoapt-getinstallgcc中间需要输入两次或一次:Y后就会自动安装。安装完毕后输入以下指令查看GCC是否安装成功。gcc–version或gcc-v2023/2/1109GCC与G++的关系GCC用于编译多种语言编写的程序,主要是C;G++用于编译C++程序,以GCC为基础,编译过程中加入了C++的支持库,参数与GCC基本一致;可以利用GCC编译C++程序,但是需要在参数中加入引用的C++库,比如libstdc++(如gcc-oout–lstdc++main.cc)。2023/2/1110GCC编译处理流程预处理(Preprocessing):分析各种预处理命令,如#define,#include,#if等;编译(Compilation):根据输入文件产生汇编语言程序;汇编(Assembly):将汇编语言输入,产生扩展名为.o的目标文件;链接(Linking):以.o目标文件,库文件作为输入,生成可执行文件(在Linux系统中,可执行文件没有统一的后缀,其主要由文件的属性来区分)。2023/2/1111源程序文件(.h,.c,.cc,.etc)经预处理的文件(.i,.ii)汇编语言文件(.s)目标文件(.o)可执行程序(.out)GCC文件类型.c为后缀的文件,C语言源代码文件;.a为后缀的文件,是由目标文件构成的静态库文件;.so为后缀的文件,是由目标文件构成的动态库文件;.C,.cc或.cxx为后缀的文件,是C++源代码文件;.h为后缀的文件,是程序所包含的头文件;.i为后缀的文件,是已经预处理过的C源代码文件;.ii为后缀的文件,是已经预处理过的C++源代码文件;.m为后缀的文件,是Objective-C源代码文件;.o为后缀的文件,是编译后的目标文件;.s为后缀的文件,是汇编语言源代码文件;.S为后缀的文件,是经过预编译的汇编语言源代码文件。2023/2/1112GCC的常用选项选项含义-ofile将经过gcc处理过的结果存为文件file,这个结果文件可能是预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为source.suffix,如果这个选项被省略了,那么生成的可执行文件默认名称为a.out;目标文件默认名为source.o;汇编文件默认名为source.s;生成的预处理文件则发送到标准输出设备。-E不生成文件,只输出预处理结果(输出终端)-S只预处理和编译,把文件编译成为汇编代码2023/2/1113GCC的常用选项2023/2/1114-c预处理,编译和汇编,生成.o的obj文件

。编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。-g[gdb]调试选项,在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入gdb扩展的调试信息,方便使用gdb来进行调试。-pg调试选项,产生供gprof剖析用的可执行文档:gcc-pghelloworld.c。-O[0、1、2、3]优化编译。对生成的代码使用优化,中括号中的部分为优化级别,缺省的情况为2级优化,0为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。GCC的常用选项2023/2/1115-Idirname指定搜索系统头文件的目录,可以重复使用多个该选项指定多个目录,是在预编译过程中使用的参数。先在你所制定的目录查找,然后再按常规的顺序去找头文件。-Ldirname在dir这个目录寻找被-l的库,指定编译时搜索库的路径。-lname在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。-fpic或-fPIC产生位置无关的目标代码,以构造共享库(sharedlibrary)。-static连接器将忽略动态连接库,同时通过将静态目标文件直接包含到结果目标文件完成对所有引用的解析。禁止与共享库链接,若没有,则优先选择共享库链接-shared产生共享库,在创建共享函数库时使用。GCC的常用选项2023/2/1116-w禁止输出警告信息-Wwarning允许产生warning类型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示显示所有警告。如果warning取值为error,其含义是将所有警告转换为错误(error),即出现警告就停止编译。-ansi支持ANSI/ISOC的标准语法,取消GNU的语法中与该标准有冲突的部分,但并不保证生成与ANSI兼容代码。-Dmacro-Dmacro=value相当于在源程序中使用#definemacro1-Umacro取消宏的定义-M生成文件关联的信息。包含目标文件所依赖的所有源代码。-v查看当前系统gcc的版本信息常见的预编译指令#include指令:头文件包含指令#define指令:宏定义指令#if、#else和#endif指令:条件编译指令2023/2/1117#include指令:头文件包含指令该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用""括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为“h”或“cpp”的头文件。一般为/usr/include路径注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用""把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。

2023/2/1118#define指令:宏定义指令该指令常用有二种用法:第一种是定义标识,标识有效范围为整个程序,形如#defineXXX,常与#if配合使用;第二种是定义常数,如#definemax100,则max代表100;注意:这种情况下使用const定义常数更好,const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)。2023/2/1119#if、#else和#endif指令:条件编译指令2023/2/1120条件编译指令程序员在源程序中通过定义不同的宏来决定编译程序对哪些代码进行处理。利用GCC编译第一个程序2023/2/1121#include<stdio.h>intmain(void){

printf(“hello大家好!\n”);

return0;}程序名称存为”hello.c”GCC常用编译指令1、无选项编译链接用法:$gcc

hello.c作用:将hello.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out2、选项

-o用法:$gcc

hello.c

-o

hello作用:将hello.c预处理、汇编、编译并链接形成可执行文件hello(可自定义名称)。-o选项用来指定输出文件的文件名。3、选项

-E(大写)用法:$gcc

-E

hello.c

-o

hello.i作用:将hello.c预处理输出hello.i文件。2023/2/1122GCC常用编译指令4、选项

-S(大写)用法:$gcc

-S

hell

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论