您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > STLINUX基础知识介绍
STLINUX基础知识介绍一:STLINUX介绍STLINUX开发环境STLinuxDistributionandDevelopmentEnvironment(LDDE).1:LDDE支持ST40及ST2002:包含完整的开发环境、编译器、调试器、下载工具、系统监控器3:可配置内核支持4:集成uboot5:Multicom支持stlinux版本STLinuxDistribution2.3(Added5thNov2007)STLinuxDistribution2.3EAR(EarlyAccessRelease)(Added29thMar2007)STLinuxDistribution2.2(Added19thOct2006)STLinuxDistribution2.0(Added7thOct2005)STLinuxDistribution2.0EAR(Added16thJul2005)STLinuxdistribution1.0(Added21stFeb2005)开发与调试开发与调试1:NFS基于网络文件系统的调试,一般用于调试应用及驱动2:TFTP基于FTP传输协议的调试,一般用于调试boot及内核等3:其他调试方法常用命令makesh4-linux-gccsh4-linux-g++sh4-linux-ldsh4-linux-nmsh4-linux-objdump二:STLINUX软件结构系统框图应用程序系统接口KERENLSTDRIVERSMITDRIVER硬件移植kernel选择kernel版本选择kernel支持的参考板裁减kernelmakemenuconfig编译kernelmakevmlinux压缩kernelmkimagevmlinux编译stapi1:安装mutilcom3.1.2及referencetree2:编译源码3:生产动态可加载模块驱动及应用静态连接库根文件系统jffs2可读写的文件系统系统性能高,断电保护及碎片整理功能数据压缩效率高mkfs.jffs2生产文件系统压缩包GB310压缩包中:busybox、*.so.*、stfirmware、*.ko、app.exe……….flash分区8Mflash空间分配如下:Uboot0.25MKernel1.5M文件系统6.25Mu-boot介绍Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序支持LINUX、NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌入式操作系统包含两种不同的操作模式:启动加载模式和下载模式支持从网络、flash中启动kernel支持flash读写传递参数给kernel移植uboot选择uboot版本选择uboot支持的参考板配置硬件资源及DDR等修改驱动:flash、uart、ethernetU-BOOT命令BootSetenvPrintenvTftpPing…..三:字符设备驱动LINUX设备的分类字符设备串口,终端,触摸屏ls-l/dev/ttyS0crw-rw-rw-1rootuucp4,644月119:56/dev/ttyS0块设备FLASH,RAMDISK,硬盘ls-l/dev/mtdblock3brw-r--r--150550531,3Feb192005/dev/mtdblock3网络设备以Linux的方式看待设备可区分为3种基本设备类型.每个模块常常实现3种类型中的1种,因此可分类成字符模块,块模块,或者一个网络模块.设备文件与设备号用户通过设备文件访问设备每个设备用一个主设备号和次设备号标识主设备号和次设备号majornumber:相同的设备使用相同的驱动程序minornumber:用来区分具体设备的实例设备驱动的基本结构用户程序调用Fd=fopen(“/dev/hda”,O_RDWR,0);read(buff,fd,size)write(fd,buff,size)close(fd)VirtualfilesystemGeneric_file_read()Generic_file_write()块设备文件设备驱动层图设备驱动的功能上层软件的抽象操作与设备操作的转换对下管理各种I/O设备内核模块机制Linux驱动以内核模块的方式实现一组可以动态加载/卸载的代码Linux内核运行时动态扩展的一种技术模块机制(LinuxKernelModule,LKM)提高了linux内核的可扩展性用户只要有权限,就可以编写模块挂入内核模块的缺点:增加了内核管理代价LINUX内核模块的框架staticintinit_routine(void){register_chrdev_region()devfs_mk_cdev()…}voidcleanup_routine(void){unregister_chrdev_region()…}module_init(init_routine);module_exit(cleanup_routine);MODULE_LICENSE(GPL);LINUX内核模块的框架structfile_operations{loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatasync);int(*fasync)(int,structfile*,int);……};LINUX内核模块的框架(1)llseek(file,offset,whence):修改文件的读写指针。(2)read(file,buf,count,offset):从设备文件的offset处开始读出count个字节,然后增加*offset的值。(3)write(file,buf,count,offset):从设备文件的offset处写入count个字节,然后增加*offset的值。(4)ioctl(inode,file,cmd,arg):向一个硬件设备发命令,对设备进行控制。(5)mmap(file,vma):将设备空间映射到进程地址空间。(6)open(inode,file):打开并初始化设备。(7)release(inode,file):关闭设备并释放资源。(8)fsync(file,dentry):实现内存与设备之间的同步通信。(9)fasync(file,on):实现内存与设备之间的异步通信。简单字符设备驱程EveryLKMconsistsoftwobasicfunctions(minimum):intinit_module(void)/*usedforallinitializationstuff*/{...}voidcleanup_module(void)/*usedforacleanshutdown*/{...}安装模块命令#insmodmodule.o#modprobemodule.o卸载模块命令#rmmodmodule.o查询系统中已装入的模块#lsmod简单字符设备驱程例子hello.c#defineMODULE#includelinux/module.hintinit_module(void){printk(Hello,world\n);return0;}voidcleanup_module(void){printk(Goodbyecruelworld\n);}编译模块#gcc–chello.c–DMODULE–D__KERNEL__-DLINUX-Wall–O2-I/usr/src/linux-2.6/include安装、卸载模块#insmodhello.oHelloworld#rmmodhelloGoodbyecruelworld简单字符设备驱程staticstructfile_operationshelloworld_fops={open:helloworld_open,read:helloworld_read,write:helloworld_write,ioctl:helloworld_ioctl,};//kernelspace简单字符设备驱程ssize_thelloworld_write(structfile*filp,char*buffer,size_tsize,loff_t*offset)//kernelspace{unsignedcharstring[MAX_BYTE_NUM];unsignedcharsize1=copy_from_user(string,buffer,size);return(size1);}voidhelloworld_write(unsignedintaddr,unsignedchardata)//userspace{structdatadata1=……….;write(fd,&data1,sizeof(structdata));}简单字符设备驱程Kernelspace与userspace数据交互copy_to_user(void__user*to,constvoid*from,unsignedlongn);copy_from_user(void*to,constvoid__user*from,unsignedlongn);模块设计注意事项1:模块设计与应用程序设计模块是装入内核的,运行时CPU处于核心态应用程序运行时CPU处于用户态2:编译模块设计应用程序使用的include文件:/usr/include设计内核模块使用的include文件:/usr/src/linux-2.6/include在编译内核模块时要用-I指明include路径3:设计的模块可以调用Linux内核及其他模块已经输出(exported)的函数,不能利用标准C提供的库函数如printf模块设计注意事项4:区分应用部分代码与模块部分代码一般要求代码尽量放入应用部分;对于时间响应要求高的代码放入模块;对硬件进行直接操作的代码放入模块;中断在用户空间无法用应用程序中有完整的C库可以连接.应用程序由于自身原因错误不会对其他任务及内核有影响
本文标题:STLINUX基础知识介绍
链接地址:https://www.777doc.com/doc-2850672 .html