针对低固存嵌入式系统的uClinux小型化方法 03
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
针对低固存嵌入式系统的uClinux小型化方法 03
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."); |
|
|
|
|
|