微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 低固存嵌入式系统的uClinux小型化方法

低固存嵌入式系统的uClinux小型化方法

时间:06-21 来源:互联网 点击:

比如alloc_vfsmnt()和free_vfsmnt()是分配和释放vfsmount结构,完全可以删去,但有些内核函数只有一部分涉及到对vfsrmnt结构的操作,所以不能全部删除,必须对相应部分做出修改。

1.2.2 对内核启动初始化的影响

由于init()进程不能从根文件系统加载,所以凡是涉及根文件系统初始化函数的都必须删除,以支持内核与应用程序一体化。初始化进程init代码如下:

static int init(void *unused)

{……

if(open(/dev/console,O_RDWR,0) 0)

……

if(execute_command)

execve(execute_command,argv_init,envp_init);

execve(/sbin/init,argv_init;envp_init);

……

panic(No init found.Try passing init= option to kernel);

}

init()完成系统的初始化,包括外部设备的初始化,释放init()前初始化后代码占用的内存,以及控制台的初始化,最后从根文件系统加载整个系统的第一个进程init,它是所有进程的“鼻祖”。由于根文件的删除,所以可以删除控制台以及调用init进程。

1.2.3 对ReFS和外部设备的影响

ReFS可以像mount_root()那样直接把ReFS当成根文件系统来装,但它并不像根文件系统那样有bash,gretty等应用程序,也不具备挂载其它系统的能力,所以不是真正的根文件系统。内核中有几个根文件系统和外设相关的重要内核级全局变量:file_system_type,btkdevs[MAX_BLKDEV],chrdevs[MAX_CHRDEV],super_block。

file_system_type是一个描述系统中所有支持的文件系统的数据结构。VFS在内存中维护这样一个数据结构的列表,全局指针变量为file_systems。新文件系统必须通过register_filesystem()来注册以让系统识别,即是在链表file_systems结尾插人一个file_systm_type数据结构。blkdevs[MAX_BLKDEV]和chrdevs[MAX_CHRDEV]分别为块设备和字符设备的注册数组,包含主设备号和次设备号,以及有关设备操作的跳转指针。块设备和字符设备分别通过register_blkdev()和register_chrdev()向系统注册设备。super_block是超级块数据结构,存放着整个文件系统的信息和超级块操作的函数。在通用内核中根文件系统的安装的顺序是:从file_systems处取得根文件系统的read_super(),read_super()指向具体的驱动程序读操作,通过读取得超级块,然后在内存中创建inode,file,dentry等数据结构,用于文件的读写操作。

在这里,同样可以用与根文件系统相同的装载方法来初始化ReFS,但是比前者简单多,因为后者不涉及安装挂载点及与此相关的操作。对于外设,内核一般是通过根文件系统搜索到设备文件,再来访问外设,当中要涉及到搜索路径和挂接点到外设翻译的问题,而在这里外设是独立的,不依赖于根系统,所以实现起来更简单,可以直接依据内核数据结构blkdevs[]和chrdevs[]提供的操作函数表指针,来操作具体的驱动程序操作外设。2 内核与应用程序的一体化

uClinux的内核有两种可选的运行方式:Flash运行方式和 运行方式。Flash运行方式直接在Flash上运行,是很多嵌入式系统采用的方法。RAM运行方式运行速度可能更快(RAM 的存取速率要比Flash高),所需的内存也较少,同时这也是标准LinuX系统采用的启动方式。

不管采用哪种运行方式,没有文件系统的uClinux必须要实现内核与应用程序的一体化,一体化可以通过创建进程的方式来实现。创建进程可以采用内核函数do_fork()和do_execve(),也可以仍然用系统调用fork()和execve(),因为没有MMU的微控制器,内核的运行其实是与应用程序一样的。但在这里execve()是经过上面修改过的,去掉了其装载可执行文件的能力后,可采用直接跳转到可执行文件入口点的方法,运行应用程序。创建一个所有应用程序的跳转表:

struct App_table{

Int(*App_main)();//主程序

int(*LCD_window)();//A机操作界面管理程序

int(*AD)();//A/D采样程序

……}

然后在init()末尾添加如下代码:

if(fork()==0) execve(App_table->App_main);

else panic(No App_main found.);

3 新型文件系统(ReFS)开发

在某些嵌入式系统中要保存的文件大都是一条条操作记录或是系统警告提示信息,有固定的数据格式和长度,就好像数据库里的记录。而且针对这种简单文件系统的操作可能非常简单,所以借鉴EXT2和JFFS2等其它文件系统的设计开发了一种新的文件系统,文中将之命名为记录型文件系统(ReFS),其存储物理结构如图3所示。

数据块的大小是记录大小的n倍,是数据分配的最小单位,可以事先给不同用户分配不同的的空间,也可以限制用户使用的存储空间,然后动态地分配实际

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top