一、Linux内核子系统简介

Linux支持多个进程的并发运行,每个进程都请求系统资源,比如运算、内存、网络连接等其他一些资源等。内核负责处理所有这些请求,根据内核完成任务的不同,可以将内核分为进程管理、内存管理、文件系统、设备控制、网络功能五个子系统。

二、Linux文件系统

在Linux操作系统中,文件系统是用来组织、管理、存放文件的一套管理机制。Linux支持多种文件系统类型,也就是在物理介质上组织数据的不同方式。

  Linux支持的文件系统类型有ext2、ext3、ext4、vfat、ntfs、iso9660、jiffs、romfs、cramfs和nfs等。常用的存储介质有nor flash、nand flash、emmc 等。具体使用哪种文件系统需要根据存储介质、访问速度、存储容量来选择。

三、Linux文件系统结构

linux 文件系统 xfs bios boot linux 文件系统多核单_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文件系统的关系如表所示:

linux 文件系统 xfs bios boot linux 文件系统多核单_Linux_02

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,所需要监控的属性节点的名称