欢迎来到皮皮网网首页

【sax源码】【阿拉德源码打包】【南通源码世界】ramfs 源码

来源:web易语言源码 时间:2024-12-29 13:27:38

1.做一个嵌入式Linux系统究竟要做哪些工作
2.mtd和mtdblock的区别

ramfs 源码

做一个嵌入式Linux系统究竟要做哪些工作

       ã€€ã€€1、Linux 基础

       ã€€ã€€å®‰è£…Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统

       èƒ½å¤Ÿç†Ÿç»ƒä½¿ç”¨Linux系统的基本命令 认识Linux系统的常用服务安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务

       Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器

       ã€€ã€€2、Shell 编程基础

       ã€€ã€€Shell简介 认识后台程序Bash编程熟悉Linux系统下的编辑环境 熟悉Linux下的各种Shell 熟练进行shell编程熟悉vi基本操作

       ç†Ÿæ‚‰Emacs的基本操作 比较不同shell的区别 编写一个测试服务器是否连通的shell脚本程序 编写一个查看进程是否存在的shell脚本程序

       ç¼–写一个带有循环语句的shell脚本程序

       ã€€ã€€3、Linux 下的C 编程基础

       ã€€ã€€linux C语言环境概述 Gcc使用方法 Gdb调试技术 Autoconf Automake Makefile 代码优化

       ç†Ÿæ‚‰Linux系统下的开发环境 熟悉Gcc编译器 熟悉Makefile规则编写Hello,sax源码World程序 使用 make命令编译程序 编写带有一个循环的程序

       è°ƒè¯•ä¸€ä¸ªæœ‰é—®é¢˜çš„程序

       ã€€ã€€4、嵌入式系统开发基础

       ã€€ã€€åµŒå…¥å¼ç³»ç»Ÿæ¦‚述交叉编译 配置TFTP服务 配置NFS服务 下载Bootloader和内核

       åµŒå…¥å¼Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程 建立嵌入式系统开发环境制作cross_gcc工具链 编译并下载U-boot

       ç¼–译并下载Linux内核 编译并下载Linux应用程序

       ã€€ã€€5、嵌入式系统移植

       ã€€ã€€Linux内核代码 平台相关代码分析 ARM平台介绍 平台移植的关键技术 移植Linux内核到 ARM平台 了解移植的概念

       èƒ½å¤Ÿç§»æ¤Linux内核移植Linux2.6内核到 ARM9开发板

       ã€€ã€€6、嵌入式 Linux 下串口通信

       ã€€ã€€ä¸²è¡ŒI/O的基本概念 嵌入式Linux应用软件开发流程 Linux系统的文件和设备 与文件相关的系统调用 配置超级终端和MiniCOM

       èƒ½å¤Ÿç†Ÿæ‚‰è¿›è¡Œä¸²å£é€šä¿¡ 熟悉文件I/O 编写串口通信程序 编写多串口通信程序

       ã€€ã€€7、嵌入式系统中多进程程序设计

       ã€€ã€€Linux系统进程概述 嵌入式系统的进程特点 进程操作 守护进程 相关的系统调用了解Linux系统中进程的概念 能够编写多进程程序编写多进程程序

       ç¼–写一个守护进程程序 sleep系统调用任务管理、同步与通信 Linux任务概述任务调度 管道 信号 共享内存 任务管理 API 了解Linux系统任务管理机制

       ç†Ÿæ‚‰è¿›ç¨‹é—´é€šä¿¡çš„几种方式 熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输 编写一个使用共享内存的程序

       ã€€ã€€8、嵌入式系统中多线程程序设计

       ã€€ã€€çº¿ç¨‹çš„基础知识 多线程编程方法 线程应用中的同步问题了解线程的概念 能够编写简单的多线程程序编写一个多线程程序

       ã€€ã€€9、嵌入式 Linux 网络编程

       ã€€ã€€ç½‘络基础知识 嵌入式Linux中TCP/IP网络结构 socket 编程 常用 API函数 分析Ping命令的实现 基本UDP套接口编程 许可证管理

       PPP协议 GPRS 了解嵌入式Linux网络体系结构 能够进行嵌入式Linux环境下的socket 编程 熟悉UDP协议、PPP协议 熟悉GPRS

       ä½¿ç”¨socket 编写代理服务器 使用socket 编写路由器 编写许可证服务器 指出TCP和UDP的优缺点 编写一个web服务器 编写一个运行在

       ARM平台的网络播放器

       ã€€ã€€ã€GUI 程序开发

       ã€€ã€€GUI基础 嵌入式系统GUI类型 编译QT 进行QT开发熟悉嵌入式系统常用的GUI 能够进行QT编程使用QT编写“Hello,World”程序

       è°ƒè¯•ä¸€ä¸ªåŠ å…¥ä¿¡å·/槽的实例 通过重载QWidget 类方法处理事件

       ã€€ã€€ã€Linux 字符设备驱动程序

       ã€€ã€€è®¾å¤‡é©±åŠ¨ç¨‹åºåŸºç¡€çŸ¥è¯† Linux系统的模块 字符设备驱动分析 fs_operation结构 加载驱动程序了解设备驱动程序的概念

       äº†è§£Linux字符设备驱动程序结构 能够编写字符设备驱动程序编写Skull驱动 编写键盘驱动 编写I/O驱动 分析一个看门狗驱动程序

       å¯¹æ¯”Linux2.6内核与2.4内核中字符设备驱动的不同Linux 块设备驱动程序块设备驱动程序工作原理 典型的块设备驱动程序分析

       å—设备的读写请求队列了解Linux块设备驱动程序结构 能够编写简单的块设备驱动程序比较字符设备与块设备的异同 编写MMC卡驱动程序 分析一个文件系统

       å¯¹æ¯”Linux2.6内核与2.4内核中块设备驱动的不同

       ã€€ã€€ã€æ–‡ä»¶ç³»ç»Ÿ

       ã€€ã€€è™šæ‹Ÿæ–‡ä»¶ç³»ç»Ÿ 文件系统的建立 ramfs内存文件系统 proc文件系统 devfs 文件系统 MTD技术简介 MTD块设备初始化

       MTD块设备的读写操作了解Linux系统的文件系统 了解嵌入式Linux的文件系统 了解MTD技术 能够编写简单的文件系统为 ARM9开发板添加 MTD支持

       ç§»æ¤JFFS2文件系统 通过proc文件系统修改操作系统参数 分析romfs 文件系统源代码 创建一个cramfs 文件系统

       ã€€ã€€æ— è®ºé€‰æ‹©å“ªä¸€æ–¹å‘,基本的linux的知识是需要具备的,其他还需要掌握的知识有ARM(最常用的一款嵌入式处理器)和C语言编程,每一方面知识的掌握熟练程度都最终决定了个人进行嵌入式linux开发的综合能力。

       æ›´å¤šè¯¦æƒ…来源:《华清远见嵌入式学院》

