一、Linux内核子系统简介
Linux支持多个进程的并发运行,每个进程都请求系统资源,比如运算、内存、网络连接等其他一些资源等。内核负责处理所有这些请求,根据内核完成任务的不同,可以将内核分为进程管理、内存管理、文件系统、设备控制、网络功能五个子系统。
二、Linux文件系统
在Linux操作系统中,文件系统是用来组织、管理、存放文件的一套管理机制。Linux支持多种文件系统类型,也就是在物理介质上组织数据的不同方式。
Linux支持的文件系统类型有ext2、ext3、ext4、vfat、ntfs、iso9660、jiffs、romfs、cramfs和nfs等。常用的存储介质有nor flash、nand flash、emmc 等。具体使用哪种文件系统需要根据存储介质、访问速度、存储容量来选择。
三、Linux文件系统结构
四、Linux根文件系统
当内核启动后第一件事就是要到存储设备上找到根文件系统。根文件系统包含了使用系统运行的主要程序数据。根文件系统被存储在flash存储器的多个分区中其中一个。具体的分区名字和路径由uboot传递参数给内核,内核根据参数挂载保存根文件系统的分区。如果根文件系统不能被挂载将导致系统启动失败。
在PC上uboot传递给内核的命令行参数:
BOOT_IMAGE=/vmlinuz-3.10.0-862.14.4.el7.x86_64
root=/dev/mapper/centos-root ro
crashkernel=auto
rd.lvm.lv=centos/root
rd.lvm.lv=centos/swap rhgb quiet
LANG=en_US.UTF-8
在嵌入式中uboot传递给内核的命令参数:
earlyprintk=sunxi-uart,0x01c28000
nitcall_debug=0
console=ttyS0,115200
loglevel=3
root=/dev/mmcblk0p7
init=/init
partitions=boot-resource@mmcblk0p2:env@mmcblk0p5:boot@mmcblk0p6:rootfs@mmcblk0p7:data@mmcblk0p8:UDISK@mmcblk0p1
cma=64M
androidboot.selinux=permissive
androidboot.serialno=940078864320040f088f
androidboot.hardware=sun50iw1p1
boot_type=2
androidboot.lcd_x=1024 androidboot.lcd_y=600
六、sysfs文件系统
sysfs是Linux里一种特殊的文件系统,Linux设备驱动模型由大量的数据结构和算法组成,这些数据结构非常的复杂,多数据结构之间通过指针相互关联,构成树形或者网状关系。显示这种关系的最好方法是利用一种树形的文件系统,这就是sysfs文件系统。
sysfs文件系统是一个只存在于内存中的文件系统,内核通过这个文件系统将内核中的一些关于设备、总线和驱动的信息到处到用户空间。
sysfs文件系统是内核对象(kobject)、属性(kobj_type)及他们的相互关系的一种表现机制。Kobject是组成设备驱动模型的基本结构。在权限允许的情况下用户可以从sysfs文件系统的属性文件中读出内核数据,也可以通过属性文件将数据写入内核中。在内核中数据结构与sysfs文件系统的关系如表所示:
1.在sysfs文件系统下创建目录与属性文件的方法
函数原型:
static inline int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp);
参数分析:
struct kobject *kobj,要在其上创建组的kobject
struct attribute_group *grp,要创建的属性组
2. sysfs_notify机制
在sysfs文件系统中, sysfs_dirent是组成sysfs单元的基本数据结构,它是sysfs文件或文件夹在内存中的代表。表示文件类型,增删文件实际是处理sysfs_dirent树。所以对于sysfs文件系统下的属性文件的修改不能通过inotify监控,需要通过sysfs_notify机制实现。
sysfs_notify可以理解为一种通信机制,实质是调用sysfs_notify_dirent(),用来唤醒在读写属性文件(sysfs节点)时因调用select()或poll()而阻塞的用户进程。
函数原型:
void sysfs_notify(struct kobject *k, const char *dir, const char *attr)
参数分析:
struct kobject *k,要在其上创建组的kobject
char *dir,目录,一般设置为NULL
char *attr,所需要监控的属性节点的名称