大学LINUX基础及应用教程-陈英-课件PPT
收藏
资源目录
压缩包内文档预览:(预览前20页/共30页)
编号:21836392
类型:共享资源
大小:12.24MB
格式:ZIP
上传时间:2019-09-06
上传人:QQ24****1780
认证信息
个人认证
王**(实名认证)
浙江
IP属地:浙江
25
积分
- 关 键 词:
-
大学
linux
基础
应用
利用
运用
教程
陈英
课件
ppt
- 资源描述:
-
大学LINUX基础及应用教程-陈英-课件PPT,大学,linux,基础,应用,利用,运用,教程,陈英,课件,ppt
- 内容简介:
-
陈英 梁建武主编 中国水利水电出版社,Linux基础及应用,第10章 Linux内核机制,陈英 梁建武主编 中国水利水电出版社,10.1 Linux内核简介,10.1.1 Linux内核的地位 Linux操作系统由4个主要的子系统所组成: 1)用户应用程序:在某个特定的Linux系统上运行的应用程序集合,它将随着该计算机系统的用途不同而有所变化,但一般会包括文字处理应用程序和Web浏览器。 2)O/S服务:这些服务一般认为是操作系统的一部分(命令外壳程序等)。 3)Linux内核:包括内核抽象和对硬件资源(如CPU)的间接访问。 4)硬件控制器:,陈英 梁建武主编 中国水利水电出版社,10.1.2 系统初始化及运行 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM - BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x 7C00,并开始执行此处的代码。,陈英 梁建武主编 中国水利水电出版社,10.1.3 内核提供的各种系统调用 1系统的基本数据结构 进程控制表中的每一项都是一个task _ struct 结构,而task _ struct结构本身是在include /linux/sched . h中定义的。,陈英 梁建武主编 中国水利水电出版社,进程控制表既是一个数组,又是一个双向链表,同时又是一个树。其物理实现是一个包括多个指针的静态数组。此数组的长度保存在include/linux/tasks.h 定义的常量NR_ TASKS中,其缺省值为128,数组中的结构则保存在系统预留的内存页中。链表是由next_task 和prev _ task两个指针实现的,而树的实现则比较复杂。,陈英 梁建武主编 中国水利水电出版社,系统启动后,内核通常作为某一个进程的代表。一个指向task _ struct的全局指针变量current用来记录正在运行的进程。 某一个进程只能运行在用户方式(user mode)或内核方式(kernel mode)下。用户程序运行在用户方式下,而系统调用运行在内核方式下。,陈英 梁建武主编 中国水利水电出版社,2创建和撤消进程 1)申请一个空闲的页面来保存task _ struct。 2)查找一个空的进程槽(find _ empty _ process ())。 3)为kernel _ stack _ page申请另一个空闲的内存页作为堆栈。 4)将父进程的LDT表拷贝给子进程。 5)复制父进程的内存映射信息。 6)管理文件描述符和链接点。,陈英 梁建武主编 中国水利水电出版社,10.1.4 存取文件系统 Linux在系统内核和文件系统之间提供了一种叫做VFS(virtual file system)的标准接口。这样,文件系统的代码就分成了两部分:上层用于处理系统内核的各种表格和数据结构;而下层用来实现文件系统本身的函数,并通过VFS来调用。,陈英 梁建武主编 中国水利水电出版社,10.2 Linux内核源代码,10.2.1 了解Linux内核源码 Linux内核源码的版本号 Linux内核源码的版本号表示方法非常简单:所有偶数版(如2.0.30 )都是已发行的稳定版;所有奇数版(如2.1.42 )都是测试版。,陈英 梁建武主编 中国水利水电出版社,显示内核版本号 显示内核版本号的方法如下: #ls /boot 对内核源码的修改,陈英 梁建武主编 中国水利水电出版社,10.2.2 内核机制 1Bottom Half处理 系统内核中可以有多达32个不同的bottom half 处理程序。bh _ base中保存着指向每一个bottom half处理程序的指针。 2任务队列 任务队列是系统内核将任务推迟到以后再做的方法。Linux系统有一个机制可以把任务放入到队列中等待以后处理。,陈英 梁建武主编 中国水利水电出版社,3计时器 Linux有两种系统定时器,在某一系统时间同时被调用,但它们在实现上略有不同。第一种,即老的定时器机制,有一个包含32个指针的静态数据组和一个活跃定时器屏蔽码( timer _ active ),这些指针指向timer _ struct数据结构,定时器程序与定时器表的连接是静态定义的,大多数定时器程序入口是在系统初始化时加入到定时器表中的;第二种,即新的定时器机制,使用了一个链表,表中的timer _ list数据结构以递增的超时数排序。,陈英 梁建武主编 中国水利水电出版社,4等待队列 很多情况下处理器因等待某种系统资源而无法继续运行,例如:处理器需要一个描述目录的VFS索引节点,但该索引节点当前不在内存缓冲区中,这样处理器就必须先等到索引节点从磁盘中读到内存之后,才能继续运行。对于这种等待的处理,Linux内核使用了一种简单的数据结构等待队列,其中包括一个指向task _ struct的指针和一个指向队列中下一元素的指针。,陈英 梁建武主编 中国水利水电出版社,10.2.3 内核模块的装入与卸载 对于Linux的内核模块,可以用insmod或rmmod命令显式地载入或卸载,或是由内核在需要时调用内核守护程序(kerneld)进行载入和卸载。,陈英 梁建武主编 中国水利水电出版社,10.3 Linux内核分析,10.3.1 相关源代码的分析 1系统的引导和初始化 Linux 系统的引导有好几种方式:常见的有 Lilo, Loadin引导和Linux的自举引导 (bootsect-loader),而后者所对应源程序为arch/i386/boot/bootsect.S,它为实模式的汇编程序;无论是哪种引导方式,最后都要跳转到 arch/i386/Kernel/setup.S,setup.S主要是进行时模式下的初始化,为系统进入保护模式做准备;,陈英 梁建武主编 中国水利水电出版社,陈英 梁建武主编 中国水利水电出版社,3中断总控程序 中断总控程序主要负责保存处理机执行系统调用前的状态,检验当前调用是否合法, 并根据系统调用向量,使处理机跳转到保存在 sys_call_table 表中的相应系统服务例程的入口;从系统服务例程返回后恢复处理机状态退回用户程序;而系统调用向量则定义在/usr/src/ linux/include/asm-386/unistd.h 中;sys_call_table 表定义在/usr/src/linux/arch/i386/kernel /entry.S 中;同时在 /usr/src/linux/include/asm-386/unistd.h 中也定义了系统调用的用户编程接口。,陈英 梁建武主编 中国水利水电出版社,10.3.2 对内核源码的修改 1在kernel/sys.c中增加系统服务 asmlinkage int sys_addtotal(int numdata) int i=0,enddata=0; while(i=numdata) enddata+=i+; return enddata; ,陈英 梁建武主编 中国水利水电出版社,2把 asmlinkage int sys_addtotal( int) 的入口地址加到sys_call_table表中 arch/i386/kernel/entry.S 中的最后几行源代码修改前为: . . .long SYMBOL_NAME(sys_sendfile) .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ .long SYMBOL_NAME(sys_vfork) /* 190 */ .rept NR_syscalls-190 .long SYMBOL_NAME(sys_ni_syscall) .endr,陈英 梁建武主编 中国水利水电出版社,修改后为: . . .long SYMBOL_NAME(sys_sendfile) .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ .long SYMBOL_NAME(sys_vfork) /* 190 */ /* add by I */ .long SYMBOL_NAME(sys_addtotal) .rept NR_syscalls-191 .long SYMBOL_NAME(sys_ni_syscall) .endr,陈英 梁建武主编 中国水利水电出版社,3把增加的 sys_call_table 表项所对应的向量,在include/asm-386/unistd.h 中进行必要声明,以供用户进程和其他系统进程查询或调用: 增加后的部分 /usr/src/linux/include/asm-386/unistd.h 文件如下: . . #define _NR_sendfile 187 #define _NR_getpmsg 188 #define _NR_putpmsg 189 #define _NR_vfork 190 /* add by I */ #define _NR_addtotal 191,陈英 梁建武主编 中国水利水电出版社,4测试程序(test.c)如下: include include _syscall1(int,addtotal,int, num) main() int i,j; do printf(“Please input a numbern“); while(scanf(“%d“, ,Linux基础及应用第10章 Linux内核机制10.1 Linux内核简介10.1.1 Linux内核的地位Linux操作系统由4个主要的子系统所组成:1)用户应用程序:在某个特定的Linux系统上运行的应用程序集合,它将随着该计算机系统的用途不同而有所变化,但一般会包括文字处理应用程序和Web浏览器。2)O/S服务:这些服务一般认为是操作系统的一部分(命令外壳程序等)。3)Linux内核:包括内核抽象和对硬件资源(如CPU)的间接访问。4)硬件控制器: 10.1.2 系统初始化及运行 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM - BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x 7C00,并开始执行此处的代码。10.1.3 内核提供的各种系统调用1系统的基本数据结构 进程控制表中的每一项都是一个task _ struct 结构,而task _ struct结构本身是在include /linux/sched . h中定义的。 进程控制表既是一个数组,又是一个双向链表,同时又是一个树。其物理实现是一个包括多个指针的静态数组。此数组的长度保存在include/linux/tasks.h 定义的常量NR_ TASKS中,其缺省值为128,数组中的结构则保存在系统预留的内存页中。链表是由next_task 和prev _ task两个指针实现的,而树的实现则比较复杂。 系统启动后,内核通常作为某一个进程的代表。一个指向task _ struct的全局指针变量current用来记录正在运行的进程。 某一个进程只能运行在用户方式(user mode)或内核方式(kernel mode)下。用户程序运行在用户方式下,而系统调用运行在内核方式下。 2创建和撤消进程1)申请一个空闲的页面来保存task _ struct。2)查找一个空的进程槽(find _ empty _ process ())。3)为kernel _ stack _ page申请另一个空闲的内存页作为堆栈。4)将父进程的LDT表拷贝给子进程。5)复制父进程的内存映射信息。6)管理文件描述符和链接点。10.1.4 存取文件系统 Linux在系统内核和文件系统之间提供了一种叫做VFS(virtual file system)的标准接口。这样,文件系统的代码就分成了两部分:上层用于处理系统内核的各种表格和数据结构;而下层用来实现文件系统本身的函数,并通过VFS来调用。 10.2 Linux内核源代码10.2.1 了解Linux内核源码Linux内核源码的版本号 Linux内核源码的版本号表示方法非常简单:所有偶数版(如2.0.30 )都是已发行的稳定版;所有奇数版(如2.1.42 )都是测试版。 显示内核版本号显示内核版本号的方法如下:#ls /boot 对内核源码的修改10.2.2 内核机制1Bottom Half处理 系统内核中可以有多达32个不同的bottom half 处理程序。bh _ base中保存着指向每一个bottom half处理程序的指针。 2任务队列 任务队列是系统内核将任务推迟到以后再做的方法。Linux系统有一个机制可以把任务放入到队列中等待以后处理。 3计时器Linux有两种系统定时器,在某一系统时间同时被调用,但它们在实现上略有不同。第一种,即老的定时器机制,有一个包含32个指针的静态数据组和一个活跃定时器屏蔽码( timer _ active ),这些指针指向timer _ struct数据结构,定时器程序与定时器表的连接是静态定义的,大多数定时器程序入口是在系统初始化时加入到定时器表中的;第二种,即新的定时器机制,使用了一个链表,表中的timer _ list数据结构以递增的超时数排序。4等待队列 很多情况下处理器因等待某种系统资源而无法继续运行,例如:处理器需要一个描述目录的VFS索引节点,但该索引节点当前不在内存缓冲区中,这样处理器就必须先等到索引节点从磁盘中读到内存之后,才能继续运行。对于这种等待的处理,Linux内核使用了一种简单的数据结构等待队列,其中包括一个指向task _ struct的指针和一个指向队列中下一元素的指针。10.2.3 内核模块的装入与卸载 对于Linux的内核模块,可以用insmod或rmmod命令显式地载入或卸载,或是由内核在需要时调用内核守护程序(kerneld)进行载入和卸载。 10.3 Linux内核分析10.3.1 相关源代码的分析1系统的引导和初始化 Linux 系统的引导有好几种方式:常见的有 Lilo, Loadin引导和Linux的自举引导 (bootsect-loader),而后者所对应源程序为arch/i386/boot/bootsect.S,它为实模式的汇编程序;无论是哪种引导方式,最后都要跳转到 arch/i386/Kernel/setup.S,setup.S主要是进行时模式下的初始化,为系统进入保护模式做准备; 2系统初始化后运行的第一个内核程序 asmlinkage void _init start_kernel(void) 是系统初始化后运行的第一个内核程序,它定义在 /usr/src/linux/init/main.c中,通过调用usr/src/linux/arch/i386/kernel/traps.c 中的一个函数 void _init trap_init(void) 把各自陷和中断服务程序的入口地址设置到 idt 表中,其中系统调用总控程序system_cal就是中断服务程序之一; 3中断总控程序 中断总控程序主要负责保存处理机执行系统调用前的状态,检验当前调用是否合法, 并根据系统调用向量,使处理机跳转到保存在 sys_call_table 表中的相应系统服务例程的入口;从系统服务例程返回后恢复处理机状态退回用户程序;而系统调用向量则定义在/usr/src/ linux/include/asm-386/unistd.h 中;sys_call_table 表定义在/usr/src/linux/arch/i386/kernel /entry.S 中;同时在 /usr/src/linux/include/asm-386/unistd.h 中也定义了系统调用的用户编程接口。 10.3.2 对内核源码的修改1在kernel/sys.c中增加系统服务asmlinkage int sys_addtotal(int numdata) int i=0,enddata=0; while(i=numdata) enddata+=i+; return enddata; 2把 asmlinkage int sys_addtotal( int) 的入口地址加到sys_call_table表中arch/i386/kernel/entry.S 中的最后几行源代码修改前为:. . .long SYMBOL_NAME(sys_sendfile) .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ .long SYMBOL_NAME(sys_vfork) /* 190 */ .rept NR_syscalls-190 .long SYMBOL_NAME(sys_ni_syscall) .endr 修改后为:. . .long SYMBOL_NAME(sys_sendfile) .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ .long SYMBOL_NAME(sys_vfork) /* 190 */ /* add by I */ .long SYMBOL_NAME(sys_addtotal) .rept NR_syscalls-191 .long SYMBOL_NAME(sys_ni_syscall) .endr 3把增加的 sys_call_table 表项所对应的向量,在include/asm-386/unistd.h 中进行必要声明,以供用户进程和其他系统进程查询或调用:增加后的部分 /usr/src/linux/include/asm-386/unistd.h 文件如下: . . #define _NR_sendfile 187 #define _NR_getpmsg 188 #define _NR_putpmsg 189 #define _NR_vfork 190 /* add by I */ #define _NR_addtotal 191 4测试程序(test.c)如下:include include _syscall1(int,addtotal,int, num) main() int i,j; do printf(Please input a numbern); while(scanf(%d,&i)=EOF); if(j=addtotal(i)=-1) printf(Error occurred in syscall-addtotal();n); printf(Total from 0 to %d is %d n,i,j); 陈英 梁建武主编 中国水利水电出版社,Linux基础及应用,第11章 嵌入式Linux,陈英 梁建武主编 中国水利水电出版社,11.1嵌入式系统简介,11.1.1 嵌入式系统的定义 嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。 Linux提供了完成嵌入功能的基本的内核和所需要的所有用户界面,它是多面的。它能处理嵌入式任务和用户界面。将Linux看作是连续的统一体,从一个具有内存管理、任务切换和时间服务及其他的分拆的、微内核到完整的服务器,支持所有的文件系统和网络服务。,陈英 梁建武主编 中国水利水电出版社,11.1.2 嵌入式系统的特征 嵌入式系统是面向用户、面向产品、面向应用的,如果独立于应用自行发展,则会失去市场。嵌入式处理器的功耗、体积、成本、可靠性、速度、处理能力、电磁兼容性等方面均受到应用要求的制约,这些也是各个半导体厂商之间竞争的热点。,陈英 梁建武主编 中国水利水电出版社,11.2 嵌入式Linux基础,11.2.1 嵌入式Linux的应用 信息家电:PDA,机顶盒,Digital Telephone,Answering Machine,Screen Phone; 数据网络:Ethernet Switches,Router,Bridge,Hub,Remote access servers,ATM,Frame relay; 远程通信; 医疗电子; 交通运输; 计算机外设; 工业控制; 航空航天领域,陈英 梁建武主编 中国水利水电出版社,11.2.2 Linux作为嵌入式操作系统的优势 1免许可证费用 嵌入式Linux的版权费是免费的,其购买费用仅为媒介成本。大多数的商业操作系统,例如Windows, Windows CE对每套操作系统收取一定的许可证费用。相对地,Linux是一个免费软件,并且公开源代码。只要不违反GPL(General Public License,通用版权许可协议),就可以自由应用和发布Linux。,陈英 梁建武主编 中国水利水电出版社,2有很高的稳定性 在PC硬件上运行时,Linux是非常可靠和稳定的,特别是和现在流行的一些操作系统相比。 有两个因素会影响稳定性,一是使用了混乱的驱动程序。驱动程序的选择很有限,有些稳定有些不稳定。一旦离开了通用的PC平台,需要自己编写。二是使用了硬盘。,陈英 梁建武主编 中国水利水电出版社,3强大的网络功能 Linux天生就是一个网络操作系统,几乎所有的网络防议和网络接口都已经被定制在Linux中。Linux内核在处理网络防议方面比标准的Unix更具执行效率,在每一个端口上有更高的吞吐量。,陈英 梁建武主编 中国水利水电出版社,4丰富的开发工具 Linux提供C, C+, JAVA以及其他很多的开发工具。更重要的是,爱好者可以免费获得,技术上由全世界的自由软件开发者提供支持。 Linux基于GNU的工具包,此工具包提供了完整与无缝交叉平台开发工具,从编辑器到底层调试。其C编译器产生更有效率的执行代码。,陈英 梁建武主编 中国水利水电出版社,5实时性 在实时性能方面,RT_Linux ,Hardhat Linux 等嵌入式Linux支持实时性能;稳定性好,安全性好。,陈英 梁建武主编 中国水利水电出版社,11.3 Linux I/O端口编程,11.3.1如何在C语言下使用I/O端口 一般方法 在存取任何I/O端口之前,必须让程序有如此做的权限。要完成这个目的,可以在程序一开始的地方(但是,要在任何I/O端口存取动作之前)调用ioperm()这个函数(该函数在文件unistd.h中,并且被定义在内核中)。,陈英 梁建武主编 中国水利水电出版社,使用语法是: ioperm(from,num,turn_on) 其中from是第一个允许存取的I/O端口地址,num是接着连续存取I/O端口地址的数目。,陈英 梁建武主编 中国水利水电出版社,函数ioperm()只能取得端口地址0x000到0x3ff的存取权限;至于较高地址的端口,需要使用函数iopl()(该函数可以一次存取所有的端口地址)。将权限等级参数值设为3(例如,iopl(3)),以便程序能够存取所有的I/O端口(如果存取到错误的端口地址将对计算机造成各种不可预期的损害。同样地,调用函数iopl()必需要拥有root的权限。,陈英 梁建武主编 中国水利水电出版社,接着来实际地存取I/O端口。要从某个端口地址输入一个字节(8位)的信息,调用函数inb(port),该函数会传回所取得的一个字节的信息。要输出一个字节的信息,调用函数outb(value,port)。要从某两个端口地址x和x+1(两个字节组成一个字,故使用组合语言指令inw)输入一个字(16个bit)的信息,需要调用函数inw(x);要输出一个字的信息到两个端口地址,需要调用函数outw(value,x)。,陈英 梁建武主编 中国水利水电出版社,2替代方法:/dev/port 另一个存取I/O端口的方法是以函数open()打开文件/dev/port(一个字符设备,主设备编号为1,次设备编号为4),以便执行读与(或)写的动作(注意标准输出入函数f*()有内部的缓冲,所以要避免使用)。,陈英 梁建武主编 中国水利水电出版社,11.3.2 硬件中断与DMA存取 用户程序如果在用户模式下执行,不可以直接使用硬件中断(IRQ)或DMA。用户必须编写一个内核驱动程序。也就是说,在用户模式中所写的程序无法控制硬件中断的产生。,陈英 梁建武主编 中国水利水电出版社,11.3.3 延迟时间 在用户模式中执行的进程不能精确地控制时间,因为Linux是个多用户的操作环境,在执行中的进程随时会因为各种原因被暂停大约10ms到数秒(在系统负荷非常高的时候)。然而对于大多数使用I/O端口的应用程序而言,这个延迟时间实际上算不了什么。要缩短延迟时间,需要使用函数nice将你在执行中的进程设定成高优先权,或使用即时调度法(real-time scheduling)。,陈英 梁建武主编 中国水利水电出版社,11.4 嵌入式Linux开发,11.4.1 构造嵌入式Linux前先要了解的几个关键问题 1如何引导? 在PC上运行的Linux依靠PC的BIOS来提供这些配置和OS加载功能。 在一个嵌入式系统里经常没有这种BIOS。这样就要提供同等的启动代码。 在大多数情况下,一个最小的通电自检模块,可以检查内存的正常运行、让LED闪烁,并目驱动其它必须的硬件以使主Linux OS启动和运行。,陈英 梁建武主编 中国水利水电出版社,2需要虚拟内存吗? 由于CPU的原因,在嵌入式Linux中保存虚拟内存代码是明智的,因为将它清除很费事。而且还有另外一个原因它支持共享文本,这样就可以使许多程序共享一个软件。 虚拟内存的调入功能可以被关掉,只要将交换空间的大小设置为零。然后,如果用户写的程序比实际的内存大,系统就会当作用户的运行用尽了交换空间来处理,这个程序将不会运行。,陈英 梁建武主编 中国水利水电出版社,3选用什么样的文件系统? 实际上,许多商业性嵌入式系统,提供文件系统作为选项。许多或者是专用的文件系统或者是MS-DOS-Compatible文件系统。Linux提供MS-DOS-Compatible文件系统,同时还有其它多种选择。 文件系统可以被放在传统的磁盘驱动器、Flash Memory或其它这类的介质上。而且,用于暂时保存文件,一个小RAM盘就足够了。,陈英 梁建武主编 中国水利水电出版社,4如何消除嵌入式Linux系统对磁盘的依赖? 在一个嵌入式系统里,可能没有磁盘。有两种途径可以消除对磁盘的依赖,这要看系统的复杂性和硬件的设计。 在一个简单的系统里,当系统启动后,内核和所有的应用程序都在内存里。这就是大多数传统的嵌入式系统工作模式,它同样可以被Linux支持。 有了Linux,就有了第二种可能性。因为Linux已经有能力“加载”和“卸载”程序,一个嵌入式系统就可以利用它来节省内存。,陈英 梁建武主编 中国水利水电出版社,5嵌入式Linux达到怎样的实时性? 在嵌入式领域中,实时并非是最重要的。嵌入式系统常常被错误地分为实时系统,尽管多数系统一般并不要求实时功能。实时是一个相对的词,常常被严格地定义实时为对一事件以预定的方式在极短的时间如微秒作出响应,渐渐地,在如此短暂时间间隔内的严格实时功能在专用DSP芯片或ASIC上实现了。只有在设计低层硬件FIFO、分散/聚集DMA引擎和定制硬件时才会有这样的要求。,陈英 梁建武主编 中国水利水电出版社,11.4.2 嵌入式Linux开发环境,陈英 梁建武主编 中国水利水电出版社,嵌入式Linux开发流程,陈英 梁建武主编 中国水利水电出版社,11.4.3 开发嵌入式Linux的步骤 1精简内核 构造内核常用命令包括:make config, dep,clean,mrproper,zImage,bzImage,modules, modules install。 (1)make config 核心配置, (2)make dep 寻找依存关系。 (3)make clean 清除以前构核所产生的所有目标文件、模块文件、核心以及一些临时文件等,不产生任何文件。 (4)make rmproper 删除所有因构核过程中产生的所有文件。,陈英 梁建武主编 中国水利水电出版社,(5)make, make zImage, make bzImage make:构核。 make zImage:在make的基础上产生压缩的核心映象文件./arch/$ (ARCH) /boot/zImage以及在./arch/$ (ARCH) /boot/compresed/目录下产生一些临时文件。 make bzImage:在make的基础上产生压缩比例更大的核心映象文件./arch/$ (ARCH) /boot/bzImage以及在./arch/$ (ARCH) /boot/compresed/目录下产生一些临时文件。在核心太大时进行。 (6)make modules 编译模块文件。 (7)make modules install,陈英 梁建武主编 中国水利水电出版社,2系统启动 bootsect是第一个被读入内存中并执行的程序。bootsect的启动程序如下 : 第一步,bootsect将它从被ROM BIOS载入的绝对地址0x7C00处搬到0x90000处,然后利用一个jmpi(jump indirectly)的指令,跳到新位置的jmpi的下一行去执行。 第二步,将其他segment registers包括DS, ES, SS都指向0x9000这个位置,与CS看齐。另外将SP及DX指向一任意位移地址(offset),这个地址等一下会用来存放磁盘参数表(disk para- meter table)。 第三步,接着利用BIOS中断服务int 13h的第0号功能,重置磁盘控制器,使得刚才的设定发挥功能。,陈英 梁建武主编 中国水利水电出版社,第四步,完成重置磁盘控制器之后,bootsect就从磁盘上读入紧邻着bootsect的setup程序,也就是setup.S,此读入动作是利用BIOS中断服务int 13h的第2号功能。Setup的image将会读入至程序所指定的内存绝对地址0x90200处,也就是在内存中紧邻着bootsect所在的位置。待setup的image读入内存后,利用BIOS中断服务int 13h的第8号功能读取目前磁盘的参数。 第五步,读入Linux的kernel。在读入前,将会先呼叫BIOS中断服务int l0h的第3号功能,读取游标位置,之后再呼叫BIOS中断服务int l0h的第13h号功能,在屏幕上输出字串“Loading”,这个字串在boot linux时都会首先被看到。 第六步,接下来做的事是检查root device,陈英 梁建武主编 中国水利水电出版社,3驱动程序 在Linux系统里,设备驱动程序所提供的这组入口点由一个结构来向系统进行说明,此结构定义为: #include struct file_ operations int (*lseek)(struct inode *inode,struct file *filp, off_ t off, int pos); int (*read) (struct inode *inode, struct file *filp, char *buf, int count); int (*write)(struct inode *inode,struct file *filp, char *buf, int count);,陈英 梁建武主编 中国水利水电出版社,int (*readdir)(struct inode *inode,struct file *filp, struct dirent *dirent, int count); int (*select)(struct inode *inode,struct file *filp, int sel_ type, select_ table *wait); int (*ioctl) (struct inode *inode,struct file *filp, unsigned int cmd, unsigned int arg); int (*mmap) (void); int (*open) (struct inode *inode, struct file *filp); void (*release) (struct inode *inode, struct file *filp); int (*fsync) (struct inode *inode, struct file *filp); ;,陈英 梁建武主编 中国水利水电出版社,4.将X-WINDOW换成MICRO WINDOWS Microwindows是使用分层结构的设计方法。允许改变不同的层来适应实际的应用。在最底一层,提供了屏幕、鼠标/触摸屏和键盘的驱动,使程序能访问实际的硬件设备和其他用户定制设备。在中间一层,有一个轻巧的图形引擎,提供了绘制线条,区域填充、绘制多边形、裁剪和使用颜色模式的方法。在最上一层,提供了不同的API给图形应用程序使用。这些API可以提供或不提供桌面和窗口外型。,Linux基础及应用第11章 嵌入式Linux11.1嵌入式系统简介 11.1.1 嵌入式系统的定义 嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。 Linux提供了完成嵌入功能的基本的内核和所需要的所有用户界面,它是多面的。它能处理嵌入式任务和用户界面。将Linux看作是连续的统一体,从一个具有内存管理、任务切换和时间服务及其他的分拆的、微内核到完整的服务器,支持所有的文件系统和网络服务。 11.1.2 嵌入式系统的特征 嵌入式系统是面向用户、面向产品、面向应用的,如果独立于应用自行发展,则会失去市场。嵌入式处理器的功耗、体积、成本、可靠性、速度、处理能力、电磁兼容性等方面均受到应用要求的制约,这些也是各个半导体厂商之间竞争的热点。 11.2 嵌入式Linux基础 11.2.1 嵌入式Linux的应用信息家电:PDA,机顶盒,Digital Telephone,Answering Machine,Screen Phone;数据网络:Ethernet Switches,Router,Bridge,Hub,Remote access servers,ATM,Frame relay;远程通信;医疗电子;交通运输;计算机外设;工业控制;航空航天领域11.2.2 Linux作为嵌入式操作系统的优势1免许可证费用 嵌入式Linux的版权费是免费的,其购买费用仅为媒介成本。大多数的商业操作系统,例如Windows, Windows CE对每套操作系统收取一定的许可证费用。相对地,Linux是一个免费软件,并且公开源代码。只要不违反GPL(General Public License,通用版权许可协议),就可以自由应用和发布Linux。2有很高的稳定性 在PC硬件上运行时,Linux是非常可靠和稳定的,特别是和现在流行的一些操作系统相比。 有两个因素会影响稳定性,一是使用了混乱的驱动程序。驱动程序的选择很有限,有些稳定有些不稳定。一旦离开了通用的PC平台,需要自己编写。二是使用了硬盘。 3强大的网络功能 Linux天生就是一个网络操作系统,几乎所有的网络防议和网络接口都已经被定制在Linux中。Linux内核在处理网络防议方面比标准的Unix更具执行效率,在每一个端口上有更高的吞吐量。 4丰富的开发工具 Linux提供C, C+, JAVA以及其他很多的开发工具。更重要的是,爱好者可以免费获得,技术上由全世界的自由软件开发者提供支持。 Linux基于GNU的工具包,此工具包提供了完整与无缝交叉平台开发工具,从编辑器到底层调试。其C编译器产生更有效率的执行代码。 5实时性 在实时性能方面,RT_Linux ,Hardhat Linux 等嵌入式Linux支持实时性能;稳定性好,安全性好。11.3 Linux I/O端口编程 11.3.1如何在C语言下使用I/O端口一般方法 在存取任何I/O端口之前,必须让程序有如此做的权限。要完成这个目的,可以在程序一开始的地方(但是,要在任何I/O端口存取动作之前)调用ioperm()这个函数(该函数在文件unistd.h中,并且被定义在内核中)。 使用语法是:ioperm(from,num,turn_on) 其中from是第一个允许存取的I/O端口地址,num是接着连续存取I/O端口地址的数目。 函数ioperm()只能取得端口地址0x000到0x3ff的存取权限;至于较高地址的端口,需要使用函数iopl()(该函数可以一次存取所有的端口地址)。将权限等级参数值设为3(例如,iopl(3)),以便程序能够存取所有的I/O端口(如果存取到错误的端口地址将对计算机造成各种不可预期的损害。同样地,调用函数iopl()必需要拥有root的权限。 接着来实际地存取I/O端口。要从某个端口地址输入一个字节(8位)的信息,调用函数inb(port),该函数会传回所取得的一个字节的信息。要输出一个字节的信息,调用函数outb(value,port)。要从某两个端口地址x和x+1(两个字节组成一个字,故使用组合语言指令inw)输入一个字(16个bit)的信息,需要调用函数inw(x);要输出一个字的信息到两个端口地址,需要调用函数outw(value,x)。 2替代方法:/dev/port 另一个存取I/O端口的方法是以函数open()打开文件/dev/port(一个字符设备,主设备编号为1,次设备编号为4),以便执行读与(或)写的动作(注意标准输出入函数f*()有内部的缓冲,所以要避免使用)。 11.3.2 硬件中断与DMA存取 用户程序如果在用户模式下执行,不可以直接使用硬件中断(IRQ)或DMA。用户必须编写一个内核驱动程序。也就是说,在用户模式中所写的程序无法控制硬件中断的产生。 11.3.3 延迟时间 在用户模式中执行的进程不能精确地控制时间,因为Linux是个多用户的操作环境,在执行中的进程随时会因为各种原因被暂停大约10ms到数秒(在系统负荷非常高的时候)。然而对于大多数使用I/O端口的应用程序而言,这个延迟时间实际上算不了什么。要缩短延迟时间,需要使用函数nice将你在执行中的进程设定成高优先权,或使用即时调度法(real-time scheduling)。11.4 嵌入式Linux开发 11.4.1 构造嵌入式Linux前先要了解的几个关键问题1如何引导?在PC上运行的Linux依靠PC的BIOS来提供这些配置和OS加载功能。 在一个嵌入式系统里经常没有这种BIOS。这样就要提供同等的启动代码。 在大多数情况下,一个最小的通电自检模块,可以检查内存的正常运行、让LED闪烁,并目驱动其它必须的硬件以使主Linux OS启动和运行。 2需要虚拟内存吗? 由于CPU的原因,在嵌入式Linux中保存虚拟内存代码是明智的,因为将它清除很费事。而且还有另外一个原因它支持共享文本,这样就可以使许多程序共享一个软件。 虚拟内存的调入功能可以被关掉,只要将交换空间的大小设置为零。然后,如果用户写的程序比实际的内存大,系统就会当作用户的运行用尽了交换空间来处理,这个程序将不会运行。 3选用什么样的文件系统?实际上,许多商业性嵌入式系统,提供文件系统作为选项。许多或者是专用的文件系统或者是MS-DOS-Compatible文件系统。Linux提供MS-DOS-Compatible文件系统,同时还有其它多种选择。 文件系统可以被放在传统的磁盘驱动器、Flash Memory或其它这类的介质上。而且,用于暂时保存文件,一个小RAM盘就足够了。4如何消除嵌入式Linux系统对磁盘的依赖?在一个嵌入式系统里,可能没有磁盘。有两种途径可以消除对磁盘的依赖,这要看系统的复杂性和硬件的设计。 在一个简单的系统里,当系统启动后,内核和所有的应用程序都在内存里。这就是大多数传统的嵌入式系统工作模式,它同样可以被Linux支持。有了Linux,就有了第二种可能性。因为Linux已经有能力“加载”和“卸载”程序,一个嵌入式系统就可以利用它来节省内存。 5嵌入式Linux达到怎样的实时性?在嵌入式领域中,实时并非是最重要的。嵌入式系统常常被错误地分为实时系统,尽管多数系统一般并不要求实时功能。实时是一个相对的词,常常被严格地定义实时为对一事件以预定的方式在极短的时间如微秒作出响应,渐渐地,在如此短暂时间间隔内的严格实时功能在专用DSP芯片或ASIC上实现了。只有在设计低层硬件FIFO、分散/聚集DMA引擎和定制硬件时才会有这样的要求。 11.4.2 嵌入式Linux开发环境 嵌入式Linux开发流程 11.4.3 开发嵌入式Linux的步骤1精简内核构造内核常用命令包括:make config, dep,clean,mrproper,zImage,bzImage,modules, modules install。(1)make config核心配置,(2)make dep寻找依存关系。(3)make clean清除以前构核所产生的所有目标文件、模块文件、核心以及一些临时文件等,不产生任何文件。(4)make rmproper删除所有因构核过程中产生的所有文件。(5)make, make zImage, mak
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。