Rtlinux-Tutorial
- 格式:pdf
- 大小:379.18 KB
- 文档页数:56
Linux教案_高校教学一、课程简介1. 课程背景:本课程旨在帮助学生掌握Linux操作系统的基本概念、原理和使用方法,培养学生具备一定的Linux系统管理和维护能力。
2. 课程目标:(1)理解Linux操作系统的基本概念和原理;(2)熟悉Linux系统的安装、配置和常用命令;(3)掌握Linux文件系统、用户管理、进程管理、网络配置等基本操作;(4)具备使用Linux系统进行日常工作和学习的能力。
二、教学内容1. Linux概述:(1)Linux的发展历程;(2)Linux的特点和优势;(3)Linux的发行版及选择。
2. Linux安装:(1)安装前的准备工作;(2)常用的安装方法及步骤;(3)安装过程中可能遇到的问题及解决方法。
3. Linux基本命令:(1)文件操作命令;(2)文本处理命令;(3)网络通信命令;(4)系统管理命令。
4. Linux文件系统:(1)文件系统结构;(2)文件权限和管理;(3)磁盘空间管理。
5. 用户和组管理:(1)用户账号管理;(2)用户权限设置;(3)用户组管理。
三、教学方法1. 讲授法:讲解Linux基本概念、原理和命令的使用方法。
2. 实践法:引导学生动手实践,巩固所学知识。
3. 案例分析法:通过分析实际案例,使学生更好地理解Linux操作系统的应用。
4. 讨论法:鼓励学生提问、发表观点,促进师生互动。
四、教学资源1. 教材:选用权威、实用的Linux教材。
2. 实验环境:为学生提供Linux实验机房,确保每人一台计算机。
3. 网络资源:提供Linux相关网站、论坛、教程等资源,便于学生自主学习。
4. 辅导资料:为学生提供Linux操作系统的常见问题解答、命令速查等辅导资料。
五、课程评价1. 平时成绩:考察学生的出勤、课堂表现、作业完成情况等。
2. 实验报告:评估学生在实验过程中的操作能力和解决问题的能力。
3. 期末考试:全面测试学生对本课程知识的掌握程度。
Linux操作系统实验教程第1章Linux系统概述一、Linux系统结构从操作系统的角度来分析Linux,它的体系结构总体上属于层次结构如下图所示:从到外包括三层:最层是系统核心,中间是Shell、编译编辑实用程序、库函数等,最外层是用户程序,包括许多应用软件。
从操作系统的功能角度来看,它的核心有五大部分组成:进程管理、存储管理、文件管理、设备管理、网络管理。
各子系统实现其主要功能,同时相互之间是合作、依赖的关系。
进程会管理是操作系统最核心的容,它控制了整个系统的进程调度和进程之间的通信,是整个系统合理高效运行的关键;存储管理为其他子系统提供存管理支持,同时其他子系统又为存管理提供了实现支持,例如要通过文件管理和设备管理实现虚拟存储器和外存的统一管理。
二、配置一个双引导系统如果计算机中已经安装了其他操作系统,并想创建一个引导系统以便兼用Red Hat Linux和另外的操作系统,需要使用双引导。
机器启动时,可以选择其中之一,但不能同时使用两者。
每个操作系统都从自己的硬盘驱动器或硬盘分区中引导,并使用自己的硬盘驱动器或硬盘分区。
如果计算机上还没有安装任何操作系统,可以使用专门的分区及格式化软件给Windows创建指定大小的分区,Windows的文件系统为FAT,再为Linux系统创建所需要大小的分区(4G或更大),另外再给Linux留100MB 左右的交换分区,Linux的文件系统为ext2。
然后就可以安装系统了。
应首先安装Windows,然后再安装Red Hat Linux。
如果只进行了分区而没有格式化各分区,在安装时可以使用Windows自带的格式化程序和Linux自带的格式化程序进行各自分区的格式化。
当Windows已经被安装,而且已为Linux准备了足够的磁盘空间,就可以安装Linux了。
Red Hat Linux安装程序通常会检测到Windows并自动配置引导程序来引导Windows或Red Hat Linux。
RTLinux安装手册RTLinux安装手册作者: Prof. Chang-Gun Lee 译者: wsw一.RTLinux安装步骤1. 安装RedHat Linux如果机器之前没有装过linux系统,建议把RedHat安装在一个独立的分区上,推荐使用RedHat8.0,因之在与R TLinux配合使用兼容性最好,同时确保安装了内核配置工具,gcc编译器,一些诸如make和bzip2的工具软件.2. 获得linux内核网络上下载” linux-2.4.18.tar.bz2”3. 获rtlinux内核和补丁网络上下载“rtlinux-3.2-pre1.tar.bz2”4. 把一个干净的rtlinux 内核拷贝到usr/src/rtlinux-3.2-pre1目录下使用下面的命令:cd /usr/srctar xjf rtlinux-3.2-pre1.tar.bz2命令会创建 \rtlinux-3.2-pre1" directory under /usr/src.5. 把一个干净的linux内核拷贝到/usr/src/rtlinux-3.2-pre1/linux目录下使用下面的命令.cd /usr/src/rtlinux-3.2-pre1tar xjf linux-2.4.18.tar.bz2命令会在/usr/src/rtlinux-3.2-pre1目录下创建”linux" 目录.6. 给linux内核打上rtlinux补丁cd /usr/src/rtlinux-3.2-pre1/patchesbzip2 -d kernel patch-2.4.18-rtl3.2-pre1.bz2cd /usr/src/rtlinux-3.2-pre1/linuxpatch -p1 < /usr/src/rtlinux-3.2-pre1/patches/kernel patch-2.4.187. 清除所有”.o”文件和残留的依赖关系cd /usr/src/rtlinux-3.2-pre1/linuxmake mrproper8. 配置linux内核cd /usr/src/rtlinux-3.2-pre1/linuxmake config /* 文本模式 */ 或make xconfig /* X 模式*/详细的linux配置见第三部分9. Build一个新内核命令如下.cd /usr/src/rtlinux-3.2-pre1/linuxmake dep /* 刷新依赖 */make bzImage /* 编译linux内核 */make modules /* 编译模块 */su /* 切换至root用户执行下面的操作 */make modules_install /* 安装编译好的linux模块 */cp arch/i386/boot/bzImage /boot/rtzImage10. 配置你的boot loader在下面的说明中,我们假定根目录”/”挂在” /dev/hda3”上,启动目录”/boot”挂在”/dev/hda2”上,可以通过”df”命令检测你系统的分区设置,如果你的系统启动管理器是LILO,添加下面的内容到”/etc/lilo.conf”:image = /boot/rtzImagelabel = rtlinuxread-onlyroot = /dev/hda3“/dev/hda3”就是你挂根目录的地方,接下来运行下面的命令: /sbin/lilo有关LILO更详细的设置请参考: /doc/ad18307531.html,/articles/2701/和/doc/ad18307531.html,/howto/basic/lilo.shtml.如果你的启动管理器是GRUB,把下面的命令加入到”/etc/grub.conf”:title rtlinuxroot (hd0, 1)kernel /rtzImage ro root = /dev/hda3“/dev/hda3”就是你挂根目录的地方,(hd0,1)表示第一块IDE硬盘(0)的第2个分区(1),也就是”/boot”目录所在的”/dev/ hda2”.更详细的设置请参考: /doc/ad18307531.html,/software/grub/.11. 重启并在启动菜单中选择rtlinux启动RTLinux应该跟着启动了12. 配置RTLinuxcd /usr/src/rtlinux-3.2-pre1make xconfig /* 默认 */13. 编译RTLinux命令如下:cd /usr/src/rtlinux-3.2-pre1makesu /* 以根用户身份运行下面的命令*/make devicesmake install14. 重启并在启动菜单中选择rtlinux启动二.运行RTLinux首先切换到根用户.在运行”examples”目录前应该确保mbuff, rtl _fifo, rtl, rtl_posixio, rtl_sched, and rtl_time等动态加载的rtlinux内核模块都在运行,可以用”insmod modulename.o”命令加载每一个模块,幸而”rtlinux”可以一步搞定:rtlinux status /* 查看加载了那些模块 */rtlinux start /* 加载所有rtlinux模块 */rtlinux status /* 检查是否所有模块都被加载*/如果看到所有模块都被加载了,你成功了,否则在你运行”rtlinux start”命令后会返回错误提示信息.那可能是由于li nux内核配置错误造成,请参考第三部分.然后从第一部分第8步开始重新build linux内核.如果所有rtlinux模块都成功加载,到examples/hello目录下键入”make”来生成”hello.o”文件,然后加载”hello.o”模块: insmod hello.o .然后键入”lsmod”命令看看”hello.o”模块是否成功加载.为了看到hello模块的执行效果,需要在字符模式下进行,如果是在X模式下,可以键入”dmesg”来查看”hello.o”模块输出的信息.最后,运行” rmmod hello”命令移除hello.o模块.注意命令里没有用到”.o”.三.linux内核配置注意事项这是RTLinux成功运行最重要的部分,运行”make config”或”make xconfig”时要特别注意下面几项.配置可能因计算机配置不同而有所差异.因此,第一次配置尝试应该按照下面几项进行配置,没有提到的选项就按照默认配置(DEFAULT),如果能工作(第二部分提到的能够运行hello模块),那么你很幸运,如果没能成功,也别泄气.试着改改跟下面几项相关的配置.1.Code maturity level options(代码成熟度): 选 YES2.Loadable module support(可加载模块支持):选中所有子项:1) Enable loadable module support(使能可加载模块支持), 2) set version info on all system module(对所系统模块设置版本信息),和3) kernel module loa der(内核模块加载器).3.Processor type(处理器类型):选择你的CPU类型,用”/proc/cpuinfo”命令获得CPU相关信息,如果你的计算机是多处理器,选上” symmetric multi-processing support”(均衡多处理器支持)./doc/ad18307531.html,work device support(网络设备支持):选择合适的网络设备,如果你有一个3COM的(10M或100M)以太网卡,选中并标记3c590/3c900系列为M(加载为模块).5.选中 kernel hacking 和 Magic SysRq Key两项.6.对于其他选项,尽量保持默认配置.如果失败,尝试更改可疑的配置选项.你可以把当前配置保存为文件作为下次的默认配置.你可以保存当前设置到文件”myconfig”,下一次,当你想更改几个配置的时候就拷贝”myconfi g”到”.config”.”.config”是”make config”和”make xconfig”读取的默认配置文件.祝好运!四.安装RTLinux 手册设计RTLinux应用需要对其系统调用非常熟悉.然而不可能都记住.所幸,RTLinux提供了包含所有系统调用的手册供随时查阅.安装手册步骤如下:1.网上下载” rtldoc-3.0.tar.bz2”.2.拷贝到” /usr/src/rtlinux-3.2-pre1/doc”目录下.3.使用下列命令:cd /usr/src/rtlinux-3.2-pre1/doctar xjvf rtldoc-3.0.tar.bz2该操作会创建”/usr/src/rtlinux-3.2-pre1/doc/rtldoc-3.0”目录4.把该目录路径加入到MANUAL PAGE搜索路径.a)方法1:在/etc/man.config文件中加入一行:” MANPATH /usr/src/rtlinux-3.2-pre1/doc/rtldoc-3.0/man”.b)方法2:在用户主目录的.bashrc文件中加入一行:” export MANPATH=$MANPATH:/usr/src/rtlinux-3.2-pre1/doc/rtldoc-3.0/man”5.试试”man rtf_creat”或”man 3 rtf_creat”命令.。
Linux教案_高校教学教案内容:一、Linux简介1.1 了解Linux的发展历程1.2 了解Linux的核心理念(开放、自由软件)1.3 了解Linux的发行版(如Ubuntu、CentOS、Fedora等)1.4 掌握Linux在实际应用中的优势和劣势二、Linux安装与配置2.1 学习Linux安装流程(硬盘安装、光盘安装、虚拟机安装等)2.2 学习Linux文件系统结构2.3 学习Linux基本操作命令(如文件操作、目录操作、文本处理等)2.4 掌握Linux桌面环境(如GNOME、KDE等)的基本操作三、Linux文件权限与管理3.1 学习Linux文件权限概念(读、写、执行)3.2 学习文件权限的表示方法(数字表示法、符号表示法)3.3 学习如何修改文件权限(chmod、chown等命令)3.4 掌握Linux文件权限的实际应用场景四、Linux用户管理4.1 学习Linux用户和组的概念4.2 学习用户管理的命令(如useradd、usermod、userdel等)4.3 学习组管理的命令(如groupadd、groupmod、groupdel等)4.4 掌握Linux用户和组的实际应用场景五、Linux进程管理5.1 学习Linux进程概念5.2 学习如何查看进程(ps、top等命令)5.3 学习如何控制进程(start、stop、restart等)5.4 掌握Linux进程管理的实际应用场景六、Linux网络配置与通信6.1 学习Linux网络配置文件(/etc/network/interfaces)6.2 学习Linux网络命令(ifconfig、ping、netstat等)6.3 掌握Linux网络配置与诊断的实际应用6.4 了解Linux下的网络资源共享(Samba、NFS等)七、Linux软件管理7.1 学习Linux软件包管理工具(如apt-get、yum等)7.2 学习Linux软件安装、更新和卸载的方法7.3 掌握Linux软件管理的实际应用场景7.4 了解开源软件和Linux发行版之间的关系八、Linux文本处理工具8.1 学习Vim编辑器的基本使用方法8.2 学习Linux下的文本处理工具(如grep、sed、awk等)8.3 掌握文本处理在Linux中的实际应用场景8.4 进行简单的编程练习,巩固文本处理技能九、Linux Shell脚本编程9.1 学习Shell脚本的基本概念与结构9.2 学习如何在Linux中编写、执行Shell脚本9.3 掌握Shell脚本编程的基本技巧(变量、循环、条件判断等)9.4 进行简单的Shell脚本编程练习,实际应用所学知识十、Linux系统安全10.1 学习Linux系统安全的基本概念10.2 学习Linux文件系统安全(权限设置、文件加密等)10.3 学习Linux网络安全(防火墙、SSH等)10.4 掌握Linux系统安全管理的实际应用场景10.5 了解Linux安全漏洞修复和补丁管理的基本方法十一、Linux系统监控与性能优化11.1 学习系统监控工具(如top, htop, vmstat等)11.2 学习Linux性能优化方法(CPU、内存、磁盘I/O优化)11.3 掌握系统监控与性能优化的实际应用场景11.4 了解系统调优在提高系统稳定性、性能方面的作用十二、Linux存储管理12.1 学习Linux文件系统(ext4, XFS, Btrfs等)12.2 学习Linux逻辑卷管理(LVM)12.3 学习Linux磁盘阵列管理(RD)12.4 掌握存储管理在实际应用中的配置与优化十三、Linux备份与恢复13.1 学习Linux下备份工具的使用(如tar, rsync等)13.2 学习系统备份与恢复策略的制定13.3 掌握数据备份与恢复的实际操作流程13.4 了解灾难恢复方案的制定与实施十四、Linux服务器配置与管理14.1 学习Web服务器配置(如Apache, Nginx)14.2 学习文件服务器配置(如Samba, NFS)14.3 学习邮件服务器配置(如Postfix, Dovecot)14.4 学习数据库服务器配置(如MySQL, PostgreSQL)14.5 掌握服务器管理的最佳实践与安全策略十五、Linux项目实践15.1 学习Linux项目开发流程与方法15.2 完成一个简单的开源项目贡献(如代码提交、bug修复等)15.3 了解开源社区参与方式与规范15.4 掌握Linux在实际项目中的应用与部署重点和难点解析本文教案主要分为十五个章节,涵盖了Linux的基本概念、安装与配置、文件权限与管理、用户管理、进程管理、网络配置与通信、软件管理、文本处理工具、Shell脚本编程、系统安全、系统监控与性能优化、存储管理、备份与恢复、服务器配置与管理以及项目实践等方面。
Linux操作系统教案第一章:Linux操作系统简介1.1 课程目标了解Linux操作系统的起源和发展历程掌握Linux操作系统的特点和优势了解Linux操作系统的应用领域1.2 教学内容Linux操作系统的起源和发展历程Linux操作系统的特点和优势Linux操作系统的应用领域1.3 教学方法讲解和演示相结合互动问答环节1.4 教学资源PowerPoint课件Linux操作系统演示环境1.5 教学评估课堂问答课后作业第二章:Linux操作系统安装2.1 课程目标掌握Linux操作系统的安装方法熟悉Linux操作系统的安装流程了解Linux操作系统的版本选择2.2 教学内容Linux操作系统的安装方法Linux操作系统的安装流程Linux操作系统的版本选择2.3 教学方法讲解和演示相结合学生实际操作环节2.4 教学资源PowerPoint课件Linux操作系统安装演示环境2.5 教学评估课堂问答学生实际操作评估第三章:Linux操作系统基本命令3.1 课程目标掌握Linux操作系统的常用命令熟悉Linux操作系统的文件操作命令了解Linux操作系统的系统管理命令3.2 教学内容Linux操作系统的常用命令Linux操作系统的文件操作命令Linux操作系统的系统管理命令3.3 教学方法讲解和演示相结合学生实际操作环节3.4 教学资源PowerPoint课件Linux操作系统演示环境3.5 教学评估课堂问答学生实际操作评估第四章:Linux操作系统文件管理4.1 课程目标掌握Linux操作系统的文件管理方法熟悉Linux操作系统的文件权限管理了解Linux操作系统的文件压缩和解压方法4.2 教学内容Linux操作系统的文件管理方法Linux操作系统的文件权限管理Linux操作系统的文件压缩和解压方法4.3 教学方法讲解和演示相结合学生实际操作环节4.4 教学资源PowerPoint课件Linux操作系统演示环境4.5 教学评估课堂问答学生实际操作评估第五章:Linux操作系统用户管理5.1 课程目标掌握Linux操作系统的用户管理方法熟悉Linux操作系统的用户组管理了解Linux操作系统的用户权限管理5.2 教学内容Linux操作系统的用户管理方法Linux操作系统的用户组管理Linux操作系统的用户权限管理5.3 教学方法讲解和演示相结合学生实际操作环节5.4 教学资源PowerPoint课件Linux操作系统演示环境5.5 教学评估课堂问答学生实际操作评估第六章:Linux操作系统磁盘管理6.1 课程目标掌握Linux操作系统的磁盘分区方法熟悉Linux操作系统的文件系统类型了解Linux操作系统的磁盘空间管理6.2 教学内容Linux操作系统的磁盘分区方法Linux操作系统的文件系统类型Linux操作系统的磁盘空间管理6.3 教学方法讲解和演示相结合学生实际操作环节6.4 教学资源PowerPoint课件Linux操作系统演示环境6.5 教学评估课堂问答学生实际操作评估第七章:Linux操作系统网络配置7.1 课程目标掌握Linux操作系统的网络配置方法熟悉Linux操作系统的网络命令了解Linux操作系统的网络服务7.2 教学内容Linux操作系统的网络配置方法Linux操作系统的网络命令Linux操作系统的网络服务7.3 教学方法讲解和演示相结合学生实际操作环节7.4 教学资源PowerPoint课件Linux操作系统演示环境7.5 教学评估课堂问答学生实际操作评估第八章:Linux操作系统软件管理8.1 课程目标掌握Linux操作系统的软件安装方法熟悉Linux操作系统的软件包管理了解Linux操作系统的软件源配置Linux操作系统的软件安装方法Linux操作系统的软件包管理Linux操作系统的软件源配置8.3 教学方法讲解和演示相结合学生实际操作环节8.4 教学资源PowerPoint课件Linux操作系统演示环境8.5 教学评估课堂问答学生实际操作评估第九章:Linux操作系统常用服务9.1 课程目标掌握Linux操作系统的常用服务熟悉Linux操作系统的Web服务配置了解Linux操作系统的文件共享服务9.2 教学内容Linux操作系统的常用服务Linux操作系统的Web服务配置Linux操作系统的文件共享服务讲解和演示相结合学生实际操作环节9.4 教学资源PowerPoint课件Linux操作系统演示环境9.5 教学评估课堂问答学生实际操作评估第十章:Linux操作系统安全防护10.1 课程目标掌握Linux操作系统的安全防护措施熟悉Linux操作系统的用户安全设置了解Linux操作系统的系统安全配置10.2 教学内容Linux操作系统的安全防护措施Linux操作系统的用户安全设置Linux操作系统的系统安全配置10.3 教学方法讲解和演示相结合学生实际操作环节10.4 教学资源PowerPoint课件Linux操作系统演示环境10.5 教学评估课堂问答学生实际操作评估重点和难点解析一、Linux操作系统简介重点和难点解析:Linux操作系统的起源和发展历程,以及它的特点和优势是理解Linux的基础。
Tutorial de Real Time LinuxJosé Ismael Ripoll RipollTutorial de Real Time LinuxTable of Contents1 Presentación (1)1.1 Consejos para leer este documento (1)1.2 Contenido (1)1.3 Documentación adicional (1)1.4 Usabilidad de esta documentación (2)2 Introducción (3)2.1 Historia y evolución (3)2.2 Relación entre RTLinux y Linux (3)2.3 Características (3)2.4 Operación de un S.O. clásico (3)2.5 Estándares UNIX (4)2.6 POSIX Threads (IEEE 1003.1b) (4)2.7 El papel de las interrupciones (5)2.8 Arquitectura de RTLinux (5)2.9 Módulos del núcleo (6)2.10 Referencias (6)3 Módulos del núcleo cargables (7)3.1 Introducción (7)3.2 Módulos cargables (7)3.3 Módulo "Hello World" (mhello.c) (7)3.4 Compilar módulos (8)3.5 Ejecutar módulos (8)3.6 Parámetros (8)3.7 Más sobre módulos (8)4 Creación y gestión de threads (11)4.1 Listado de funciones (11)4.2 La primera rt_task (11)4.3 Detalles de implementación (11)4.4 Creación y destrucción de threads (12)4.5 Atributos (12)4.6 PThreads periódicos, no portable (12)4.7 Cancelación (12)4.8 Ejemplo de cancelación (13)4.9 Pila de cancelación (13)4.10 Control de ejecución (14)4.11 (14)5 Señales e Interrupciones (15)5.1 Introducción (15)5.2 Señales (15)5.3 Envío de señales (16)5.4 Listado de señales (16)5.5 Esquema global de gestión de interrupciones (16)5.6 Habilitar/inhabilitar interrupciones (16)5.7 Enmascarar interrupciones (17)5.8 Interrupciones hardware (17)5.9 Interrupciones software (18)6 Gestión del tiempo (19)6.1 Introducción (19)6.2 Visión global (19)6.3 Relojes (19)6.4 Soporte hardware (20)6.5 Estructuras de datos (21)6.6 Listado de funciones (21)6.7 Consultar el reloj (21)6.8 Esperas (22)6.9 Miscelánea de funciones (22)6.10 Modo de operación (22)6.11 Interrupción de reloj (22)6.12 Operar con tiempos (23)7 Sincronización: Mutex, Variables condición y Semáforos. (25)7.1 Introducción (25)iTutorial de Real Time LinuxTable of Contents7.2 Inversión de prioridad (25)7.3 Utilización (25)7.4 Listado de funciones (26)7.5 Semáforos (26)7.6 Atributos de semáforos (26)7.7 .._SPINLOCK_NP un caso especial (27)7.8 Techos de prioridad dinámicos (27)7.9 Variables condición (27)7.10 Semáforos generales (28)7.11 Funciones (29)8 Dispositivos POSIX y acceso a la Entrada/Salida (31)8.1 Introducción (31)8.2 Estructura global (31)8.3 /dev/mem (32)8.4 Registrar nuevos dispositivos (32)8.5 Programación de la E/S (33)8.6 Acceso a la memoria física (33)8.7 Programación de puertos desde procesos Linux (33)9 FIFO (35)9.1 Introducción (35)9.2 Programación desde procesos Linux (35)9.3 Copia de variables por FIFO (36)9.4 Listado de funciones (36)9.5 Crear FIFOS (36)9.6 Leer y escribir en fifos (36)9.7 Control de estado (36)9.8 Manejadores de FIFOS (37)9.9 API POSIX.4 (37)9.10 open y close (37)9.11 Read y write (37)9.12 Colas de mensajes (37)9.13 (38)9.14 (38)10 Memoria compartida (41)10.1 Introducción (41)10.2 Memoria física contigua (41)10.3 Listado de funciones (41)10.4 Uso de mbuff desde Linux (42)10.5 Crear y liberar memoria (42)10.6 Utilización de mbuff desde RLinux (42)10.7 Memoria alta no usada (42)10.8 Memoria alta desde RTLinux (43)10.9 Memoria alta desde Linux (43)10.10 Bigphysarea (43)10.11 (44)11 Herramientas de depuración (45)11.1 Introducción (45)11.2 Imprimir directo a consola (45)11.3 Imprimir mediante printk (45)12 FAQ (49)13 Licencia (51)iiTutorial sobre RTLinux[tm] (Versión 3). Está divido en tres bloques de forma que es posible estudiar cada uno de ellos de forma independiente.En el primer bloque se enmarca RTLinux dentro de las distintas arquitecturas de tiempo real y sistemas empotrados. También se introducen los conceptos básicos para poder crear aplicaciones con RTLinux.El segundo bloque está dedicado a la utilización de RTLinux como base para crear aplicaciones de tiempo real. Se explica el API, así como la metodología de trabajo.En el último bloque se estudian los detalles de implementación con el objetivo de poder modificar o ampliar la funcionalidad de RTLinux. Por ejemplo para añadir nuevos manejadores o una nueva política de planificación. Bloque está en elaboración.1.1 Consejos para leer este documentoRecuerda que estas páginas están especialmente diseñadas para Netscape sobre Linux.Desde esta documentación se hace referencia a los ficheros fuente del propio RTLinux. Para que los enlaces de la documentación funcionen correctamente es necesario que RTLinux esté instalado en el directorio /usr/src/rtl de lamáquina local.Suponiendo que tenemos la distribución en formato TGZ:localhost# tar zxvf rtlinux[version].tgzlocalhost# chmod a+rX rtlinux[version]localhost# ln −s rtlinux[version] rtlTambién es conveniente tener instalados los fuentes del núcleo de Linux en su lugar habitual: /usr/src/linux.1.2 Contenido1.Conceptos generales[Abre presentación] [Para imprimir] Introducción1.[Abre presentación] [Para imprimir] Módulos2.2.API de RT−Linux.1.[Abre presentación] [Para imprimir] Creación y gestión de pthreads2.[Abre presentación] [Para imprimir] Señales e interrupciones3.[Abre presentación] [Para imprimir] Gestión del tiempo[Abre presentación] [Para imprimir] Sincronización4.[Abre presentación] [Para imprimir] Dispositivos POSIX y acceso a la Entrada/Salida5.[Abre presentación] [Para imprimir] Comunicación mediate FIFOs6.7.[Abre presentación] [Para imprimir] Memoria compartida[Abre presentación] [Para imprimir] Depuración8.[Mini−FAQ]9.También puedes bajarte todo el tutorial en un solo fichero PDF de 350Kb (generado con htmldoc).Puedes encontrar la última versión de este documento en:http://bernia.disca.upv.es/~iripoll/rt−linux/rtlinux−tutorial/index.html1.3 Documentación adicional1.3.1 LinuxLinux Kernel Module Programming Guide /guides/LKMPG/ (versión local)•1 Presentación 1Tutorial de Real Time Linux1.3.2 RT Linux•Antes de comenzar la implementación del API de PThreads en RTLinux, Victor Yodaiken esbozó lasprincipales líneas de diseño en el documento design.pdf.•Documentos Getting started with RT−Linux" y FAQ de Michael Barabanov, que acompañas los fuentes deRTLinux.•Módulo de comunicaciones serie (RS232) para RTLinux: rt_com.Artículo que describe una aplicación de control ejemplo desarrollada con RTLinux: nerdcontrol.•Real Time and Embedded HOWTO, Herman Bruyninckx.•1.3.3 Hardware del PCManuales de Intel sobre la arquitectura Pentium®:•Software Developer Manual Volume 1: Basic Architecture♦Software Developer Manual Volume 2: Instruction Set Reference Manual♦Software Developer Manual Volume 3: System Programming Guide♦•Prontuario sobre el hardware del PC: hard0001.•Mucha información sobre hardware del PC: −1.3.4 Estándares POSIX•"Programming for the Real World POSIX 1004" de Bill O. Gallmeister. Ed: O'Really Associates, Inc..Multithreaded Programming with Pthreads de Bil Lewis y Daniel J. Berg. Ed: Sun Microsystems.•El tutorial en línea "Getting Started With POSIX Threads" de Thomas Wagner and Don Towsley.••OpenGroup . Propietario de la marca UNIX e impulsor de "Single UNIX Specification".En su web se pueden consultar todas las hojas de manual.1.4 Usabilidad de esta documentaciónLas presentaciones en transparencias se generan automáticamente a partir del fichero HTML que se utiliza paraimprimir.Se ha tratado de seguir los estándaresLinux is a trademark of Linus Torvalds.RTLinux is a trademark of VJY Associates, LLC. FSMLabs is a service of VJY Associates, LLC of New Mexico.© Jose Ismael Ripoll Ripoll (disca), Abril 2000 Opencontent License2 1 Presentación2 IntroducciónIsmael Ripoll iripoll@disca.upv.es http://bernia.disca.upv.es/~iripollPermission is granted to copy, distribute and/or modify this document under the terms of the OpenContent License .2.1 Historia y evoluciónRTLinux nació del trabajo de Michael Barabanov y Victor Yodaiken en la univeridad de Nuevo Mexico. Hoy en día continúan activamente con su desarrollo desde su propia empresa (FSM Labs ) desde la que ofrecen soporte técnico.• RTLinux se distribuye bajo la "GNU Public License". Recientemente Victor Yodaiken ha patentado la original arquitectura en la que se basa RTLinux.• Actualmente funciona sobre alquitecturas PowerPC, i386, y está en desarrollo la versión para Alpha. • A partir del código de Yodaiken, se está desarrollando otro proyecto liderado por P. Mantegazza llamado: "Real Time Application Interface" RTAI • Esta documentación describe únicamente la principal versisón de RTLinux (desarrollada porFMS Labs.). • Las primeras versiones de RTLinux ofrecían un API muy reducido sin tener en cuenta ninguno de los estándares de tiempo real: POSIX Real−Time extensions, PThreads, etc.• A partir de la versión 2.0 Victor Yodaiken decide reconvertir el API original a otro que fuera "compatible" con el API de POSIX Threads. El documento design explica las líneas generales de la adaptación al estándar. • Existe una versión para multiprocesadores, con la posibilidad de asignar tareas a procesadores.• 2.2 Relación entre RTLinux y LinuxEs importante no confundir la versión de RTLinux con la versión del núcleo de Linux.RTLinux no es código independiente. Esto es, no es una nueva versión de Linux.♦ Parte de la distribución de RTLinux es una "parche" sobre el código de Linux. Y otra parte son módulos cargables.♦ Cada versión de RTLinux está diseñada para funcionar sobre una versión de Linux. Por ejemplo la version 3 de RTLinux necesita linux−2.3.48 o superior.♦ • 2.3 CaracterísticasSistema operativo de tiempo real estricto.• Extensiones para entorno multiprocesador SMP (x86).• API "próximo" al de POSIX threads. Planificador expulsivo por prioridades fijas, señales, sistema de archivos POSIX (open, close, etc.) semáforos y variables condición.• Depuración de código mediante GDB (GNU Debuger).• Soporte para arquitecturas x86 y PPC.• Acceso directo al hardware (puertos e interrupciones).• Comunicación con procesos linux mediante memoria compartida y "tubos".• Estructura modular para crear sistemas pequeños.• Eficiente gestión de tiempos. En el peor caso se dispone de una resolución resolución próxima al microsegundo (para un i486).• Facilidades para incorporar nuevos componentes: relojes, dispositivos de E/S y planificadores.• 2.4 Operación de un S.O. clásicoDesde un punto de vista clásico, el núcleo del S.O. es un programa (conjunto de funciones y estructuras de datos) que gestiona los recursos de la máquina.• 2 Introducción 3El núcleo se ejecuta estando el microprocesador en modo supervisor , esto es, el micro permite la ejecución de todas las instrucciones máquina, es posible acceder a todas las direcciones de memoria, programar los periféricos y capturar las interrupciones. Utilizando la terminología de Intel diríamos que el núcleo se ejecuta en "Ring level 0".• Los procesos "normales" tienen prohibido el uso de ciertas instrucciones consideradas privilegiadas. Un proceso "normal" no puede acceder a los puertos de E/S ni capturar interrupciones. El procesador está en modo usuario : "Ring level 3".• En cualquier sistema operativo (S.O.) las aplicaciones se ejecutan bajo la supervisión del S.O. y sin la capacidad de acceder al hardware de la máquina. •Utilizando está biblioteca se pueden desarrollar sistemas de tiempo real blando, ya que las tareas de tiempo real •(threads) son ejecutadas sobre un núcleo que no soporta tiempo real estricto.La biblioteca PThread de glib2 no modifica el núcleo del S.O., sino que implementa el API de PThredas (1003.1b) sobre las llamadas al sistema existentes.3 Módulos del núcleo cargablesIsmael Ripoll iripoll@disca.upv.es http://bernia.disca.upv.es/~iripollPermission is granted to copy, distribute and/or modify this document under the terms of the OpenContent License .3.1 IntroducciónLas rtl−tasks pueden acceder a todas las varibles y funciones del núcleo de Linux. Pero es poco recomendable ya que se pueden producir interbloqueos o condiciones de carrera.• Desde las funciones de inicialización y finalización (init_module y cleanup_module ) se puede hacer uso de todos los recursos del núcleo de forma segura. Estas funciones no son de tiempo real.• A efectos prácticos, el núcleo de Linux se puede considerar como otra tarea de tiempo real (rtl−task) pero que es planificada con la mínima prioridad.• 3.2 Módulos cargablesUn módulo es un fichero objeto que se puede "enlazar" y "des−enlazar" en el núcleo de Linux en tiempo de ejecución.• Con los módulos se agiliza enormemente el desarrollo de software crítico ya que no es necesario crear un nuevo núcleo y rearrancar la máquina cada vez que hacemos una prueba.• Un módulo es un programa "C" sin función main(), y que obligatoriamente ha de tener las funciones init_module y cleanup_module .• Cada módulo se compila para una versión de núcleo concreta y normalmente sólo se puede cargar sobre esta versión, aunque es posible forzar a cargar un módulo antiguo sobre un núcleo más moderno.• Los módulos que el núcleo puede cargar suelen residir en el directorio /lib/modules/[uname −r]/. • Los módulos se crean (como cualquier fichero objeto) con el compilador de "C" de GNU: gcc . • Para trabajar con módulos se dispone de las siguientes utilidades del sistema:• insmod :Instala en el núcleo un módulo.rmmod :Extrae del núcleo un módulo.modinfo :Muestra información sobre el módulo.modprobe :Automatiza/facilita la gestión de módulos.depmod :Determina las dependencias entre módulos.lsmod :Lista los modulos cargados.3.3 Módulo "Hello World" (mhello.c )#include <linux/module.h> #include <linux/kernel.h>static int datos=0;MODULE_AUTHOR("Ismael Ripoll");MODULE_DESCRIPTION("Modulo ejemplo Hello World");MODULE_PARM(datos,"i");int init_module(void) { printk("Hello World, parámentro %d \n", datos); return 0;}void cleanup_module(void) {3 Módulos del núcleo cargables 7printk("Bye World\n");}3.4 Compilar módulosPara compilar el mhello.c se tiene que utilizar la siguiente orden:gcc −c −O2 −fomit−frame−pointer −DMODULE −D__KERNEL__ mhello.c"−c ": El compilador compila y ensambla el programa pero no lo enlaza, esto es, únicamente se generará el código objeto.♦ "−O2 −fomit−frame−pointer ": genera código optimizado.♦ "−DMODULE −D__KERNEL__": define las macros MODULE y __KERNEL__, utilizadas por los ficheros de cabecera del núcleo para generar el código apropiado.♦ • Tras ejecutar esta orden obtendremos el fichero mhello.o• 3.5 Ejecutar módulosPodemos insertar el módulo con la orden insmod mhello.o . •Por otra parte, antes de poder poner en marcha una aplicación de tiempo real necesitaremos cargar los módulos del API que nuestra aplicación vaya a necesitar.• La orden ksyms lista todos los símbolos del núcleo, tanto los iniciales como los pertenecientes a móduloscargados.• Tutorial de Real Time Linux3 Módulos del núcleo cargables 9Tutorial de Real Time Linux10 3 Módulos del núcleo cargables4 Creación y gestión de threadsIsmael Ripoll iripoll@disca.upv.es http://bernia.disca.upv.es/~iripollPermission is granted to copy, distribute and/or modify this document under the terms of the OpenContent License .4.1 Listado de funcionesCreación/destrucción pthread_create pthread_exitAtributos pthread_attr_init pthread_attr_destroy pthread_attr_setschedparam pthread_attr_getschedparam sched_get_priority_max sched_get_priority_min pthread_attr_setstacksizeCancelación pthread_cancel pthread_setcancelstate pthread_setcanceltype pthread_testcancel Threads periódicos (no estándar) pthread_make_periodic_np pthread_setperiod_np pthread_wait_np Atributos (no estándar) pthread_attr_setfp_np pthread_attr_setfp_np pthread_attr_setcpu_np pthread_attr_getcpu_np Control de ejecución (no estándar) pthread_suspend_np pthread_wakeup_np4.2 La primera rt_task[hello.c ]En el directorio de examples de la distribución podemos encontrar este ejemplo de tarea de tiempo real mínima. • Todas las funciones relacionadas con la creación y destrucción de threads están declaradas en el fichero de cabecera include/rtl_sched.h .• POSIX define tanto las funciones del API, como los nombres de los ficheros de cabecera donde están declaradas. Para conseguir la compatibilidad, RTLinux ha creado el directorio include/posix que contiene todos los ficheros de cabecera requeridos por POSIX. Estos ficheros de cabecera estándar suelen contener líneas para incluir las ficheros donde realmente se hacer las declaraciones • En el proceso de instalación de RTLinux se crea el fichero rtl.mk , fichero que contiene todas las declaraciones necesarias para poder compilar los programas para RTLinux (módulos). Este fichero se tiene que incluir en el Makefile para poder compilar sin problemas nuestros programas.• Para crear un programa para RTLinux es conveniente crear un fichero Makefile en el que incluya el fichero rtl.mk (mediante la directiva: include /usr/src/rtl/rtl.mk ) y luego se incluyan las dependencias de nuestros fuentes.• Nota: los Makefiles de los ejemplos no incluyen rtl.mk ya que estos son invocados desde el Makefile principal que es el que contiene todas las macros y directivas para compilar correctamente.• 4.3 Detalles de implementaciónAunque RTLinux implementa muchas funciones POSIX, en ocasiones estas funciones no se ajustan completamente a la semántica definida en el estándar.• En algún caso, la función de RTLinux no implementará todas las opciones que define POSIX (Por ejemplo sched_setscheduler solo ofrece la política SCHED_FIFO ) o sólo se podrán utilizar con ciertos• 4 Creación y gestión de threads 11Tutorial de Real Time Linuxparámetros. En estos casos, la llamada fallará con el correspondiente código de retorno. Otra situación mássutil, consiste en que ciertas funciones sólo se pueden ejecutar desde el núcleo de Linux, otras sólo por rt−tasks y otras se pueden ejecutar indistintamente.•Las funciones marcadas como "No RTL segura" son aquellas que no pueden ejecutarse por tareas de tiemporeal ni por manejadores de interrupciones de tiempo real.4.4 Creación y destrucción de threadspthread_create(*thread, *attr, *start, *arg)Inicia la ejecución de un thread. Los atributos de creación por defecto (attr=NULL) son:stack_size=8000, sched_priority=0, cpu=current, use_fp=FALSE. El nuevo threadcomienza su ejecución inmediatamente. No RTL segura.pthread_exit(retval)Termina la ejecución del thread que invoca esta llamada, retornando como valor de terminación retval.pthread_join(thread, retval)Suspende la ejecución del thread que invoca esta llamada hasta que thread termina su ejecución. En laimplementación actual todos los threads son creados PTHREAD_CREATE_JOINABLE sin posibilidad de sermodificado.4.5 Atributospthread_attr_init(*attr), pthread_attr_init_destroy(*attr)Los atributos de creación de tareas se pasan como una estructura de tipo pthread_attr_t. El acceso a los campos de esta estructura se realiza mediante funciones simulando la forma de operar de la programaciónorientada a objetos.pthread_attr_[get|set]schedparam(*attr, *param)Establece la prioridad de la nueva rtl−task. Por ahora (V3) sólo está disponible la política SCHED_FIFO. Elrango de prioridades válido se obtiene de funciones sched_get_priority_min ysched_get_priority_max. La mínima prioridad es 0 y la máxima es 100000 (realmente la máxima esMAXINT).pthread_attr_[set|get]fp_np(*attr, flag)Para reducir el tiempo de cambio de contexto por defecto RTLinux no salva a memoria el estado decoporcesador matemático. Si queremos que las rtl−tasks puedan utilizar el coprocesador entonces es necesario llamar a esta función (Ver ejemplo fp).pthread_attr_[set|get]cpu_np(*attr, cpu)Asigna el nuevo thread the se cree con attr al procesador cpu (si el sistema es SMP). La numeración de los procesadores es la que aparece en el fichero /proc/cpuinfo.pthread_attr_setstacksize(*attr, size)Todos los threads comparten el mismo espacio de memoria, pero cada uno ha de tener su propia pila.4.6 PThreads periódicos, no portablepthread_make_periodic_np(thread, start_time, period)Permite "despertar" un thread de forma periódica. El propio thread ha de suspenderse voluntariamente al final de cada activación y RTLinux lo reactiva cada periodo. La unidad de tiempo es el nanosegundo.pthread_setperiod_np(thread, *itime)Equivalente a la función anterior pero utilizando una estructura del tipo itimerspec para especificar elinstante de inicio y el periodo.pthread_wait_np()Suspende la ejecución del thread que la invoca. Es necesario que el thread tenga un funcionamiento periódico.El propio programa hello.c es una tarea periódica.4.7 Cancelaciónpthread_cancel(thread)La cancelación es el mecanismo por el cual un thread invoca la terminación de otro. El thread que invoca este llamada no se suspende. El thread puede terminar o no en función de su estado de "cancelación".pthread_setcancelstate(state, *oldstate)12 4 Creación y gestión de threadsEstablece el estado de cancelación del thread que invoca esta llamada. Los posibles valores del state son: PTHREAD_CANCEL_ENABLE (estado por defecto) y PTHREAD_CANCEL_DISABLE. En el estado"DISABLE" este thread ignorará todas las peticiones de cancelación.pthread_setcanceltype(type, *oldtype)Una vez un thread acepta ser cancelado, la cancelación se puede realizar de dos formas:Inmediatamente nada más otro thread llame a la función pthread_cancel.1.Diferida, de forma que sólo en ciertos punto de la ejecución del thread se pueda terminar (vertestcancel). De esta forma se puede intentar dejar el sistema en un estado estable antes del finalizar(liberar semáforos, cerrar, ficheros, etc.). Opción por defecto.2.Estos dos tipos se denominan respectivamente: PTHREAD_CANCEL_ASYNCHRONOUS yPTHREAD_CANCEL_DEFERRED.pthread_testcancel()Comprueba si hay pendiente alguna petición de cancelación y si es así termina el thread que la invoca. Sólo tiene sentido si el thread está en estado PTHREAD_CANCEL_ENABLE y tipoPTHREAD_CANCEL_DEFERRED.Si el estado de cancelación es PTHREAD_CANCEL_DEFERRED además forzando la llamadapthread_testcancel(), también se comprueba si hay una petición de terminación pendiente en las llamadas a las siguientes funciones:•pthread_suspend_np pthread_wait_np usleeppthread_cond_wait pthread_cond_timedwait_hrt pthread_cond_timedwait pthread_testcancelpthread_joinA la lista de funciones que chequean si se tiene que cancelar el thread habrá que añadir algunas otras funcionesrelacionadas con la gestión de señales cuando éstas estén implementadas.•Un proceso con cancelación diferida que llame a una función que contenga alguna llamada a alguna de lasfuncionas anteriores producirá la terminación del thread.•Consejo: Intentar evitar la cancelación diferida en la medida de lo posible.•4.8 Ejemplo de cancelaciónvoid*start_routine(void*arg){pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);pthread_make_periodic_np(pthread_self(),gethrtime(), 500000000);while(1){pthread_wait_np();pthread_testcancel();// Sabemos que esta ejecución no se abortará.HAZ_MUCHO_TRABAJO(); // Sólo computo.pthread_testcancel();}}4.9 Pila de cancelaciónEn POSIX existe la posibilidad de declarar funciones de cancelación que se ejecutan en caso de terminación(normal o anormal) del thread.•Por ejemplo, el sistema puede quedar en un estado inestable si un thread es cancelado estando dentro de unasección crítica (ver semáforos). Podemos instalar una función de "limpieza" para liberar el semáforo.•Es posible instalar tantas funciones de terminación como se quiera. Si se instalan dos funciones de terminación,éstas se ejecutan en orden FILO (primera en ser instalada última en ser ejecutada).•Es obligatorio "desinstalar" todas las funciones de terminación en orden inverso a como se instalaron.•Tutorial de Real Time Linux4 Creación y gestión de threads 13Tutorial de Real Time Linux•El API de Pthread supone que las funciones de cancelación se gestionan mediante una pila de funciones determinación.•Para insertar una función en la pita de terminación se utiliza la función (realmente es una macro de "C"):pthread_cleanup_push(func, arg), y para eliminarla pthread_cleanup_pop(exec).•Como se puede observar, las funciones se tienen que "desapilar" en orden inverso a como fueron instaladas. Y en el mismo nivel sintáctico.La propia implementación de variables condición hace uso de la pila de cancelación: schedulers/rtl_mutex.c •4.10 Control de ejecuciónpthread_suspend_np(thread)Envía la señal RTL_SIGNAL_SUSPEND a un thread, suspendiendo la ejecución del mismo.Para volver a activarlo hay que enviarle la señal RTL_SIGNAL_WAKEUP o llamar a pthread_wakeup_np. pthread_wakeup_np(thread)Envía la señal RTL_SIGNAL_WAKEUP a un thread, reanudando su ejecución.Utilizando estas funciones junto con manejadores de interrupciones podemos asociar tareas con interrupciones.•4.11#include <rtl.h>#include <time.h>#include <pthread.h>pthread_t thread;void*start_routine(void*arg){struct sched_param p;p . sched_priority=1;pthread_setschedparam(pthread_self(), SCHED_FIFO, &p);pthread_make_periodic_np(pthread_self(), gethrtime(), 500000000);while(1){pthread_wait_np();rtl_printf("I'm here; my arg is %x\n", (unsigned)arg);}return0;}int init_module(void){return pthread_create(&thread, NULL, start_routine, 0);}void cleanup_module(void){pthread_cancel(thread);pthread_join(thread, NULL);}14 4 Creación y gestión de threads。