提交 9f85adba 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

1.zzz目录添加编译hi3516dv300后自动生成的宏文件 2.内核有哪些块/字符设备,是如何实现的?

搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
上级 e7a236d3
......@@ -456,6 +456,15 @@ int clock_settime(clockid_t clockID, const struct timespec *tp)
return settimeofday(&tv, NULL);
}
/*******************************************************
获取系统时钟时间
参数:clk_id 设置时间的类型
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从 UTC1970-1-1 0:0:0 开始计时,
中间时刻如果系统时间被用户改成其他,则对应的时间相应改变
CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间
CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间
/********************************************************/
int clock_gettime(clockid_t clockID, struct timespec *tp)
{
UINT32 intSave;
......@@ -470,7 +479,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp)
goto ERROUT;
}
OsGetHwTime(&hwTime);
OsGetHwTime(&hwTime);//获取硬件时间
switch (clockID) {
case CLOCK_MONOTONIC_RAW:
......@@ -484,7 +493,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp)
tp->tv_sec = tmp.tv_sec;
tp->tv_nsec = tmp.tv_nsec;
break;
case CLOCK_REALTIME:
case CLOCK_REALTIME://实时时间
LOS_SpinLockSave(&g_timeSpin, &intSave);
tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj);
tmp = OsTimeSpecAdd(tmp, g_accDeltaFromSet);
......
......@@ -32,28 +32,45 @@
#define __MTD_DEV_H__
#include "los_typedef.h"
/************************************************
Linux系统中采用MTD来管理不同类型的Flash芯片,包括NandFlash和NorFlash
NAND型和NOR型Flash在进行写入和擦除时都需要MTD(Memory Technology Drivers,MTD已集成在Flash芯片内部,
它是对Flash进行操作的接口),这是它们的共同特点;但在NOR型Flash上运行代码不需要任何的软件支持,
而在NAND型Flash上进行同样操作时,通常需要驱动程序,即内存技术驱动程序MTD。
#define MTD_NORFLASH 3
NOR型Flash采用的SRAM接口,提供足够的地址引脚来寻址,可以很容易的存取其片内的每一个字节;
NAND型Flash使用复杂的I/O口来串行的存取数据,各个产品或厂商的方法可能各不相同,通常是采用8个I/O引脚
来传送控制、地址、数据信息。
NAND型Flash具有较高的单元密度,容量可以做得比较大,加之其生产过程更为简单,价格较低;NOR型Flash占据了容量
为1~16MB闪存市场的大部分,而NAND型Flash只是用在8~128MB的产品中,这也说明NOR主要用在代码存储介质中,
NAND适合数据存储。
************************************************/
#define MTD_NORFLASH 3//存储空间一般比较小,但它可以不用初始化,可以在其内部运行程序,一般在其存储一些初始化内存的固件代码;
#define MTD_NANDFLASH 4
#define MTD_DATAFLASH 6
#define MTD_MLCNANDFLASH 8
struct MtdNorDev {
unsigned long blockSize;
unsigned long blockStart;
unsigned long blockEnd;
/*********************************************
扇区是对硬盘而言,而块是对文件系统而言
文件系统不是一个扇区一个扇区的来读数据,一个扇区512个字节,太慢了,所以有了block(块)的概念,
文件系统是一个块一个块的读取的,block才是文件存取的最小单位。
*********************************************/
struct MtdNorDev {//一个block是4K,即:文件系统中1个块是由连续的8个扇区组成
unsigned long blockSize; //块大小,不用猜也知道,是4K,和内存的页等同,如此方便置换
unsigned long blockStart; //开始块索引
unsigned long blockEnd; //结束块索引
};
struct MtdDev {
struct MtdDev {//flash描述符
VOID *priv;
UINT32 type;
UINT64 size;
UINT32 eraseSize;
UINT32 eraseSize;//4K, 跟PAGE_CACHE_SIZE对应
int (*erase)(struct MtdDev *mtd, UINT64 start, UINT64 len, UINT64 *failAddr);
int (*read)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf);
int (*write)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf);
int (*erase)(struct MtdDev *mtd, UINT64 start, UINT64 len, UINT64 *failAddr);//擦除flash操作
int (*read)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf); //读flash操作
int (*write)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf); //写flash操作
};
#endif /* __MTD_DEV_H__ */
......@@ -73,29 +73,29 @@ MTD设备通常可分为四层
这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。
***************************************************************/
typedef struct mtd_node {//通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90)
UINT32 start_block;
UINT32 end_block;
UINT32 patitionnum;
CHAR *blockdriver_name;
CHAR *chardriver_name;
CHAR *mountpoint_name;
VOID *mtd_info; /* Driver used by a partition */
LOS_DL_LIST node_info;
LosMux lock;
UINT32 user_num;
UINT32 start_block; //开始块索引
UINT32 end_block; //结束块索引
UINT32 patitionnum; //分区编号
CHAR *blockdriver_name; //块设备驱动名称
CHAR *chardriver_name; //字符设备驱动名称
CHAR *mountpoint_name; //挂载点名称
VOID *mtd_info; /* Driver used by a partition *///分区使用的驱动程序
LOS_DL_LIST node_info;//双循环节点,挂在首个分区节点上
LosMux lock; //每个分区都有自己的互斥量
UINT32 user_num;
} mtd_partition;
typedef struct par_param {
mtd_partition *partition_head;
struct MtdDev *flash_mtd;
const struct block_operations *flash_ops;//块设备的操作方法
const struct file_operations_vfs *char_ops;//字符设备的操作方法
typedef struct par_param {//分区参数描述符,一个分区既可支持按块访问也可以支持按字符访问,只要有驱动程序就可
mtd_partition *partition_head; //首个分区,其他分区都挂在.node_info节点上
struct MtdDev *flash_mtd; //flash设备描述符,属于硬件驱动层
const struct block_operations *flash_ops; //块设备的操作方法
const struct file_operations_vfs *char_ops; //字符设备的操作方法
CHAR *blockname; //块设备名称
CHAR *charname; //字符设备名称
UINT32 block_size;
UINT32 block_size; //块单位(4K),对文件系统而言是按块读取数据,方便和内存页置换
} partition_param;
#define CONFIG_MTD_PATTITION_NUM 20
#define CONFIG_MTD_PATTITION_NUM 20 //分区数量的上限
#define ALIGN_ASSIGN(len, startAddr, startBlk, endBlk, blkSize) do { \
(len) = (((len) + ((blkSize) - 1)) & ~((blkSize) - 1)); \
......
......@@ -49,20 +49,20 @@ extern "C" {
#define DRIVER_NAME_ADD_SIZE 3
pthread_mutex_t g_mtdPartitionLock = PTHREAD_MUTEX_INITIALIZER;
static INT32 JffsLockInit(VOID) __attribute__((weakref("JffsMutexCreate")));
static VOID JffsLockDeinit(VOID) __attribute__((weakref("JffsMutexDelete")));
//通常在NorFlash上会选取jffs及jffs2文件系统
static INT32 JffsLockInit(VOID) __attribute__((weakref("JffsMutexCreate")));//弱引用 JffsMutexCreate
static VOID JffsLockDeinit(VOID) __attribute__((weakref("JffsMutexDelete")));//弱引用 JffsMutexDelete
partition_param *g_spinorPartParam = NULL;
mtd_partition *g_spinorPartitionHead = NULL;
#define RWE_RW_RW 0755
#define RWE_RW_RW 0755 //文件读/写/执权限,chmod 755
mtd_partition *GetSpinorPartitionHead(VOID)
{
return g_spinorPartitionHead;
}
//初始化 norflash 参数
static VOID MtdNorParamAssign(partition_param *spinorParam, const struct MtdDev *spinorMtd)
{
LOS_ListInit(&g_spinorPartitionHead->node_info);
......@@ -71,21 +71,21 @@ static VOID MtdNorParamAssign(partition_param *spinorParam, const struct MtdDev
* you can change the SPIBLK_NAME or SPICHR_NAME to NULL.
*/
spinorParam->flash_mtd = (struct MtdDev *)spinorMtd;
spinorParam->flash_ops = GetDevSpinorOps();
spinorParam->char_ops = GetMtdCharFops();
spinorParam->flash_ops = GetDevSpinorOps(); //获取块设备操作方法
spinorParam->char_ops = GetMtdCharFops(); //获取字符设备操作方法
spinorParam->blockname = SPIBLK_NAME;
spinorParam->charname = SPICHR_NAME;
spinorParam->partition_head = g_spinorPartitionHead;
spinorParam->block_size = spinorMtd->eraseSize;
spinorParam->block_size = spinorMtd->eraseSize;//4K, 读/写/擦除 的最小单位
}
//反初始化 norflash 参数
static VOID MtdDeinitSpinorParam(VOID)
{
if (JffsLockDeinit != NULL) {
JffsLockDeinit();
}
}
//初始化 nor flash 参数
static partition_param *MtdInitSpinorParam(partition_param *spinorParam)
{
struct MtdDev *spinorMtd = GetMtd("spinor");
......@@ -118,7 +118,7 @@ static partition_param *MtdInitSpinorParam(partition_param *spinorParam)
return spinorParam;
}
/* According the flash-type to init the param of the partition. */
/* According the flash-type to init the param of the partition. *///根据flash类型初始化分区的参数
static INT32 MtdInitFsparParam(const CHAR *type, partition_param **fsparParam)
{
if (strcmp(type, "spinor") == 0) {
......
......@@ -910,8 +910,8 @@ ERROUT:
return VFS_ERROR;
}
/* console device driver function structure */
STATIC const struct file_operations_vfs g_consoleDevOps = {
/* console device driver function structure *///控制台设备驱动程序功能结构体
STATIC const struct file_operations_vfs g_consoleDevOps = {//实现VFS接口函数,对控制台进行操作
.open = ConsoleOpen, /* open */
.close = ConsoleClose, /* close */
.read = ConsoleRead, /* read */
......@@ -996,7 +996,7 @@ ERROUT_WITH_FULLPATH:
/*
* Initialized console control platform so that when we operate /dev/console
* as if we are operating /dev/ttyS0 (uart0).
*///初始化控制台控制平台,以便在操作/dev/console时,就好像我们在操作/dev/ttyS0(uart0)
*///初始化控制台以此来控制平台,以便在操作/dev/console时,就好像我们在操作/dev/ttyS0(uart0)
STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName)
{
INT32 ret;
......@@ -1025,7 +1025,6 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName)
goto ERROUT_WITH_FULLPATH;
}
inode = desc.node;
consoleCB->devInode = inode;
/*
......@@ -1034,6 +1033,10 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName)
* then we can operate console's filep as if we operate uart0 filep of
* /dev/ttyS0.
*/
/*
初始化与/dev/console关联的console filep,将/dev/ttyS0的uart0 inode赋给
/dev/console的console inod,就可以像操作/dev/ttyS0的uart0 filep一样操作控制台的filep
*/
(VOID)memset_s(filep, sizeof(struct file), 0, sizeof(struct file));
filep->f_oflags = O_RDWR;
filep->f_pos = 0;
......@@ -1052,7 +1055,9 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName)
* Use filep to connect console and uart, we can find uart driver function throught filep.
* now we can operate /dev/console to operate /dev/ttyS0 through filep.
*/
ret = register_driver(consoleCB->name, &g_consoleDevOps, DEFFILEMODE, filep);
//使用filep连接控制台和uart,通过它可以找到uart驱动函数, 可以通过filep操作/dev/console
//达到操作/dev/ttyS0的目的
ret = register_driver(consoleCB->name, &g_consoleDevOps, DEFFILEMODE, filep);//注册字符设备驱动程序
if (ret != LOS_OK) {
goto ERROUT_WITH_INODE;
}
......
......@@ -59,7 +59,17 @@ extern "C" {
#define STDIN 0 //标准输入
#define STDOUT 1 //标准输出
#define STDERR 2 //错误
/**********************************************************
https://www.cnblogs.com/sparkdev/p/11460821.html
TTY 是 Teletype 或 Teletypewriter 的缩写,字符设备的通称,原来是指电传打字机,
后来这种设备逐渐键盘和显示器取代。不管是电传打字机还是键盘,显示器,
都是作为计算机的终端设备存在的,所以 TTY 也泛指计算机的终端(terminal)设备。
为了支持这些 TTY 设备,Linux 实现了一个叫做 TTY 的子系统。所以 TTY 既指终端,也指 Linux 的 TTY 子系统
/dev/console是一个虚拟的tty,在鸿蒙它映射到真正的dev/ttyS0(UART0)上
能直接显示系统消息的那个终端称为控制台,其他的则称为终端
**********************************************************/
#define CONSOLE "/dev/console"
#define CONSOLE_NAMELEN 16
#define CONSOLE_RD_BLOCK 1
......
......@@ -330,7 +330,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
#endif
#ifdef LOSCFG_KERNEL_PIPE //打开管道宏
OsDriverPipeInit();//管道init
OsDriverPipeInit();//管道模块初始化
#endif
ret = OsSystemInit();//系统初始化
......@@ -347,14 +347,14 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
#endif
#if (LOSCFG_KERNEL_LITEIPC == YES)
ret = LiteIpcInit();//这是lite自有的IPC模块 初始化
ret = LiteIpcInit();//初始化鸿蒙自有的进程间通讯模块
if (ret != LOS_OK) {
return ret;
}
#endif
#if (LOSCFG_BASE_CORE_HILOG == YES)
ret = HiLogDriverInit();
#if (LOSCFG_BASE_CORE_HILOG == YES)//hilog开关
ret = HiLogDriverInit();//初始化hilog字符设备驱动程序
if (ret != LOS_OK) {
return ret;
}
......@@ -373,8 +373,8 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
return ret;
}
ret = OomTaskInit();//Out-Of-Memory 用户监控使用内存太大的task,在内存不足而某些进程太耗内存时
if (ret != LOS_OK) {//可以直接把进程干掉而释放内存
ret = OomTaskInit();//Out-Of-Memory 用于监控使用内存太大的task.
if (ret != LOS_OK) {//在内存不足而某些进程太耗内存时,内核可直接把进程干掉而释放内存
return ret;
}
......
......@@ -38,20 +38,20 @@
#include "los_vm_map.h"
#include "los_vm_lock.h"
#include "user_copy.h"
#define HILOG_BUFFER 1024
#define DRIVER_MODE 0666
#define HILOG_DRIVER "/dev/hilog"
struct HiLogEntry {
unsigned int len;
unsigned int hdrSize;
unsigned int pid : 16;
unsigned int taskId : 16;
unsigned int sec;
unsigned int nsec;
unsigned int reserved;
char msg[0];
//hilog是鸿蒙的一个用于输出的功能模块
#define HILOG_BUFFER 1024 // 1K缓存, ring buf 方式管理
#define DRIVER_MODE 0666 //权限 chmod 666
#define HILOG_DRIVER "/dev/hilog" // 可以看出hilog是当一种字符设备来实现
struct HiLogEntry { //hilog 实体
unsigned int len; //写入buffer的内容长度
unsigned int hdrSize; // sizeof(struct HiLogEntry) ,为何命名hdr @note_why
unsigned int pid : 16; //进程ID
unsigned int taskId : 16; //任务ID
unsigned int sec; //秒级
unsigned int nsec; //纳秒级,提供给外部准确分析和定位问题
unsigned int reserved;//保留位
char msg[0]; //消息内容
};
ssize_t HilogRead(struct file *filep, char __user *buf, size_t count);
......@@ -61,7 +61,7 @@ int HiLogClose(FAR struct file *filep);
static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t bufLen);
static ssize_t HiLogRead(FAR struct file *filep, char *buffer, size_t bufLen);
//实现VFS接口函数,对hilog进行操作
STATIC struct file_operations_vfs g_hilogFops = {
HiLogOpen, /* open */
HiLogClose, /* close */
......@@ -76,51 +76,51 @@ STATIC struct file_operations_vfs g_hilogFops = {
NULL, /* unlink */
};
FAR struct HiLogCharDevice {
int flag;
LosMux mtx;
unsigned char *buffer;
FAR struct HiLogCharDevice {//hilog 本质上是个字符设备
int flag; //设备标签
LosMux mtx; //读写buf的互斥量
unsigned char *buffer;//采用 ring buffer 管理
wait_queue_head_t wq;
size_t writeOffset;
size_t headOffset;
size_t size;
size_t count;
size_t writeOffset;//用于写操作,不断累加
size_t headOffset;//用于读操作,不断累加
size_t size;//记录buffer使用的大小, 读写操作会返回 +-这个size
size_t count;//读写操作的次数对冲
} g_hiLogDev;
static inline unsigned char *HiLogBufferHead(void)
{
return g_hiLogDev.buffer + g_hiLogDev.headOffset;
}
//为支持VFS,作打开状
int HiLogOpen(FAR struct file *filep)
{
(void)filep;
return 0;
}
//为支持VFS,作关闭状
int HiLogClose(FAR struct file *filep)
{
(void)filep;
return 0;
}
//读写对冲,对hilog的写操作,更新相关变量内容
static void HiLogBufferInc(size_t sz)
{
if (g_hiLogDev.size + sz <= HILOG_BUFFER) {
g_hiLogDev.size += sz;
g_hiLogDev.writeOffset += sz;
g_hiLogDev.writeOffset %= HILOG_BUFFER;
g_hiLogDev.count++;
g_hiLogDev.size += sz; //已使用buf的size
g_hiLogDev.writeOffset += sz;//大小是不断累加
g_hiLogDev.writeOffset %= HILOG_BUFFER;//ring buf
g_hiLogDev.count++;//读写对冲
}
}
//读写对冲,对hilog的读操作,更新相关变量内容
static void HiLogBufferDec(size_t sz)
{
if (g_hiLogDev.size >= sz) {
g_hiLogDev.size -= sz;
g_hiLogDev.size -= sz;//维持可使用buf size
g_hiLogDev.headOffset += sz;
g_hiLogDev.headOffset %= HILOG_BUFFER;
g_hiLogDev.count--;
g_hiLogDev.count--;//读写对冲
}
}
......@@ -170,7 +170,7 @@ static ssize_t HiLogRead(FAR struct file *filep, char *buffer, size_t bufLen)
wait_event_interruptible(g_hiLogDev.wq, (g_hiLogDev.size > 0));
(VOID)LOS_MuxAcquire(&g_hiLogDev.mtx);
(VOID)LOS_MuxAcquire(&g_hiLogDev.mtx);//临界区操作开始
retval = HiLogReadRingBuffer((unsigned char *)&header, sizeof(header));
if (retval < 0) {
retval = -EINVAL;
......@@ -200,10 +200,10 @@ static ssize_t HiLogRead(FAR struct file *filep, char *buffer, size_t bufLen)
HiLogBufferDec(header.len);
retval = header.len + sizeof(header);
out:
(VOID)LOS_MuxRelease(&g_hiLogDev.mtx);
(VOID)LOS_MuxRelease(&g_hiLogDev.mtx);//临界区操作结束
return retval;
}
//写入 RingBuffer环形缓冲,也叫 circleBuffer
static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen)
{
int retval;
......@@ -222,23 +222,23 @@ static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen)
}
return 0;
}
//hilog实体初始化
static void HiLogHeadInit(struct HiLogEntry *header, size_t len)
{
struct timespec now;
struct timespec now;//标准C库函数,时间格式,包含秒数和纳秒数
int ret;
ret = clock_gettime(CLOCK_REALTIME, &now);
ret = clock_gettime(CLOCK_REALTIME, &now);//获取系统实时时间
if (ret != 0) {
dprintf("In %s line %d,clock_gettime fail", __FUNCTION__, __LINE__);
return;
}
header->len = len;
header->pid = LOS_GetCurrProcessID();
header->taskId = LOS_CurTaskIDGet();
header->sec = now.tv_sec;
header->nsec = now.tv_nsec;
header->len = len;//写入buffer的内容长度
header->pid = LOS_GetCurrProcessID();//当前进程ID
header->taskId = LOS_CurTaskIDGet(); //当前任务ID
header->sec = now.tv_sec; //秒级记录
header->nsec = now.tv_nsec; //纳秒级记录
header->hdrSize = sizeof(struct HiLogEntry);
}
......@@ -257,7 +257,7 @@ static void HiLogCoverOldLog(size_t bufLen)
HiLogBufferDec(sizeof(header) + header.len);
}
}
//将外部buf写入hilog设备分两步完成
int HiLogWriteInternal(const char *buffer, size_t bufLen)
{
struct HiLogEntry header;
......@@ -267,14 +267,14 @@ int HiLogWriteInternal(const char *buffer, size_t bufLen)
HiLogCoverOldLog(bufLen);
HiLogHeadInit(&header, bufLen);
retval = HiLogWriteRingBuffer((unsigned char *)&header, sizeof(header));
retval = HiLogWriteRingBuffer((unsigned char *)&header, sizeof(header));//1.先写入头部内容
if (retval) {
retval = -ENODATA;
goto out;
}
HiLogBufferInc(sizeof(header));
HiLogBufferInc(sizeof(header));//
retval = HiLogWriteRingBuffer((unsigned char *)(buffer), header.len);
retval = HiLogWriteRingBuffer((unsigned char *)(buffer), header.len);//2.再写入实际buf内容
if (retval) {
retval = -ENODATA;
goto out;
......@@ -294,7 +294,7 @@ out:
}
return retval;
}
//写hilog,外部以VFS方式写入
static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t bufLen)
{
(void)filep;
......@@ -305,26 +305,26 @@ static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t buf
return HiLogWriteInternal(buffer, bufLen);
}
//初始化全局变量g_hiLogDev
static void HiLogDeviceInit(void)
{
g_hiLogDev.buffer = LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, HILOG_BUFFER);
g_hiLogDev.buffer = LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, HILOG_BUFFER);//分配内核空间
if (g_hiLogDev.buffer == NULL) {
dprintf("In %s line %d,LOS_MemAlloc fail", __FUNCTION__, __LINE__);
}
//初始化waitqueue头,请确保输入参数wait有效,否则系统将崩溃。
init_waitqueue_head(&g_hiLogDev.wq);//见于..\third_party\FreeBSD\sys\compat\linuxkpi\common\src\linux_semaphore.c
LOS_MuxInit(&g_hiLogDev.mtx, NULL);//初始化hilog互斥量
init_waitqueue_head(&g_hiLogDev.wq);
LOS_MuxInit(&g_hiLogDev.mtx, NULL);
g_hiLogDev.writeOffset = 0;
g_hiLogDev.writeOffset = 0;//写g_hiLogDev.buffer偏移地址
g_hiLogDev.headOffset = 0;
g_hiLogDev.size = 0;
g_hiLogDev.size = 0; //
g_hiLogDev.count = 0;
}
//初始化hilog驱动
int HiLogDriverInit(VOID)
{
HiLogDeviceInit();
return register_driver(HILOG_DRIVER, &g_hilogFops, DRIVER_MODE, NULL);
HiLogDeviceInit();//初始化全局变量g_hiLogDev
return register_driver(HILOG_DRIVER, &g_hilogFops, DRIVER_MODE, NULL);//注册字符设备驱动程序,生成inode节点
}
......@@ -219,7 +219,7 @@ STATIC INT32 GetArgs(CHAR **args)
#endif
#ifdef LOSCFG_PLATFORM_HI3518EV300
struct MtdDev *mtd = GetMtd(FLASH_TYPE);
struct MtdDev *mtd = GetMtd(FLASH_TYPE);//获取flash设备描述符
if (mtd == NULL) {
PRINT_ERR("Get spinor mtd failed!\n");
goto ERROUT;
......
......@@ -58,8 +58,8 @@
#define FLASH_TYPE "spinor" //flash类型
#define FLASH_DEV_NAME "/dev/spinorblk0" //根文件系统路径
#define EMMC_SEC_SIZE 512
//扇区是对硬盘而言,而块是对文件系统而言
#define EMMC_SEC_SIZE 512 //扇区大小,按512个字节,按扇区对齐
#define DEC_NUMBER_STRING "0123456789"
#define HEX_NUMBER_STRING "0123456789abcdefABCDEF"
......
......@@ -198,7 +198,7 @@ ERROUT:
set_errno(-ret);
return VFS_ERROR;
}
//实现VFS接口函数,对串行设备进行操作
STATIC const struct file_operations_vfs g_serialDevOps = {
SerialOpen, /* open */
SerialClose, /* close */
......
......@@ -46,9 +46,9 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
#ifdef LOSCFG_FS_VFS
#ifdef LOSCFG_FS_VFS //将设备虚拟为文件统一来操作,对鸿蒙来说一切皆为文件
#define SERIAL "/dev/serial"
#define SERIAL_TTYGS0 "/dev/ttyGS0"
#define SERIAL_TTYGS0 "/dev/ttyGS0"
#define SERIAL_UARTDEV "/dev/uartdev"
#define SERIAL_TYPE_UART_DEV 1
......
......@@ -88,7 +88,7 @@ STATIC UINT32 LiteIpcWrite(IpcContent *content);
STATIC UINT32 GetTid(UINT32 serviceHandle, UINT32 *taskID);
STATIC UINT32 HandleSpecialObjects(UINT32 dstTid, IpcListNode *node, BOOL isRollback);
//实现VFS接口函数,对liteIpc进行操作
STATIC const struct file_operations_vfs g_liteIpcFops = {
LiteIpcOpen, /* open */
LiteIpcClose, /* close */
......
......@@ -334,7 +334,7 @@ STATIC INT32 TelnetPoll(struct file *file, poll_table *table)
TelnetUnlock();
return 0;
}
//实现VFS接口函数,对远程登录进行操作
STATIC const struct file_operations_vfs g_telnetOps = {//远程登录操作
TelnetOpen, //打开
TelnetClose, //关闭
......
#编译器将本文件自动生成 menuconfig.h 放在..\..\..\platform\include\menuconfig.h
#详见 zzz\autogen\menuconfig.h
#
# Automatically generated file; DO NOT EDIT.
# Huawei LiteOS Configuration
#
#
# Compiler
# Compiler
#
# LOSCFG_COMPILER_HIMIX_32 is not set
LOSCFG_COMPILER_CLANG_LLVM=y
......@@ -12,8 +14,8 @@ LOSCFG_COMPILER_CLANG_LLVM=y
#
# Platform
#
LOSCFG_PLATFORM="hi3516dv300"
LOSCFG_PLATFORM_HI3516DV300=y
LOSCFG_PLATFORM="hi3516dv300" #平台名称
LOSCFG_PLATFORM_HI3516DV300=y #编译平台开关
# LOSCFG_PLATFORM_HI3518EV300 is not set
# LOSCFG_TEE_ENABLE is not set
LOSCFG_PLATFORM_BSP_GIC_V2=y
......@@ -54,7 +56,7 @@ LOSCFG_KERNEL_VDSO=y #VDSO就是Virtual Dynamic Shared Object,就是内
# LOSCFG_KERNEL_TRACE is not set
LOSCFG_KERNEL_LITEIPC=y #用于轻量级进程间通讯
LOSCFG_KERNEL_PIPE=y #管道支持
LOSCFG_BASE_CORE_HILOG=y #hilog 日志支持
LOSCFG_BASE_CORE_HILOG=y #hilog 日志支持 /dev/hilog
#
# Lib
......@@ -77,14 +79,14 @@ LOSCFG_FILE_MODE=y #文件权限支持 例如:chmod 777
LOSCFG_FS_FAT=y #文件配置表(英语:File Allocation Table,首字母缩略字:FAT),是一种由微软发明并拥有部分专利的文件系统
LOSCFG_FS_FAT_CACHE=y #FAT缓存支持
# LOSCFG_FS_FAT_CACHE_SYNC_THREAD is not set
LOSCFG_FS_FAT_CHINESE=y
LOSCFG_FS_FAT_CHINESE=y #区域设置和命名空间配置
LOSCFG_FS_FAT_VIRTUAL_PARTITION=y
LOSCFG_FS_FAT_VOLUMES=16
LOSCFG_FS_FAT_DISK=y
LOSCFG_FS_FAT_DISK=y #
LOSCFG_FS_RAMFS=y
LOSCFG_FS_NFS=y #网络文件系统,英文Network File System(NFS)
LOSCFG_FS_PROC=y
LOSCFG_FS_JFFS=y #Journalling Flash File System(闪存设备日志型文件系统,JFFS)最初是由瑞典的 Axis Communication AB 开发
LOSCFG_FS_JFFS=y #Journalling Flash File System(闪存设备日志型文件系统,JFFS),一般用于nor flash的文件系统
#
# Net
......@@ -96,9 +98,9 @@ LOSCFG_NET_LWIP_SACK_2_1=y
# Debug
#
# LOSCFG_COMPILE_DEBUG is not set
LOSCFG_PLATFORM_ADAPT=y
LOSCFG_ENABLE_OOM_LOOP_TASK=y
LOSCFG_ENABLE_MAGICKEY=y
LOSCFG_PLATFORM_ADAPT=y
LOSCFG_ENABLE_OOM_LOOP_TASK=y #支持内存溢出检测
LOSCFG_ENABLE_MAGICKEY=y #支持魔法键
# LOSCFG_THUMB is not set
# LOSCFG_DEBUG_VERSION is not set
LOSCFG_DRIVERS_HDF_PLATFORM_UART=y
......
/*
*
* Automatically generated file; DO NOT EDIT.
* Huawei LiteOS Configuration
*
*/
#define LOSCFG_DRIVERS_HDF_PLATFORM_WATCHDOG 1
#define LOSCFG_KERNEL_LITEIPC 1
#define LOSCFG_SECURITY_CAPABILITY 1
#define LOSCFG_DRIVERS_USB_ETHERNET 1
#define LOSCFG_NET_LWIP_SACK 1
#define LOSCFG_DRIVERS_HDF_PLATFORM_I2C 1
#define LOSCFG_ASLR 1
#define LOSCFG_FS_FAT_VIRTUAL_PARTITION 1
#define LOSCFG_FS_FAT_VOLUMES 16
#define LOSCFG_DRIVERS_HDF_LCD 1
#define LOSCFG_DRIVERS_HDF_PLATFORM_SDIO 1
#define LOSCFG_ENABLE_MAGICKEY 1
#define LOSCFG_KERNEL_SMP_CORE_NUM 2
#define LOSCFG_DRIVERS 1
#define LOSCFG_PLATFORM_ADAPT 1
#define LOSCFG_KERNEL_PIPE 1
#define LOSCFG_DRIVERS_MEM 1
#define LOSCFG_CC_STACKPROTECTOR_STRONG 1
#define LOSCFG_DRIVERS_MTD_SPI_NOR_HIFMC100 1
#define LOSCFG_COMPILER_CLANG_LLVM 1
#define LOSCFG_DRIVERS_USB_SERIAL 1
#define LOSCFG_DRIVERS_HDF 1
#define LOSCFG_BASE_CORE_HILOG 1
#define LOSCFG_NET_LWIP_SACK_2_1 1
#define LOSCFG_FS_VFS 1
#define LOSCFG_KERNEL_DYNLOAD 1
#define LOSCFG_COMPAT_POSIX 1
#define LOSCFG_DRIVERS_USB 1
#define LOSCFG_KERNEL_VDSO 1
#define LOSCFG_COMPAT_BSD 1
#define LOSCFG_FILE_MODE 1
#define LOSCFG_DRIVERS_USB_DEVICE_CLASS_DRIVERS 1
#define LOSCFG_PLATFORM "hi3516dv300"
#define LOSCFG_PLATFORM_BSP_GIC_V2 1
#define LOSCFG_DRIVERS_HDF_TP_5P5_GT911 1
#define LOSCFG_PLATFORM_ROOTFS 1
#define LOSCFG_KERNEL_CPPSUPPORT 1
#define LOSCFG_HW_RANDOM_ENABLE 1
#define LOSCFG_ARCH_CORTEX_A7 1
#define LOSCFG_DRIVERS_HDF_PLATFORM_RTC 1
#define LOSCFG_DRIVERS_HDF_PLATFORM_UART 1
#define LOSCFG_FS_FAT 1
#define LOSCFG_DRIVERS_HIETH_SF 1
#define LOSCFG_DRIVERS_HDF_PLATFORM_HISI_SDK 1
#define LOSCFG_FS_NFS 1
#define LOSCFG_ARCH_ARM_VER "armv7-a"
#define LOSCFG_FS_FAT_DISK 1
#define LOSCFG_DRIVERS_USB_HOST_XHCI 1
#define LOSCFG_IRQ_USE_STANDALONE_STACK 1
#define LOSCFG_ENABLE_OOM_LOOP_TASK 1
#define LOSCFG_ARCH_ARM_AARCH32 1
#define LOSCFG_KERNEL_EXTKERNEL 1
#define LOSCFG_DRIVERS_USB_MASS_STORAGE 1
#define LOSCFG_DRIVERS_MTD_SPI_NOR 1
#define LOSCFG_DRIVERS_HDF_INPUT 1
#define LOSCFG_DRIVERS_HDF_PLATFORM 1
#define LOSCFG_FS_PROC 1
#define LOSCFG_ARCH_CPU "cortex-a7"
#define LOSCFG_DRIVERS_RANDOM 1
#define LOSCFG_ARCH_ARM_V7A 1
#define LOSCFG_LIB_ZLIB 1
#define LOSCFG_DRIVERS_SD 1
#define LOSCFG_DRIVERS_HI3881 1
#define LOSCFG_SECURITY_VID 1
#define LOSCFG_ARCH_FPU "neon-vfpv4"
#define LOSCFG_DRIVERS_MTD 1
#define LOSCFG_ARCH_FPU_VFP_D32 1
#define LOSCFG_DRIVERS_HDF_PLATFORM_GPIO 1
#define LOSCFG_PLATFORM_HI3516DV300 1
#define LOSCFG_ARCH_ARM 1
#define LOSCFG_DRIVERS_USB_RNDIS_HOST 1
#define LOSCFG_FS_JFFS 1
#define LOSCFG_DRIVERS_HIEVENT 1
#define LOSCFG_KERNEL_SMP 1
#define LOSCFG_ARCH_FPU_VFP_NEON 1
#define LOSCFG_DRIVERS_EMMC 1
#define LOSCFG_DRIVERS_USB_WIRELESS 1
#define LOSCFG_KERNEL_SMP_LOCKDEP 1
#define LOSCFG_CPUP_INCLUDE_IRQ 1
#define LOSCFG_KERNEL_SMP_TASK_SYNC 1
#define LOSCFG_FS_FAT_CACHE 1
#define LOSCFG_DRIVERS_HDF_LCD_ICN9700 1
#define LOSCFG_DRIVERS_MMC 1
#define LOSCFG_SECURITY 1
#define LOSCFG_FS_VFS_BLOCK_DEVICE 1
#define LOSCFG_FS_RAMFS 1
#define LOSCFG_DRIVERS_HDF_WIFI 1
#define LOSCFG_DRIVERS_USB_HID_CLASS 1
#define LOSCFG_DRIVERS_USB_4G_MODEM 1
#define LOSCFG_LIB_LIBC 1
#define LOSCFG_FS_FAT_CHINESE 1
#define LOSCFG_DRIVERS_NETDEV 1
#define LOSCFG_KERNEL_CPUP 1
#define LOSCFG_DRIVERS_HDF_USB 1
#define LOSCFG_DRIVERS_VIDEO 1
#define LOSCFG_ARCH_FPU_VFP_V4 1
#define LOSCFG_DRIVERS_EMMC_HS200 1
#define LOSCFG_DRIVERS_HDF_PLATFORM_SPI 1
#define LOSCFG_DRIVERS_USB_HOST_DRIVER 1
git add -A
git commit -m 'python build.py ipcamera_hi3516dv300 编译kernel_liteos_a_note通过
git commit -m '1.zzz目录添加编译hi3516dv300后自动生成的宏文件 2.内核有哪些块/字符设备,是如何实现的?
搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册