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

shell 物理内存,虚拟内存,VDSO,文件操作 部分注释说明

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 99036cf4
......@@ -37,14 +37,14 @@
#include <lwip/sockets.h>
#if !LWIP_COMPAT_SOCKETS
// 详见: ..\vendor_hisi_hi3861_hi3861\hi3861\third_party\lwip_sack\include\lwip\sockets.h
#define CHECK_NULL_PTR(ptr) do { if (ptr == NULL) { set_errno(EFAULT); return -1; } } while (0)
//接受连接
int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
{
return lwip_accept(s, addr, addrlen);
}
//socket与IP地址绑定。
int bind(int s, const struct sockaddr *name, socklen_t namelen)
{
CHECK_NULL_PTR(name);
......@@ -54,41 +54,41 @@ int bind(int s, const struct sockaddr *name, socklen_t namelen)
}
return lwip_bind(s, name, namelen);
}
//关闭连接
int shutdown(int s, int how)
{
return lwip_shutdown(s, how);
}
//获取对端地址
int getpeername(int s, struct sockaddr *name, socklen_t *namelen)
{
CHECK_NULL_PTR(name);
CHECK_NULL_PTR(namelen);
return lwip_getpeername(s, name, namelen);
}
//获取本地地址
int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
{
CHECK_NULL_PTR(name);
CHECK_NULL_PTR(namelen);
return lwip_getsockname(s, name, namelen);
}
//获取socket属性信息
int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)
{
return lwip_getsockopt(s, level, optname, optval, optlen);
}
//配置socket属性
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
{
return lwip_setsockopt(s, level, optname, optval, optlen);
}
//关闭socket
int closesocket(int s)
{
return lwip_close(s);
}
// 连接到指定的目的IP
int connect(int s, const struct sockaddr *name, socklen_t namelen)
{
CHECK_NULL_PTR(name);
......@@ -98,25 +98,25 @@ int connect(int s, const struct sockaddr *name, socklen_t namelen)
}
return lwip_connect(s, name, namelen);
}
//监听本socket的请求
int listen(int s, int backlog)
{
return lwip_listen(s, backlog);
}
//接收socket上收到的数据
ssize_t recv(int s, void *mem, size_t len, int flags)
{
CHECK_NULL_PTR(mem);
return lwip_recv(s, mem, len, flags);
}
//接收socket上收到的数据,可同时获得数据来源IP地址
ssize_t recvfrom(int s, void *mem, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen)
{
CHECK_NULL_PTR(mem);
return lwip_recvfrom(s, mem, len, flags, from, fromlen);
}
//接收socket上收到的数据,可使用更丰富的参数
ssize_t recvmsg(int s, struct msghdr *message, int flags)
{
CHECK_NULL_PTR(message);
......@@ -125,18 +125,18 @@ ssize_t recvmsg(int s, struct msghdr *message, int flags)
}
return lwip_recvmsg(s, message, flags);
}
//通过socket发送数据
ssize_t send(int s, const void *dataptr, size_t size, int flags)
{
CHECK_NULL_PTR(dataptr);
return lwip_send(s, dataptr, size, flags);
}
// 通过socket发送数据,可使用更丰富的参数
ssize_t sendmsg(int s, const struct msghdr *message, int flags)
{
return lwip_sendmsg(s, message, flags);
}
//通过socket发送数据,可指定发送的目的IP地址
ssize_t sendto(int s, const void *dataptr, size_t size, int flags,
const struct sockaddr *to, socklen_t tolen)
{
......@@ -147,17 +147,17 @@ ssize_t sendto(int s, const void *dataptr, size_t size, int flags,
}
return lwip_sendto(s, dataptr, size, flags, to, tolen);
}
// 创建socket
int socket(int domain, int type, int protocol)
{
return lwip_socket(domain, type, protocol);
}
//网络地址格式转换:将二进制格式IP地址转换为字符串格式。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
{
return lwip_inet_ntop(af, src, dst, size);
}
// 网络地址格式转换:将字符串格式IP地址转换为二进制格式。
int inet_pton(int af, const char *src, void *dst)
{
return lwip_inet_pton(af, src, dst);
......
......@@ -37,7 +37,8 @@
#include "sys/statfs.h"
#include "linux/spinlock.h"
#include "disk_pri.h"
//VFS是Virtual File System(虚拟文件系统)的缩写,它不是一个实际的文件系统,而是一个异构文件系统之上的软件粘合层
//虚拟文件系统初始化
void los_vfs_init(void)
{
int err;
......
......@@ -329,8 +329,8 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
}
#endif
#ifdef LOSCFG_KERNEL_PIPE
OsDriverPipeInit();
#ifdef LOSCFG_KERNEL_PIPE //打开管道宏
OsDriverPipeInit();//管道init
#endif
ret = OsSystemInit();//系统初始化
......@@ -338,8 +338,8 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
return ret;
}
#if LOSCFG_DRIVERS_HIEVENT
OsDriverHiEventInit();
#if LOSCFG_DRIVERS_HIEVENT //打开HIEVENT宏
OsDriverHiEventInit();//HiEvent 初始化
#endif
#if (LOSCFG_KERNEL_TRACE == YES)
......@@ -380,22 +380,22 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
return LOS_OK;
}
//创建系统初始化任务
STATIC UINT32 OsSystemInitTaskCreate(VOID)
{
UINT32 taskID;
TSK_INIT_PARAM_S sysTask;
(VOID)memset_s(&sysTask, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
sysTask.pfnTaskEntry = (TSK_ENTRY_FUNC)SystemInit;
sysTask.pfnTaskEntry = (TSK_ENTRY_FUNC)SystemInit;//外部函数,
sysTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
sysTask.pcName = "SystemInit";
sysTask.usTaskPrio = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;
sysTask.uwResved = LOS_TASK_STATUS_DETACHED;
sysTask.usTaskPrio = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;// 10
sysTask.uwResved = LOS_TASK_STATUS_DETACHED;//任务分离模式
#if (LOSCFG_KERNEL_SMP == YES)
sysTask.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid());
#endif
return LOS_TaskCreate(&taskID, &sysTask);
return LOS_TaskCreate(&taskID, &sysTask);//创建任务
}
#ifdef LOSCFG_MEM_RECORDINFO
......@@ -418,17 +418,17 @@ UINT32 OsSystemInit(VOID)
{
UINT32 ret;
#ifdef LOSCFG_FS_VFS
los_vfs_init();
los_vfs_init(); //虚拟文件初始化
#endif
#ifdef LOSCFG_COMPAT_LINUXKPI
g_pstSystemWq = create_workqueue("system_wq");
#endif
ret = OsSystemInitTaskCreate();
ret = OsSystemInitTaskCreate();//创建 "SystemInit" 任务
if (ret != LOS_OK) {
return ret;
}
#ifdef LOSCFG_MEM_RECORDINFO
ret = OsMemShowTaskCreate();
ret = OsMemShowTaskCreate();//创建 "memshow_task"任务,用于显示虚拟内存使用
if (ret != LOS_OK) {
PRINTK("create memshow_Task error %u\n", ret);
return ret;
......
......@@ -50,7 +50,7 @@ STATIC SPIN_LOCK_S g_traceCpuSpin[LOSCFG_KERNEL_CORE_NUM];
#define TRACE_CPU_LOCK(state, cpuID) LOS_SpinLockSave(&g_traceCpuSpin[(cpuID)], &(state))
#define TRACE_CPU_UNLOCK(state, cpuID) LOS_SpinUnlockRestore(&g_traceCpuSpin[(cpuID)], (state))
STATIC TraceBuffer g_traceBuf[LOSCFG_KERNEL_CORE_NUM];
STATIC TraceBuffer g_traceBuf[LOSCFG_KERNEL_CORE_NUM];//每个CPU core都有traceBuf
STATIC TraceHook *g_traceInfo[LOS_TRACE_TYPE_NUM];
STATIC UINT16 g_frameSize[LOS_TRACE_TYPE_NUM];
......
......@@ -121,40 +121,40 @@ typedef UINT16 (*WriteHook)(UINT8 *inBuf, UINT32 newID, UINT32 oldID);
* Stands for the trace type can be registered.
*/
typedef enum {
LOS_TRACE_SWITCH = 0, /**< trace for task switch, 0 is reserved for taskswitch */
LOS_TRACE_INTERRUPT = 1, /**< trace for Interrrupt, 1 is reserved for interrupt */
LOS_TRACE_SWITCH = 0, /**< trace for task switch, 0 is reserved for taskswitch */ //任务切换的跟踪,0是为taskswitch保留的
LOS_TRACE_INTERRUPT = 1, /**< trace for Interrrupt, 1 is reserved for interrupt */ //中断,1表示为中断保留
LOS_TRACE_TYPE_NUM = 5, /**< num for the register type, user can use 2~ LOS_TRACE_TYPE_NUM-1 */
} TraceType;
/**
* @ingroup los_trace
* struct to store the trace infomation
* struct to store the trace infomation //结构来存储跟踪信息
*/
typedef struct {
UINTPTR tracePos; /**< Data buffer current index position */
UINTPTR traceWrapPos; /**< Data buffer last loop end position */
UINT8 dataBuf[LOS_TRACE_BUFFER_SIZE]; /**< Data buffer */
UINTPTR tracePos; /**< Data buffer current index position */ //数据缓冲区当前索引位置
UINTPTR traceWrapPos; /**< Data buffer last loop end position */ //数据缓冲区最后一个循环结束位置
UINT8 dataBuf[LOS_TRACE_BUFFER_SIZE]; /**< Data buffer */ //数据缓存区
} TraceBuffer;
/**
* @ingroup los_trace
* struct to store the task switch infomation
* struct to store the task switch infomation //结构来存储任务切换的信息
*/
typedef struct {
UINT32 srcTaskId; /**< source taskid */
UINT32 destTaskId; /**< destination taskid */
UINT64 currentTick; /**< Time at which the task switch happens */
UINT32 srcTaskId; /**< source taskid */ //源任务ID
UINT32 destTaskId; /**< destination taskid */ //目标任务ID
UINT64 currentTick; /**< Time at which the task switch happens */ //任务上下文切换时发生的时间
} TaskTraceFrame;
/**
* @ingroup los_trace
* struct to store the interrupt infomation
* struct to store the interrupt infomation //结构来存储中断信息
*/
typedef struct {
UINT32 irqDirection; /**< IRQ_DIRECT_IN stands for entering the irq handler */
/**< IRQ_DIRECT_OUT stands for leaving the previous irq handler */
UINT32 irqNum; /**< IRQ number which trigger the interrupt */
UINT64 currentTick; /**< Time at which the the trace is called */
UINT32 irqDirection; /**< IRQ_DIRECT_IN stands for entering the irq handler */ //IRQ_DIRECT_IN代表进入IRQ处理程序
/**< IRQ_DIRECT_OUT stands for leaving the previous irq handler *///IRQ_DIRECT_OUT代表离开IRQ之前的处理程序
UINT32 irqNum; /**< IRQ number which trigger the interrupt */ //触发中断的IRQ号
UINT64 currentTick; /**< Time at which the the trace is called */ //trace被调用的时间
} IntTraceFrame;
/**
......
......@@ -1338,7 +1338,21 @@ LWIP_STATIC void lwip_arp_usage(const char *cmd)
"\n%s [-i IF] -d IPADDR\n",
cmd, cmd, cmd);
}
/****************************************************************
命令功能
在以太网中,主机之间的通信是直接使用MAC地址(非IP地址)来通信的,所以,对于使用IP通信的协议,
必须能够将IP地址转换成MAC地址,才能在局域网(以太网)内通信。解决这个问题的方法就是主机存储
一张IP和MAC地址对应的表,即ARP缓存,主机要往一个局域网内的目的IP地址发送IP包时,就可以从ARP
缓存表中查询到目的MAC地址。ARP缓存是由TCP/IP协议栈维护的,用户可通过ARP命令查看和修改ARP表。
命令格式
arp
arp [-i IF] -s IPADDR HWADDR
arp [-i IF] -d IPADDR
使用指南
arp命令用来查询和修改TCP/IP协议栈的ARP缓存表,增加非同一子网内的IP地址的ARP表项是没有意义的,协议栈会返回失败。
命令需要启动TCP/IP协议栈后才能使用。
shell arp 打印整个 ARP 缓存表
****************************************************************/
u32_t lwip_arp(int argc, const char **argv)
{
int i;
......@@ -1364,7 +1378,7 @@ u32_t lwip_arp(int argc, const char **argv)
i = 0;
while (argc > 0) {
if (strcmp("-i", argv[i]) == 0 && (argc > 1)) {
if (strcmp("-i", argv[i]) == 0 && (argc > 1)) {//指定的网络接口(可选参数)
/* get the network interface's name */
interface_len = strlen(argv[i + 1]);
if (interface_len < IFNAMSIZ) {
......@@ -1383,7 +1397,8 @@ u32_t lwip_arp(int argc, const char **argv)
}
i += 2;
argc -= 2;
} else if (strcmp("-d", argv[i]) == 0 && (argc > 1)) {
} else if (strcmp("-d", argv[i]) == 0 && (argc > 1)) {//删除一条ARP表项。
/* arp delete */
arp_cmd.option = ARP_OPTION_DEL;
arp_cmd.ipaddr = inet_addr(argv[i + 1]);
......@@ -1395,7 +1410,7 @@ u32_t lwip_arp(int argc, const char **argv)
i += 2;
argc -= 2;
} else if (strcmp("-s", argv[i]) == 0 && (argc > 2)) {
} else if (strcmp("-s", argv[i]) == 0 && (argc > 2)) {//增加一条ARP表项,后面的参数是局域网中另一台主机的IP地址及其对应的MAC地址。
/* arp add */
char *digit = NULL;
u32_t macaddrlen = strlen(argv[i + 2]) + 1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册