修复引用计数问题导致内核挂掉问题

This commit is contained in:
zhangzheng
2025-03-17 14:48:28 +08:00
parent 3ecafaed24
commit 58adc1d0b7
22 changed files with 300 additions and 120 deletions

View File

@@ -3,64 +3,180 @@
#include "syscall_backend.h"
#include <sys/socket.h>
#include <net_cli.h>
#include "fd_map.h"
int be_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
{
return net_accept(s, addr, addrlen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
int fd = net_accept(u_fd.priv_fd, addr, addrlen);
if (fd < 0)
{
return fd;
}
int user_fd = fd_map_alloc(0, fd, FD_FS);
if (user_fd < 0)
{
be_close(user_fd);
}
return user_fd;
}
int be_bind(int s, const struct sockaddr *name, socklen_t namelen)
{
return net_bind(s, name, namelen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_bind(u_fd.priv_fd, name, namelen);
}
int be_shutdown(int s, int how)
{
return net_shutdown(s, how);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_shutdown(u_fd.priv_fd, how);
}
int be_getpeername(int s, struct sockaddr *name, socklen_t *namelen)
{
return net_getpeername(s, name, namelen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_getpeername(u_fd.priv_fd, name, namelen);
}
int be_getsockname(int s, struct sockaddr *name, socklen_t *namelen)
{
return net_getsockname(s, name, namelen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_getsockname(u_fd.priv_fd, name, namelen);
}
int be_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)
{
return net_getsockopt(s, level, optname, optval, optlen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_getsockopt(u_fd.priv_fd, level, optname, optval, optlen);
}
int be_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
{
return net_setsockopt(s, level, optname, optval, optlen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_setsockopt(u_fd.priv_fd, level, optname, optval, optlen);
}
int be_connect(int s, const struct sockaddr *name, socklen_t namelen)
{
return net_connect(s, name, namelen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_connect(u_fd.priv_fd, name, namelen);
}
int be_listen(int s, int backlog)
{
return net_listen(s, backlog);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_listen(u_fd.priv_fd, backlog);
}
ssize_t be_recv(int s, void *mem, size_t len, int flags)
{
return net_recv(s, mem, len, flags);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_recv(u_fd.priv_fd, mem, len, flags);
}
ssize_t be_recvfrom(int s, void *mem, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen)
{
return net_recvfrom(s, mem, len, flags, from, fromlen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_recvfrom(u_fd.priv_fd, mem, len, flags, from, fromlen);
}
// ssize_t (*recvmsg)(int s, struct msghdr *message, int flags);
ssize_t be_send(int s, const void *dataptr, size_t size, int flags)
{
return net_send(s, dataptr, size, flags);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_send(u_fd.priv_fd, dataptr, size, flags);
}
// ssize_t (*sendmsg)(int s, const struct msghdr *message, int flags);
ssize_t be_sendto(int s, const void *dataptr, size_t size, int flags,
const struct sockaddr *to, socklen_t tolen)
{
return net_sendto(s, dataptr, size, flags, to, tolen);
fd_map_entry_t u_fd;
int ret = fd_map_get(s, &u_fd);
if (ret < 0)
{
return -EBADF;
}
return net_sendto(u_fd.priv_fd, dataptr, size, flags, to, tolen);
}
int be_socket(int domain, int type, int protocol)
{
return net_socket(domain, type, protocol);
int fd;
fd = net_socket(domain, type, protocol);
if (fd < 0)
{
return fd;
}
int user_fd = fd_map_alloc(0, fd, FD_FS);
if (user_fd < 0)
{
be_close(user_fd);
}
return user_fd;
}

View File

@@ -798,18 +798,19 @@ sys_arch_protect(void)
* own counter (which is locked by the mutex). The return code is not actually
* used. */
// printf("thread:%d\n", lwprot_thread);
if (lwprot_thread != sys_thread_get_private_data_self())
{
/* We are locking the mutex where it has not been locked before *
* or is being locked by another thread */
// pthread_mutex_lock(&lwprot_mutex);
u_mutex_lock(&lwprot_mutex, 0, NULL);
lwprot_thread = sys_thread_get_private_data_self();
lwprot_count = 1;
}
else
/* It is already locked by THIS thread */
lwprot_count++;
// if (lwprot_thread != sys_thread_get_private_data_self())
// {
// /* We are locking the mutex where it has not been locked before *
// * or is being locked by another thread */
// // pthread_mutex_lock(&lwprot_mutex);
// u_mutex_lock(&lwprot_mutex, 0, NULL);
// lwprot_thread = sys_thread_get_private_data_self();
// lwprot_count = 1;
// }
// else
// /* It is already locked by THIS thread */
// lwprot_count++;
u_mutex_lock(&lwprot_mutex, 0, NULL);
return 0;
}
@@ -823,16 +824,17 @@ an operating system.
void sys_arch_unprotect(sys_prot_t pval)
{
LWIP_UNUSED_ARG(pval);
if (lwprot_thread == sys_thread_get_private_data_self())
{
lwprot_count--;
if (lwprot_count == 0)
{
lwprot_thread = (umword_t)0xDEAD;
// pthread_mutex_unlock(&lwprot_mutex);
u_mutex_unlock(&lwprot_mutex);
}
}
// if (lwprot_thread == sys_thread_get_private_data_self())
// {
// lwprot_count--;
// if (lwprot_count == 0)
// {
// lwprot_thread = (umword_t)0xDEAD;
// // pthread_mutex_unlock(&lwprot_mutex);
// u_mutex_unlock(&lwprot_mutex);
// }
// }
u_mutex_unlock(&lwprot_mutex);
}
#endif /* SYS_LIGHTWEIGHT_PROT */

View File

@@ -677,7 +677,7 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
err = netconn_accept(sock->conn, &newconn);
if (err != ERR_OK) {
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_acept failed, err=%d\n", s, err));
if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
if (sock->conn && NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
set_errno(EOPNOTSUPP);
} else if (err == ERR_CLSD) {
set_errno(EINVAL);

View File

@@ -42,7 +42,7 @@
/* We link to special sys_arch.c (for basic non-waiting API layers unit tests) */
#define NO_SYS 0
#define SYS_LIGHTWEIGHT_PROT 0
#define SYS_LIGHTWEIGHT_PROT 1
#define LWIP_NETCONN !NO_SYS
#define LWIP_SOCKET !NO_SYS
#define LWIP_NETCONN_FULLDUPLEX LWIP_SOCKET

View File

@@ -6,8 +6,11 @@
#include "syscall.h"
#include "atomic.h"
#include "libc.h"
#ifdef MKRTOS
#include "cons_cli.h"
#include "u_sig.h"
#include "u_task.h"
#endif
static void dummy(void) {}
weak_alias(dummy, _init);
@@ -147,10 +150,16 @@ weak void ipc_init(void)
static int libc_start_main_stage2(int (*main)(int, char **, char **), int argc, char **argv)
{
char **envp = argv + argc + 1;
#ifdef MKRTOS
fs_backend_init();
ipc_init();
if (argv && argv[0])
{
task_set_obj_name(TASK_THIS, TASK_THIS, argv[0]);
task_set_obj_name(TASK_THIS, THREAD_MAIN, argv[0]);
}
#endif
__libc_start_init();
/* Pass control to the application */
exit(main(argc, argv, envp));
return 0;

View File

@@ -147,7 +147,7 @@ int u_fast_ipc_init(uint8_t *stack_array, uint8_t *msg_buf_array, int stack_msgb
cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw;
msg->map_buf[i] = cons_map_buf[i];
}
#if 1
#if 0
for (int i = 0; i < stack_msgbuf_array_num; i++)
{
printf("stack 0x%x %x\n", stack_array + stack_size * i, stack_size);

View File

@@ -9,7 +9,6 @@
#include "ff.h" /* Obtains integer types */
#include "diskio.h" /* Declarations of disk functions */
#include "ram_disk.h"
#include <stdio.h>
#include "blk_drv_cli.h"
#include "ns_cli.h"
@@ -20,7 +19,7 @@
#include <string.h>
#include "u_share_mem.h"
/* Definitions of physical drive number for each drive */
#define DEV_RAM 0 /* Example: Map Ramdisk to physical drive 0 */
#define DEV_MK_BLOCK 0 /* Example: Map Ramdisk to physical drive 0 */
static obj_handler_t dev_hd;
static obj_handler_t shm_hd;
@@ -30,9 +29,9 @@ static blk_drv_info_t blk_info;
int disk_set_dev_path(int pdrv, const char *dev)
{
int ret;
switch (DEV_RAM)
switch (DEV_MK_BLOCK)
{
case DEV_RAM:
case DEV_MK_BLOCK:
{
int try_cn = 0;
again:
@@ -40,11 +39,11 @@ int disk_set_dev_path(int pdrv, const char *dev)
if (ret < 0)
{
try_cn++;
if (try_cn > 10)
if (try_cn > 100)
{
return ret;
}
u_sleep_ms(20);
u_sleep_ms(5);
goto again;
}
ret = blk_drv_cli_info(dev_hd, &blk_info);
@@ -72,7 +71,7 @@ DSTATUS disk_status(
switch (pdrv)
{
case DEV_RAM:
case DEV_MK_BLOCK:
result = 0;
// translate the reslut code here
@@ -95,7 +94,7 @@ DSTATUS disk_initialize(
switch (pdrv)
{
case DEV_RAM:
case DEV_MK_BLOCK:
{
msg_tag_t tag;
@@ -143,7 +142,7 @@ DRESULT disk_read(
switch (pdrv)
{
case DEV_RAM:
case DEV_MK_BLOCK:
// translate the reslut code here
for (umword_t i = sector; i < sector + count; i++)
{
@@ -176,7 +175,7 @@ DRESULT disk_write(
switch (pdrv)
{
case DEV_RAM:
case DEV_MK_BLOCK:
// translate the arguments here
for (umword_t i = sector; i < sector + count; i++)
{
@@ -209,7 +208,7 @@ DRESULT disk_ioctl(
switch (pdrv)
{
case DEV_RAM:
case DEV_MK_BLOCK:
{
switch (cmd)
{ // fatfs内核使用cmd调用

View File

@@ -174,9 +174,13 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env)
for (int i = 0; i < cmd_params_num; i++)
{
args[i] = &cmd_line[cmd_params_off[i]];
#if 0
printf("parse_cfg args[%d] = %s\n", i, args[i]);
#endif
}
#if 0
printf("parse_cfg cmd_params_num:%d\n", cmd_params_num);
#endif
int ret = app_load(cmd_line, env, &pid, args, cmd_params_num,
NULL, 0, mem_block);
if (ret < 0)