对mtd,disk,filemap注解

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    国内:https://weharmony.21cloudbox.com
    国外:https://weharmony.github.io
上级 1dd125a0
......@@ -247,7 +247,7 @@ typedef struct _los_disk_ { //磁盘描述符
UINT8 type; //flash的类型 例如:EMMC
CHAR *disk_name; //设备名称,通过名称创建一个磁盘,los_alloc_diskid_byname
LOS_DL_LIST head; /* link head of all the partitions */ //双向链表上挂所有分区(los_part->list)
struct pthread_mutex disk_mutex;
struct pthread_mutex disk_mutex;//磁盘互斥锁, @notewhy 为什么不锁分区而锁磁盘 ?
} los_disk;
......@@ -258,7 +258,7 @@ typedef struct _los_part_ {//分区描述符
UINT32 part_no_mbr : 5; /* partition number in the mbr */ //硬盘主引导记录(即Master Boot Record,一般简称为MBR),主分区数量
UINT32 reserved : 3; ////保留,注意 disk_id|part_id|part_no_disk|part_no_mbr|reserved 共用一个UINT32
UINT8 filesystem_type; /* filesystem used in the partition */ //文件系统类型
UINT8 type; //flash的类型 例如:EMMC
UINT8 type; //介质类型 例如:EMMC
struct inode *dev; /* dev devices used in the partition */ //分区中使用的索引节点
CHAR *part_name; //区名称
UINT64 sector_start; /* //开始扇区编号
......
......@@ -79,8 +79,8 @@ enum VnodeType {//节点类型
VNODE_TYPE_UNKNOWN, /* unknown type */ //未知类型
VNODE_TYPE_REG, /* regular file */ //正则文件(普通文件)
VNODE_TYPE_DIR, /* directory */ //目录
VNODE_TYPE_BLK, /* block device */ //块设备
VNODE_TYPE_CHR, /* char device */ //字符设备
VNODE_TYPE_BLK, /* block device */ //块设备驱动
VNODE_TYPE_CHR, /* char device */ //字符设备驱动
VNODE_TYPE_BCHR, /* block char mix device *///块和字符设备混合
VNODE_TYPE_FIFO, /* pipe */ //管道文件
VNODE_TYPE_LNK, /* link */ //链接,这里的链接指的是上层硬链接概念
......@@ -95,6 +95,9 @@ struct IATTR;
* 这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,
等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。
所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)
由于 vnode 是对所有设备的一个抽象,因此不同类型的设备,他们的操作方法也不一样,
因此 vop ,fop 都是接口, data 因设备不同而不同.
*/
struct Vnode {
enum VnodeType type; /* vnode type */ //节点类型
......@@ -106,9 +109,9 @@ struct Vnode {
LIST_HEAD parentPathCaches; /* pathCaches point to parents */ //指向父级路径缓存,上面的都是当了爸爸节点
LIST_HEAD childPathCaches; /* pathCaches point to children */ //指向子级路径缓存,上面都是当了别人儿子的节点
struct Vnode *parent; /* parent vnode */ //父节点
struct VnodeOps *vop; /* vnode operations */ //以 Vnode 方式访问数据(接口实现|驱动程序)
struct file_operations_vfs *fop; /* file operations */ //以 File 方式访问数据(接口实现|驱动程序)
void *data; /* private data */ //私有数据 (drv_data),在 ( register_blockdriver | register_driver )中分配内存
struct VnodeOps *vop; /* vnode operations */ //以 Vnode 方式操作数据(接口实现|驱动程序)
struct file_operations_vfs *fop; /* file operations */ //以 file 方式操作数据(接口实现|驱动程序)
void *data; /* private data */ //指向每种具体设备私有的成员,例如 ( drv_data | nfsnode | ....)
uint32_t flag; /* vnode flag */ //节点标签
LIST_ENTRY hashEntry; /* list entry for bucket in hash table */ //通过它挂入哈希表 g_vnodeHashEntrys[i], i:[0,g_vnodeHashMask]
LIST_ENTRY actFreeEntry; /* vnode active/free list entry */ //通过本节点挂到空闲链表和使用链表上
......
......@@ -53,17 +53,41 @@
#include "os-linux.h"
#include "jffs2/nodelist.h"
/*************************************************************
JFFS2 直接在闪存上提供文件系统,而不是模拟块设备。
JFFS2是Journalling Flash File System Version 2(日志文件系统)的缩写,是MTD设备上实现的日志型文件系统。
JFFS2主要应用于NOR FLASH,其特点是:可读写、支持数据压缩、提供了崩溃/掉电安全保护、提供“写平衡”支持等。
闪存与磁盘介质有许多差异,因此直接将磁盘文件系统运行在闪存上存在性能和安全性上的不足。
为解决这一问题,需要实现一个特别针对闪存的文件系统,JFFS2就是这样一种文件系统。
OpenHarmony内核的JFFS2主要应用于对NOR Flash闪存的文件管理,并且支持多分区。
添加JFFS2分区
调用 add_mtd_partition 函数添加JFFS2分区,该函数会自动为设备节点命名,对于JFFS2,其命名规则是“/dev/spinorblk”加上分区号。
add_mtd_partition函数有四个参数,第一个参数表示介质,有“nand”和“spinor”两种,
JFFS2分区在“spinor”上使用,而“nand”是提供给YAFFS2使用的。
第二个参数表示起始地址,第三个参数表示分区大小,这两个参数都以16进制的形式传入。
最后一个参数表示分区号,有效值为0~19。
*************************************************************/
#ifdef LOSCFG_FS_JFFS
/* forward define */
struct VnodeOps g_jffs2Vops;
struct file_operations_vfs g_jffs2Fops;
struct VnodeOps g_jffs2Vops;//vnode操作接口实现
struct file_operations_vfs g_jffs2Fops;//vfs接口实现
static LosMux g_jffs2FsLock; /* lock for all jffs2 ops */
static LosMux g_jffs2FsLock; /* lock for all jffs2 ops *///操作 jffs2文件系统锁
static pthread_mutex_t g_jffs2NodeLock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
struct Vnode *g_jffs2PartList[CONFIG_MTD_PATTITION_NUM];
struct Vnode *g_jffs2PartList[CONFIG_MTD_PATTITION_NUM];//分区列表
static void Jffs2SetVtype(struct jffs2_inode *node, struct Vnode *pVnode)
{
......@@ -775,8 +799,8 @@ void Jffs2MutexDelete(void)
(void)LOS_MuxDestroy(&g_jffs2FsLock);
}
const struct MountOps jffs_operations = {
.Mount = VfsJffs2Bind,
const struct MountOps jffs_operations = {//jffs对mount接口实现
.Mount = VfsJffs2Bind, //mount()函数实现设备节点和挂载点的挂载。
.Unmount = VfsJffs2Unbind,
.Statfs = VfsJffs2Statfs,
};
......@@ -808,7 +832,7 @@ struct file_operations_vfs g_jffs2Fops = {
.fsync = VfsJffs2Fsync,
};
//文件系统与内存的映射
FSMAP_ENTRY(jffs_fsmap, "jffs2", jffs_operations, TRUE, TRUE);
#endif
......@@ -852,8 +852,8 @@ INT32 los_disk_read(INT32 drvID, VOID *buf, UINT64 sector, UINT32 count, BOOL us
goto ERROR_HANDLE;
}
len = disk->bcache->sectorSize * count;
/* useRead should be FALSE when reading large contiguous data */
result = BlockCacheRead(disk->bcache, (UINT8 *)buf, &len, sector, useRead);
/* useRead should be FALSE when reading large contiguous data *///读取大量连续数据时,useRead 应为 FALSE
result = BlockCacheRead(disk->bcache, (UINT8 *)buf, &len, sector, useRead);//从缓存区里读
if (result != ENOERR) {
PRINT_ERR("los_disk_read read err = %d, sector = %llu, len = %u\n", result, sector, len);
}
......@@ -862,9 +862,9 @@ INT32 los_disk_read(INT32 drvID, VOID *buf, UINT64 sector, UINT32 count, BOOL us
if (disk->dev == NULL) {
goto ERROR_HANDLE;
}
struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;//获取块操作数据方式
if ((bops != NULL) && (bops->read != NULL)) {
result = bops->read(disk->dev, (UINT8 *)buf, sector, count);
result = bops->read(disk->dev, (UINT8 *)buf, sector, count);//读取绝对扇区内容至buf
if (result == (INT32)count) {
result = ENOERR;
}
......@@ -884,7 +884,7 @@ ERROR_HANDLE:
DISK_UNLOCK(&disk->disk_mutex);
return VFS_ERROR;
}
//将buf内容写到指定扇区,
INT32 los_disk_write(INT32 drvID, const VOID *buf, UINT64 sector, UINT32 count)
{
#ifdef LOSCFG_FS_FAT_CACHE
......@@ -916,15 +916,15 @@ INT32 los_disk_write(INT32 drvID, const VOID *buf, UINT64 sector, UINT32 count)
goto ERROR_HANDLE;
}
len = disk->bcache->sectorSize * count;
result = BlockCacheWrite(disk->bcache, (const UINT8 *)buf, &len, sector);
result = BlockCacheWrite(disk->bcache, (const UINT8 *)buf, &len, sector);//写入缓存,后续由缓存同步至磁盘
if (result != ENOERR) {
PRINT_ERR("los_disk_write write err = %d, sector = %llu, len = %u\n", result, sector, len);
}
} else {
#endif
#endif//无缓存情况下获取操作块实现函数指针结构体
struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
if ((disk->dev != NULL) && (bops != NULL) && (bops->write != NULL)) {
result = bops->write(disk->dev, (UINT8 *)buf, sector, count);
result = bops->write(disk->dev, (UINT8 *)buf, sector, count);//真正的写磁盘
if (result == (INT32)count) {
result = ENOERR;
}
......@@ -997,10 +997,10 @@ ERROR_HANDLE:
DISK_UNLOCK(&disk->disk_mutex);
return VFS_ERROR;
}
//读分区上扇区内容
INT32 los_part_read(INT32 pt, VOID *buf, UINT64 sector, UINT32 count, BOOL useRead)
{
const los_part *part = get_part(pt);
const los_part *part = get_part(pt);//先拿到分区信息
los_disk *disk = NULL;
INT32 ret;
......@@ -1008,24 +1008,24 @@ INT32 los_part_read(INT32 pt, VOID *buf, UINT64 sector, UINT32 count, BOOL useRe
return VFS_ERROR;
}
disk = get_disk((INT32)part->disk_id);
disk = get_disk((INT32)part->disk_id);//再拿到磁盘信息
if (disk == NULL) {
return VFS_ERROR;
}
DISK_LOCK(&disk->disk_mutex);
DISK_LOCK(&disk->disk_mutex);//锁磁盘
if ((part->dev == NULL) || (disk->disk_status != STAT_INUSED)) {
goto ERROR_HANDLE;
}
if (count > part->sector_count) {
if (count > part->sector_count) {//不能超过分区总扇区数量
PRINT_ERR("los_part_read failed, invaild count, count = %u\n", count);
goto ERROR_HANDLE;
}
/* Read from absolute sector. */
if (part->type == EMMC) {
if ((disk->sector_count - part->sector_start) > sector) {
if (part->type == EMMC) {//如果分区类型是磁盘介质
if ((disk->sector_count - part->sector_start) > sector) {//从绝对扇区读取
sector += part->sector_start;
} else {
PRINT_ERR("los_part_read failed, invaild sector, sector = %llu\n", sector);
......@@ -1033,13 +1033,13 @@ INT32 los_part_read(INT32 pt, VOID *buf, UINT64 sector, UINT32 count, BOOL useRe
}
}
if ((sector >= GetFirstPartStart(part)) &&
if ((sector >= GetFirstPartStart(part)) && //扇区范围判断
(((sector + count) > (part->sector_start + part->sector_count)) || (sector < part->sector_start))) {
PRINT_ERR("los_part_read error, sector = %llu, count = %u, part->sector_start = %llu, "
"part->sector_count = %llu\n", sector, count, part->sector_start, part->sector_count);
goto ERROR_HANDLE;
}
//读取大量连续数据时,useRead 应为 FALSE
/* useRead should be FALSE when reading large contiguous data */
ret = los_disk_read((INT32)part->disk_id, buf, sector, count, useRead);
if (ret < 0) {
......@@ -1053,7 +1053,7 @@ ERROR_HANDLE:
DISK_UNLOCK(&disk->disk_mutex);
return VFS_ERROR;
}
//将数据写入指定分区的指定扇区
INT32 los_part_write(INT32 pt, const VOID *buf, UINT64 sector, UINT32 count)
{
const los_part *part = get_part(pt);
......@@ -1095,8 +1095,8 @@ INT32 los_part_write(INT32 pt, const VOID *buf, UINT64 sector, UINT32 count)
"part->sector_count = %llu\n", sector, count, part->sector_start, part->sector_count);
goto ERROR_HANDLE;
}
ret = los_disk_write((INT32)part->disk_id, buf, sector, count);
//sector已变成磁盘绝对扇区
ret = los_disk_write((INT32)part->disk_id, buf, sector, count);//直接写入磁盘,
if (ret < 0) {
goto ERROR_HANDLE;
}
......
......@@ -384,6 +384,13 @@ static INT32 CharDriverUnregister(mtd_partition *node)
* Attention: both startAddr and length should be aligned with block size.
* If not, the actual start address and length won't be what you expected.
*///注意:startAddr 和length 都应该与block size 对齐。如果不是,实际的起始地址和长度将不是你所期望的
/*
add_mtd_partition函数有四个参数,
第一个参数表示介质,有“nand”和“spinor”两种,JFFS2分区在“spinor”上使用,而“nand”是提供给YAFFS2使用的。
第二个参数表示起始地址,
第三个参数表示分区大小,这两个参数都以16进制的形式传入。
最后一个参数表示分区号,有效值为0~19
*/
INT32 add_mtd_partition(const CHAR *type, UINT32 startAddr,
UINT32 length, UINT32 partitionNum)
{
......@@ -428,7 +435,7 @@ INT32 add_mtd_partition(const CHAR *type, UINT32 startAddr,
goto ERROR_OUT2;
}
LOS_ListTailInsert(&param->partition_head->node_info, &newNode->node_info);//挂到全局链表上
LOS_ListTailInsert(&param->partition_head->node_info, &newNode->node_info);//挂到全局分区链表上
(VOID)LOS_MuxInit(&newNode->lock, NULL);//初始化锁,每个分区节点都有自己的互斥锁
ret = pthread_mutex_unlock(&g_mtdPartitionLock);
......
......@@ -87,7 +87,7 @@ static char *pread_buf_and_check(int fd, const struct iovec *iov, int iovcnt, ss
return buf;
}
//供系统调用
ssize_t vfs_readv(int fd, const struct iovec *iov, int iovcnt, off_t *offset)
{
int i;
......
......@@ -214,14 +214,14 @@ static char *vfs_normalize_fullpath(const char *directory, const char *filename,
{
char *fullpath = NULL;
if (filename[0] != '/') {
if (filename[0] != '/') {//不是绝对路径
/* not a absolute path */
fullpath = vfs_not_absolute_path(directory, filename, pathname, namelen);
if (fullpath == NULL) {
return (char *)NULL;
}
} else {
} else {//如果是绝对路径
/* it's a absolute path, use it directly */
fullpath = strdup(filename); /* copy string */
......@@ -241,7 +241,7 @@ static char *vfs_normalize_fullpath(const char *directory, const char *filename,
return fullpath;
}
//虚拟文件系统 | 标准化路径
//虚拟文件系统 | 获取文件绝对路径
int vfs_normalize_path(const char *directory, const char *filename, char **pathname)
{
char *fullpath = NULL;
......
......@@ -738,7 +738,7 @@ int osShellCmdTouch(int argc, const char **argv)
filename = argv[0];
ret = vfs_normalize_path(shell_working_directory, filename, &fullpath);
ERROR_OUT_IF(ret < 0, set_err(-ret, "touch error"), return -1);
//如果没有就创建文件方式
fd = open(fullpath, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
free(fullpath);
if (fd == -1)
......
......@@ -114,7 +114,7 @@ struct VmMapRegion {//线性区描述符,内核通过线性区管理虚拟地址
UINT8 forkFlags; /**< vm space fork flags: COPY, ZERO, */ //fork的方式
UINT8 regionType; /**< vm region type: ANON, FILE, DEV */ //映射类型是匿名,文件,还是设备,所谓匿名可理解为内存映射
union {
struct VmRegionFile {//
struct VmRegionFile {//文件映射
unsigned int fileMagic;//具有特殊文件格式的文件,魔法数字.例如 stack top 的魔法数字为 0xCCCCCCCC
struct file *file; //文件指针
const LosVmFileOps *vmFOps;//文件处理各操作接口
......@@ -122,7 +122,7 @@ struct VmMapRegion {//线性区描述符,内核通过线性区管理虚拟地址
struct VmRegionAnon {//匿名映射可理解为就是物理内存
LOS_DL_LIST node; /**< region LosVmPage list */ //线性区虚拟页链表
} ra;
struct VmRegionDev {
struct VmRegionDev {//设备映射
LOS_DL_LIST node; /**< region LosVmPage list */ //线性区虚拟页链表
const LosVmFileOps *vmFOps; //设备也是一种文件
} rd;
......@@ -238,7 +238,7 @@ STATIC INLINE VOID LOS_SetRegionTypeFile(LosVmMapRegion* region)
{
region->regionType = VM_MAP_REGION_TYPE_FILE;
}
//是否为设备映射线性区
//是否为设备映射线性区 /dev/...
STATIC INLINE BOOL LOS_IsRegionTypeDev(LosVmMapRegion* region)
{
return region->regionType == VM_MAP_REGION_TYPE_DEV;
......
......@@ -488,14 +488,14 @@ VOID OsFileCacheRemove(struct page_mapping *mapping)
OsDoFlushDirtyPage(fpage);//遍历脏页链表,一页一页处理
}
}
//虚拟内存文件操作实现类
LosVmFileOps g_commVmOps = {//
.open = NULL,
.close = NULL,
.fault = OsVmmFileFault, //缺页中断处理
.remove = OsVmmFileRemove,//删除页
};
//文件映射
INT32 OsVfsFileMmap(struct file *filep, LosVmMapRegion *region)
{
region->unTypeData.rf.vmFOps = &g_commVmOps;//文件操作
......@@ -504,7 +504,7 @@ INT32 OsVfsFileMmap(struct file *filep, LosVmMapRegion *region)
return ENOERR;
}
/******************************************************************************
有名映射,跟匿名映射相对应
有名映射,可理解为文件映射,跟匿名映射相对应
参数filep是广义的文件,在鸿蒙内核,目录/普通文件/字符设备/块设备/网络套接字/管道/链接 都是文件
******************************************************************************/
STATUS_T OsNamedMMap(struct file *filep, LosVmMapRegion *region)
......@@ -519,10 +519,10 @@ STATUS_T OsNamedMMap(struct file *filep, LosVmMapRegion *region)
}
if (filep->ops != NULL && filep->ops->mmap != NULL) {
if (vnode->type == VNODE_TYPE_CHR || vnode->type == VNODE_TYPE_BLK) {
LOS_SetRegionTypeDev(region);
if (vnode->type == VNODE_TYPE_CHR || vnode->type == VNODE_TYPE_BLK) {//块设备或者字符设备 /dev/..
LOS_SetRegionTypeDev(region);//设置为设备类型
} else {
LOS_SetRegionTypeFile(region);
LOS_SetRegionTypeFile(region);//设置为文件类型
}
int ret = filep->ops->mmap(filep, region);
if (ret != LOS_OK) {
......
......@@ -715,14 +715,14 @@ STATIC LosVmMapRegion *OsVmRegionSplit(LosVmMapRegion *oldRegion, VADDR_T newReg
#endif
return newRegion;
}
//对线性区进行调整
STATUS_T OsVmRegionAdjust(LosVmSpace *space, VADDR_T newRegionStart, size_t size)
{
LosVmMapRegion *region = NULL;
VADDR_T nextRegionBase = newRegionStart + size;
LosVmMapRegion *newRegion = NULL;
region = LOS_RegionFind(space, newRegionStart);
region = LOS_RegionFind(space, newRegionStart);//先找到线性区
if ((region != NULL) && (newRegionStart > region->range.base)) {
newRegion = OsVmRegionSplit(region, newRegionStart);
if (newRegion == NULL) {
......
......@@ -306,7 +306,7 @@ int LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot)
int ret;
(VOID)LOS_MuxAcquire(&space->regionMux);
region = LOS_RegionFind(space, vaddr);
region = LOS_RegionFind(space, vaddr);//通过虚拟地址找到线性区
if (!IS_ALIGNED(vaddr, PAGE_SIZE) || (region == NULL) || (vaddr > vaddr + len)) {
ret = -EINVAL;
goto OUT_MPROTECT;
......@@ -316,12 +316,12 @@ int LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot)
ret = -EINVAL;
goto OUT_MPROTECT;
}
//如果是堆区或VDSO区,说明区内容是不能修改的
if ((region->regionFlags & VM_MAP_REGION_FLAG_VDSO) || (region->regionFlags & VM_MAP_REGION_FLAG_HEAP)) {
ret = -EPERM;
goto OUT_MPROTECT;
}
//如果是共享文件,说明内容也不能修改
if (LOS_IsRegionTypeFile(region) && (region->regionFlags & VM_MAP_REGION_FLAG_SHARED)) {
if (!OsProtMprotectPermCheck(prot, region)) {
ret = -EACCES;
......@@ -330,14 +330,14 @@ int LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot)
}
len = LOS_Align(len, PAGE_SIZE);
/* can't operation cross region */
if (region->range.base + region->range.size < vaddr + len) {
if (region->range.base + region->range.size < vaddr + len) {//判断范围,不能跨区域操作
ret = -EINVAL;
goto OUT_MPROTECT;
}
/* if only move some part of region, we need to split first */
if (region->range.size > len) {
OsVmRegionAdjust(space, vaddr, len);
if (region->range.size > len) {//如果只修改部分区域,我们需要先拆分区
OsVmRegionAdjust(space, vaddr, len);//调整下线性区范围
}
vmFlags = OsCvtProtFlagsToRegionFlags(prot, 0);//转换FLAGS
......
......@@ -1088,7 +1088,7 @@ STATIC INT32 OsConsoleFileInit(CONSOLE_CB *consoleCB)
goto ERROUT_WITH_FULLPATH;
}
filep->f_path = fullpath;
filep->ops = (struct file_operations_vfs *)((struct drv_data *)vnode->data)->ops;//关驱动程序
filep->ops = (struct file_operations_vfs *)((struct drv_data *)vnode->data)->ops;//关驱动程序
VnodeDrop();
return LOS_OK;
......
......@@ -70,7 +70,7 @@ TTY 是 Teletype 或 Teletypewriter 的缩写,字符设备的通称,原来是
/dev/console是一个虚拟的tty,在鸿蒙它映射到真正的dev/ttyS0(UART0)上
能直接显示系统消息的那个终端称为控制台,其他的则称为终端
**********************************************************/
#define CONSOLE "/dev/console"
#define CONSOLE "/dev/console"
#define CONSOLE_NAMELEN 16
#define CONSOLE_RD_BLOCK 1
#define CONSOLE_RD_NONBLOCK 0
......
......@@ -511,4 +511,4 @@ SHELLCMD_ENTRY(trace_shellcmd, CMD_TYPE_EX, "trace", 1, (CmdCallBackFunc)OsShell
#endif
LOS_MODULE_INIT(OsTraceInit, LOS_INIT_LEVEL_EARLIEST);
LOS_MODULE_INIT(OsTraceInit, LOS_INIT_LEVEL_EARLIEST);//跟踪初始化
......@@ -41,6 +41,7 @@
#include "los_init.h"
#include "los_printf_pri.h"
//LK 注者的理解是 log kernel(内核日志)
#ifdef LOSCFG_SHELL_LK
typedef enum {//模块等级
......@@ -201,7 +202,7 @@ STATIC INLINE VOID OsLogCycleRecord(INT32 level)//日志循环记录
}
}
#endif
//默认打印函数,用于回调函数
//内核打印函数,在LOS_LkPrint中回调
VOID OsLkDefaultFunc(INT32 level, const CHAR *func, INT32 line, const CHAR *fmt, va_list ap)
{
if (level > OsLkTraceLvGet()) {
......@@ -238,7 +239,7 @@ UINT32 OsLkLoggerInit(VOID)
{
(VOID)memset_s(&g_logger, sizeof(Logger), 0, sizeof(Logger));
OsLkTraceLvSet(TRACE_DEFAULT);
LOS_LkRegHook(OsLkDefaultFunc);
LOS_LkRegHook(OsLkDefaultFunc);//注册钩子函数,将在 LOS_LkPrint中回调钩子
#ifdef LOSCFG_SHELL_DMESG
(VOID)LOS_DmesgLvSet(TRACE_DEFAULT);
#endif
......
......@@ -1320,7 +1320,7 @@ int SysFsync(int fd)
}
return ret;
}
//从文件读入数据到缓冲数组中
//通过FD读入数据到缓冲数组中,fd为进程描述符
ssize_t SysReadv(int fd, const struct iovec *iov, int iovcnt)
{
int ret;
......@@ -1328,7 +1328,7 @@ ssize_t SysReadv(int fd, const struct iovec *iov, int iovcnt)
struct iovec *iovRet = NULL;
/* Process fd convert to system global fd */
fd = GetAssociatedSystemFd(fd);
fd = GetAssociatedSystemFd(fd);//进程FD转成系统FD
if ((iov == NULL) || (iovcnt <= 0) || (iovcnt > IOV_MAX)) {
ret = vfs_readv(fd, iov, iovcnt, NULL);
return -get_errno();
......
git add -A
git commit -m '对 vdso 实现注解
git commit -m '对mtd,disk,filemap注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
国内:https://weharmony.21cloudbox.com
国外:https://weharmony.github.io
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册