mtd和mtdblock的区别

       mtd-utils工具对mtd和mtdblock分区设备的区别处理

       1 / $ flash_eraseall /dev/mtdblock/2

       2 flash_eraseall: /dev/mtdblock/2: unable to get MTD device info

       3 / $ flash_eraseall /dev/mtdblock/2

       4 flash_eraseall: /dev/mtdblock/2: unable to get MTD device info

       5 / $ flash_eraseall /dev/mtd/2

       6 Erasing Kibyte @ 8e -- % complete.

       7 / $ ls

       1 / $ flashcp rootfs_version /dev/mtdblock2

       2 This doesn't seem to be a valid MTD flash device!

       3 / $ flashcp rootfs_version /dev/mtdblock/2

       4 This doesn't seem to be a valid MTD flash device!

       5 / $ flashcp rootfs_version /dev/mtd2

       6 / $ ls

       mtd和mtdblock分区设备mount时的区别

       1 / $ mount -t jffs2 /dev/mtd/2 qqzm/

       2 mount: Mounting /dev/mtd/2 on qqzm/ failed: Invalid argument

       3 / $ mount -t jffs2 /dev/mtd2 qqzm/

       4 mount: Mounting /dev/mtd2 on qqzm/ failed: Invalid argument

       5 / $ mount -t jffs2 /dev/mtdblock/2 qqzm/

       6 / $ ls

       mtdblock挂载成功,单擦除后卸载失败

        / $ flash_eraseall /dev/mtd/2 <span></span> Erasing Kibyte @ 8e -- % complete.

        /qqzm $ mount

        /dev/root on / type jffs2 (rw,noatime)

        proc on /proc type proc (rw,nodiratime)

        sysfs on /sys type sysfs (rw)

        devfs on /dev type devfs (rw)

        devpts on /dev/pts type devpts (rw)

        /dev/mmcblk0p1 on /mnt/sd type vfat (rw,nodiratime,fmask=,dmask=,codepage=cp,iocharset=iso-1)

        /dev/mtdblock/2 on /qqzm type jffs2 (rw,noatime)

        none on /qqzm/www/cgi-bin/tmp type ramfs (rw)

        /qqzm $ cd ..

        / $ umount /qqzm

        umount: Couldn't umount /qqzm: Inappropriate ioctl for device

        / $ umount /dev/mtdblock/2

        umount: Couldn't umount /dev/mtdblock/2: Inappropriate ioctl for device

        / $

       MTD技术的基本原理

       MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口,并进行了一个层次划分,层次从上到下大致为:设备文件、MTD设备层、MTD原始设备层、硬件驱动层。MTD的所有源代码在/drivers/mtd子目录下。

       ç³»ç»Ÿä¸­çš„MTD设备文件

        ~ $ ls /dev/mtd* -l

        crw-rw---- 1 root root , 0 Jan 1 : /dev/mtd0

        crw-rw---- 1 root root , 1 Jan 1 : /dev/mtd0ro

        crw-rw---- 1 root root , 2 Jan 1 : /dev/mtd1

        crw-rw---- 1 root root , 3 Jan 1 : /dev/mtd1ro

        crw-rw---- 1 root root , 4 Jan 1 : /dev/mtd2

        crw-rw---- 1 root root , 5 Jan 1 : /dev/mtd2ro

        crw-rw---- 1 root root , 6 Jan 1 : /dev/mtd3

        crw-rw---- 1 root root , 7 Jan 1 : /dev/mtd3ro

        brw-rw---- 1 root root , 0 Jan 1 : /dev/mtdblock0

        brw-rw---- 1 root root , 1 Jan 1 : /dev/mtdblock1

        brw-rw---- 1 root root , 2 Jan 1 : /dev/mtdblock2

        brw-rw---- 1 root root , 3 Jan 1 : /dev/mtdblock3

       

        /dev/mtd:

        crw-rw-rw- 1 root root , 0 Jan 1 : 0

        cr--r--r-- 1 root root , 1 Jan 1 : 0ro

        crw-rw-rw- 1 root root , 2 Jan 1 : 1

        cr--r--r-- 1 root root , 3 Jan 1 : 1ro

        crw-rw-rw- 1 root root , 4 Jan 1 : 2

        cr--r--r-- 1 root root , 5 Jan 1 : 2ro

        crw-rw-rw- 1 root root , 6 Jan 1 : 3

        cr--r--r-- 1 root root , 7 Jan 1 : 3ro

       

        /dev/mtdblock:

        brw------- 1 root root , 0 Jan 1 : 0

        brw------- 1 root root , 1 Jan 1 : 1

        brw------- 1 root root , 2 Jan 1 : 2

        brw------- 1 root root , 3 Jan 1 : 3

        ~ $

       å¯ä»¥çœ‹åˆ°æœ‰mtdN和对应的/dev/mtd/N、mtdblockN和对应的/dev/mtdblock/N两类MTD设备,分别是字符设备,主设备号和块设备,主设备号。其中/dev/mtd0和/dev/mtd/0是完全等价的,/dev/mtdblock0和/dev/mtdblock/0是完全等价的,而/dev/mtd0和/dev/mtdblock0则是同一个MTD分区的两种不同应用描述,操作上是有区别的。

       /dev/mtdN设备

       /dev/mtdN 是MTD架构中实现的mtd分区所对应的字符设备(将mtd设备分成多个区,每个区就为一个字符设备),其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。

       mtd-utils中的flash_eraseall等工具,就是以这些ioctl为基础而实现的工具,实现一些关于Flash的操作。比如,mtd 工具中 flash_eraseall中:

       1 if (ioctl(fd, MEMGETINFO, &meminfo) != 0)

       2 {

       3 fprintf(stderr, "%s: %s: unable to get MTD device info\n",exe_name, mtd_device);

       4 return 1;

       5 }

       MEMGETINFO是Linux MTD中的drivers/mtd/mtdchar.c中的ioctl命令,使用mtd字符设备需要加载mtdchar内核模块。该代码解释了上面的第一个现象。

       /dev/mtdblockN设备

       /dev/mtdblockN,是Flash驱动中用add_mtd_partitions()添加MTD设备分区,而生成的对应的块设备。MTD块设备驱动程序可以让flash器件伪装成块设备,实际上它通过把整块的erase block放到ram里面进行访问,然后再更新到flash,用户可以在这个块设备上创建通常的文件系统。

       è€Œå¯¹äºŽMTD块设备,MTD设备层是不提供ioctl的实现方法的,也就不会有对应的MEMGETINFO命令之类,因此不能使用nandwrite,flash_eraseall,flash_erase等工具去对/dev/mtdblockN去进行操作,否则就会出现上面的现象一,同时也解释了现象3——用mtd2擦除分区后,在用mtdblock2进行umount就会造成混乱。

       mtd块设备的大小可以通过proc文件系统进行查看:

        ~ $ cat /proc/partitions

        major minor #blocks name

       

        0 mtdblock0

        1 mtdblock1

        2 mtdblock2

        3 mtdblock3

        0 mmcblk0

        1 mmcblk0p1

        ~ $

       åŽé¢çš„两个是SD块设备的分区大小。每个block的大小是1KB。

       MTD设备分区和总结

       é€šè¿‡proc文件系统查看mtd设备的分区情况:

       1 ~ $ cat /proc/mtd

       2 dev: size erasesize name

       3 mtd0: "boot"

       4 mtd1: "kernel"

       5 mtd2: "roofs"

       6 mtd3: "app"

       7 ~ $

       å¯ä»¥å‘现,实际上mtdN和mtdblockN描述的是同一个MTD分区,对应同一个硬件分区,两者的大小是一样的,只不过是MTD设备层提供给上层的视图不一样,给上层提供了字符和块设备两种操作视图——为了上层使用的便利和需要,比如mount命令的需求,你只能挂载块设备(有文件系统),而不能对字符设备进行挂载,否则会出现上面的现象2:无效参数。

       è¿™é‡Œå¯¹äºŽmtd和mtdblock设备的使用场景进行简单总结:

       mtd-utils工具只能应用与/dev/mtdN的MTD字符设备

       mount、umount命令只对/dev/mtdblockN的MTD块设备有效

       /dev/mtdN和/dev/mtdblockN是同一个MTD设备的同一个分区(N一样)