增加部分注释
This commit is contained in:
@@ -1,21 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#define FUTEX_QUEUE_LEN 16 //!< 一个地址最多有16个等待者
|
||||
|
||||
typedef struct futex_queue
|
||||
{
|
||||
umword_t m[FUTEX_QUEUE_LEN];
|
||||
int front;
|
||||
int rear;
|
||||
} futex_queue_t;
|
||||
typedef int (*futex_iter_func)(umword_t e, void *data);
|
||||
|
||||
void fq_init(futex_queue_t *q);
|
||||
int fq_empty(futex_queue_t *q);
|
||||
int fq_enqueue(futex_queue_t *q, umword_t e);
|
||||
int fq_dequeue(futex_queue_t *q, umword_t *e);
|
||||
int fq_queue_len(futex_queue_t *q);
|
||||
bool_t fq_is_full(futex_queue_t *q);
|
||||
int fq_queue_iter(futex_queue_t *q, futex_iter_func iter_func, void *data);
|
||||
@@ -1,4 +1,13 @@
|
||||
|
||||
/**
|
||||
* @file access.c
|
||||
* @author zhangzheng (1358745329@qq.com)
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2023-12-05
|
||||
*
|
||||
* @copyright Copyright (c) 2023
|
||||
*
|
||||
*/
|
||||
#include "types.h"
|
||||
#include <task.h>
|
||||
#include <mm_space.h>
|
||||
@@ -6,10 +15,12 @@
|
||||
|
||||
/**
|
||||
* @brief 检测内存是否可访问
|
||||
*
|
||||
* @param addr
|
||||
* @param size
|
||||
* @return bool_t
|
||||
*
|
||||
* @param tg_task 目标进程
|
||||
* @param addr 开始地址
|
||||
* @param size 大小
|
||||
* @param ignore_null 是否忽略nullptr
|
||||
* @return bool_t TRUE:可访问,FALSE:不可访问
|
||||
*/
|
||||
bool_t is_rw_access(task_t *tg_task, void *addr, size_t size, bool_t ignore_null)
|
||||
{
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
#include "types.h"
|
||||
#include "app.h"
|
||||
|
||||
/**
|
||||
* @brief 通过地址获得app的信息
|
||||
*
|
||||
* @param addr 内存地址
|
||||
* @return app_info_t* app的信息
|
||||
*/
|
||||
app_info_t *app_info_get(void *addr)
|
||||
{
|
||||
return (app_info_t *)addr;
|
||||
|
||||
@@ -10,7 +10,11 @@
|
||||
*/
|
||||
#include "types.h"
|
||||
#include "arch.h"
|
||||
|
||||
/**
|
||||
* @brief 锁住当前cpu
|
||||
*
|
||||
* @return umword_t
|
||||
*/
|
||||
umword_t cpulock_lock(void)
|
||||
{
|
||||
umword_t res;
|
||||
@@ -19,7 +23,11 @@ umword_t cpulock_lock(void)
|
||||
sti();
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取cpu锁的状态
|
||||
*
|
||||
* @return umword_t
|
||||
*/
|
||||
umword_t cpulock_get_status(void)
|
||||
{
|
||||
umword_t res;
|
||||
@@ -27,7 +35,11 @@ umword_t cpulock_get_status(void)
|
||||
res = intr_status();
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置cpu锁的状态
|
||||
*
|
||||
* @param s
|
||||
*/
|
||||
void cpulock_set(umword_t s)
|
||||
{
|
||||
if (s)
|
||||
|
||||
@@ -19,24 +19,41 @@
|
||||
#include "init.h"
|
||||
#include "globals.h"
|
||||
#include "thread.h"
|
||||
/**
|
||||
* @brief factory的操作码
|
||||
*
|
||||
*/
|
||||
enum
|
||||
{
|
||||
FACTORY_CREATE_KOBJ
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 根factory
|
||||
*
|
||||
*/
|
||||
static factory_t root_factory;
|
||||
|
||||
/**
|
||||
* @brief 内核对象注册的factory函数
|
||||
*
|
||||
*/
|
||||
static factory_func factory_func_list[FACTORY_FUNC_MAX];
|
||||
|
||||
/**
|
||||
* @brief 在系统初始化时调用
|
||||
* @brief 在系统初始化时调用,初始化factoyr的内存
|
||||
*
|
||||
*/
|
||||
void factory_mem_init(void)
|
||||
static void factory_mem_init(void)
|
||||
{
|
||||
// Nothing.
|
||||
}
|
||||
INIT_KOBJ_MEM(factory_mem_init);
|
||||
/**
|
||||
* @brief 注册一个内核对象的工厂函数
|
||||
*
|
||||
* @param func 注册的工厂函数
|
||||
* @param inx 注册的工厂函数类型
|
||||
* @pre inx>=0 && inx < FACTORY_FUNC_MAX && factory_func_list[inx] == NULL
|
||||
*/
|
||||
void factory_register(factory_func func, int inx)
|
||||
{
|
||||
assert(inx >= 0);
|
||||
@@ -44,7 +61,14 @@ void factory_register(factory_func func, int inx)
|
||||
assert(factory_func_list[inx] == NULL);
|
||||
factory_func_list[inx] = func;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 生成一个内核对象该接口调用注册的内核对象函数创建一个内核对象。
|
||||
*
|
||||
* @param kobj 函数的调用者
|
||||
* @param lim 内存限额
|
||||
* @param f 系统调用传递的寄存器参数
|
||||
* @return kobject_t* ==NULL 创建失败 !=NULL创建成功
|
||||
*/
|
||||
static kobject_t *factory_manu_kobj(kobject_t *kobj, ram_limit_t *lim, entry_frame_t *f)
|
||||
{
|
||||
kobject_t *new_kobj = NULL;
|
||||
@@ -59,6 +83,14 @@ static kobject_t *factory_manu_kobj(kobject_t *kobj, ram_limit_t *lim, entry_fra
|
||||
}
|
||||
return new_kobj;
|
||||
}
|
||||
/**
|
||||
* @brief 创建一个内核对象并map到进程
|
||||
*
|
||||
* @param kobj 当前的factory
|
||||
* @param tk 映射到那个task
|
||||
* @param f 系统调用参数
|
||||
* @return msg_tag_t 参见 @see msg_tag_t
|
||||
*/
|
||||
static msg_tag_t factory_create_map(kobject_t *kobj, task_t *tk, entry_frame_t *f)
|
||||
{
|
||||
vpage_t page = vpage_create_raw(f->r[2]);
|
||||
@@ -123,12 +155,25 @@ factory_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_f
|
||||
|
||||
f->r[0] = tag.raw;
|
||||
}
|
||||
/**
|
||||
* @brief factory对象的初始化函数
|
||||
*
|
||||
* @param fac 初始化的factory对象
|
||||
* @param max 最大限额值
|
||||
*/
|
||||
static void factory_init(factory_t *fac, umword_t max)
|
||||
{
|
||||
kobject_init(&fac->kobj, FACTORY_TYPE);
|
||||
ram_limit_init(&fac->limit, max);
|
||||
fac->kobj.invoke_func = factory_syscall;
|
||||
}
|
||||
/**
|
||||
* @brief 创建并初始化一个工厂对象
|
||||
*
|
||||
* @param lim
|
||||
* @param max
|
||||
* @return factory_t*
|
||||
*/
|
||||
static factory_t *fatory_create(ram_limit_t *lim, umword_t max)
|
||||
{
|
||||
factory_t *kobj = mm_limit_alloc(lim, sizeof(factory_t));
|
||||
@@ -142,7 +187,7 @@ static factory_t *fatory_create(ram_limit_t *lim, umword_t max)
|
||||
return kobj;
|
||||
}
|
||||
/**
|
||||
* @brief 该函数创建一个工厂对象
|
||||
* @brief factory的工厂函数,该函数创建一个工厂对象
|
||||
*
|
||||
* @param lim
|
||||
* @param arg0
|
||||
@@ -163,12 +208,21 @@ static kobject_t *factory_create_func(ram_limit_t *lim, umword_t arg0, umword_t
|
||||
|
||||
return &kobj->kobj;
|
||||
}
|
||||
/**
|
||||
* @brief 初始化一个根工厂对象
|
||||
*
|
||||
*/
|
||||
static void root_factory_init(void)
|
||||
{
|
||||
factory_init(&root_factory, 0);
|
||||
global_reg_kobj(&root_factory.kobj, FACTORY_PROT);
|
||||
}
|
||||
INIT_KOBJ(root_factory_init);
|
||||
/**
|
||||
* @brief 获取根工厂对象
|
||||
*
|
||||
* @return factory_t*
|
||||
*/
|
||||
factory_t *root_factory_get(void)
|
||||
{
|
||||
return &root_factory;
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include "assert.h"
|
||||
#include "slist.h"
|
||||
#include "spinlock.h"
|
||||
// #include "futex_queue.h"
|
||||
#include "globals.h"
|
||||
#include "string.h"
|
||||
#include "ipc.h"
|
||||
@@ -29,6 +28,10 @@
|
||||
#include "limits.h"
|
||||
#include "futex.h"
|
||||
|
||||
/**
|
||||
* @brief 以下是futex的操作码
|
||||
*
|
||||
*/
|
||||
#define FUTEX_WAIT 0
|
||||
#define FUTEX_WAKE 1
|
||||
#define FUTEX_FD 2
|
||||
@@ -42,9 +45,13 @@
|
||||
#define FUTEX_WAKE_CLEAR 10
|
||||
#define FUTEX_WAITERS 0x80000000
|
||||
|
||||
/**
|
||||
* @brief futex对象的操作码
|
||||
*
|
||||
*/
|
||||
enum futex_op
|
||||
{
|
||||
FUTEX_CTRL,
|
||||
FUTEX_CTRL, //!< futex的控制
|
||||
};
|
||||
|
||||
struct timespec
|
||||
@@ -58,19 +65,27 @@ struct timespec
|
||||
*/
|
||||
typedef struct futex_lock
|
||||
{
|
||||
uint32_t *uaddr; //!< 锁的地址
|
||||
slist_head_t thread_list_head;
|
||||
size_t cnt;
|
||||
uint32_t *uaddr; //!< 锁的地址
|
||||
slist_head_t thread_list_head; //!< 存储线程的头节点
|
||||
size_t cnt; //!< 有多少个线程在等待锁
|
||||
} futex_lock_t;
|
||||
|
||||
/**
|
||||
* @brief futex的对象定义
|
||||
*
|
||||
*/
|
||||
typedef struct futex
|
||||
{
|
||||
kobject_t kobj;
|
||||
futex_lock_t fl_list[CONFIG_FT_ADDR_NR]; //!< 存储加锁的地址
|
||||
} futex_t;
|
||||
|
||||
static futex_t futex_obj;
|
||||
static futex_t futex_obj; //!< 全局的futex对象
|
||||
static void futex_init(futex_t *ft);
|
||||
/**
|
||||
* @brief futex的等待的item
|
||||
*
|
||||
*/
|
||||
typedef struct futex_wait_item
|
||||
{
|
||||
slist_head_t node;
|
||||
@@ -78,7 +93,7 @@ typedef struct futex_wait_item
|
||||
mword_t sleep_times;
|
||||
} futex_wait_item_t;
|
||||
|
||||
static slist_head_t wait_list;
|
||||
static slist_head_t wait_list; //!< futex的等待队列
|
||||
|
||||
/**
|
||||
* @brief 初始化一个超时等待队列
|
||||
@@ -117,13 +132,23 @@ void futex_timeout_times_tick(void)
|
||||
item = next;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 初始化全局的futex并注册
|
||||
*
|
||||
*/
|
||||
static void futex_reg(void)
|
||||
{
|
||||
futex_init(&futex_obj);
|
||||
global_reg_kobj(&futex_obj.kobj, FUTEX_PROT);
|
||||
}
|
||||
INIT_KOBJ(futex_reg);
|
||||
|
||||
/**
|
||||
* @brief 查找futex中指定线程是否存在
|
||||
*
|
||||
* @param flt futex_lock_t对象
|
||||
* @param thread_hd 线程的指针
|
||||
* @return bool_t TRUE:存在 FALSE:不存在
|
||||
*/
|
||||
static bool_t futex_find_thread(futex_lock_t *flt, thread_t *thread_hd)
|
||||
{
|
||||
thread_t *pos;
|
||||
@@ -137,11 +162,24 @@ static bool_t futex_find_thread(futex_lock_t *flt, thread_t *thread_hd)
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
/**
|
||||
* @brief futex进队
|
||||
*
|
||||
* @param flt
|
||||
* @param th
|
||||
*/
|
||||
static void futex_enqueue(futex_lock_t *flt, thread_t *th)
|
||||
{
|
||||
slist_add_append(&flt->thread_list_head, &th->futex_node);
|
||||
flt->cnt++;
|
||||
}
|
||||
/**
|
||||
* @brief futex出队
|
||||
*
|
||||
* @param flt
|
||||
* @param th
|
||||
* @return int
|
||||
*/
|
||||
static int futex_dequeue(futex_lock_t *flt, thread_t **th)
|
||||
{
|
||||
assert(th);
|
||||
@@ -156,6 +194,12 @@ static int futex_dequeue(futex_lock_t *flt, thread_t **th)
|
||||
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* @brief 获取futex的锁有多少个线程在等待
|
||||
*
|
||||
* @param flt
|
||||
* @return size_t
|
||||
*/
|
||||
static size_t futex_cnt(futex_lock_t *flt)
|
||||
{
|
||||
return flt->cnt;
|
||||
@@ -195,6 +239,13 @@ static futex_lock_t *futex_set_addr(futex_t *ft, void *uaddr, thread_t *hd)
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
/**
|
||||
* @brief 找到指定地址的锁结构体
|
||||
*
|
||||
* @param fst
|
||||
* @param uaddr
|
||||
* @return futex_lock_t*
|
||||
*/
|
||||
static futex_lock_t *futex_find(futex_t *fst, void *uaddr)
|
||||
{
|
||||
for (int i = 0; i < CONFIG_FT_ADDR_NR; i++)
|
||||
@@ -206,7 +257,19 @@ static futex_lock_t *futex_find(futex_t *fst, void *uaddr)
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief futex的处理函数
|
||||
*
|
||||
* @param fst
|
||||
* @param uaddr
|
||||
* @param futex_op
|
||||
* @param val
|
||||
* @param timeout
|
||||
* @param uaddr2
|
||||
* @param val3
|
||||
* @param tid
|
||||
* @return int
|
||||
*/
|
||||
static int futex_dispose(futex_t *fst, uint32_t *uaddr, int futex_op, uint32_t val,
|
||||
umword_t timeout /*val2*/, uint32_t uaddr2, uint32_t val3, int tid)
|
||||
|
||||
@@ -280,7 +343,7 @@ static int futex_dispose(futex_t *fst, uint32_t *uaddr, int futex_op, uint32_t v
|
||||
break;
|
||||
case FUTEX_WAIT:
|
||||
{
|
||||
if (!is_rw_access(thread_get_bind_task(cur_th),uaddr, sizeof(*uaddr), FALSE))
|
||||
if (!is_rw_access(thread_get_bind_task(cur_th), uaddr, sizeof(*uaddr), FALSE))
|
||||
{
|
||||
spinlock_set(&fst->kobj.lock, status);
|
||||
return -EACCES;
|
||||
@@ -372,7 +435,7 @@ static int futex_dispose(futex_t *fst, uint32_t *uaddr, int futex_op, uint32_t v
|
||||
case FUTEX_UNLOCK_PI:
|
||||
case FUTEX_WAKE_CLEAR:
|
||||
{
|
||||
if (!is_rw_access(thread_get_bind_task(cur_th),uaddr, sizeof(*uaddr), FALSE))
|
||||
if (!is_rw_access(thread_get_bind_task(cur_th), uaddr, sizeof(*uaddr), FALSE))
|
||||
{
|
||||
spinlock_set(&fst->kobj.lock, status);
|
||||
return -EACCES;
|
||||
@@ -405,7 +468,7 @@ static int futex_dispose(futex_t *fst, uint32_t *uaddr, int futex_op, uint32_t v
|
||||
}
|
||||
case FUTEX_LOCK_PI:
|
||||
{
|
||||
if (!is_rw_access(thread_get_bind_task(cur_th),uaddr, sizeof(*uaddr), FALSE))
|
||||
if (!is_rw_access(thread_get_bind_task(cur_th), uaddr, sizeof(*uaddr), FALSE))
|
||||
{
|
||||
spinlock_set(&fst->kobj.lock, status);
|
||||
return -EACCES;
|
||||
@@ -427,6 +490,14 @@ static int futex_dispose(futex_t *fst, uint32_t *uaddr, int futex_op, uint32_t v
|
||||
spinlock_set(&fst->kobj.lock, status);
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* @brief futex的系统调用
|
||||
*
|
||||
* @param kobj
|
||||
* @param sys_p
|
||||
* @param in_tag
|
||||
* @param f
|
||||
*/
|
||||
static void futex_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f)
|
||||
{
|
||||
msg_tag_t tag = msg_tag_init4(0, 0, 0, -EINVAL);
|
||||
@@ -465,7 +536,12 @@ static void futex_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_ta
|
||||
}
|
||||
f->r[0] = tag.raw;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 在task结束时,需要删除某个task所关联的futex
|
||||
*
|
||||
* @param obj_space 需要操作的task的obj_space
|
||||
* @param kobj 哪一个futex对象
|
||||
*/
|
||||
static void futex_unmap(obj_space_t *obj_space, kobject_t *kobj)
|
||||
{
|
||||
task_t *task = container_of(obj_space, task_t, obj_space);
|
||||
@@ -508,6 +584,11 @@ static void futex_release_stage2(kobject_t *kobj)
|
||||
{
|
||||
printk("futex don't release.\n");
|
||||
}
|
||||
/**
|
||||
* @brief 初始化futex对象
|
||||
*
|
||||
* @param ft
|
||||
*/
|
||||
static void futex_init(futex_t *ft)
|
||||
{
|
||||
kobject_init(&ft->kobj, FUTEX_TYPE);
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
#include "types.h"
|
||||
#include "futex_queue.h"
|
||||
#include <assert.h>
|
||||
|
||||
void fq_init(futex_queue_t *q)
|
||||
{
|
||||
q->front = 0;
|
||||
q->rear = 0;
|
||||
}
|
||||
int fq_empty(futex_queue_t *q)
|
||||
{
|
||||
assert(q);
|
||||
if (q->front == q->rear)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
bool_t fq_is_full(futex_queue_t *q)
|
||||
{
|
||||
return (q->rear + 1) % FUTEX_QUEUE_LEN == q->front;
|
||||
}
|
||||
int fq_enqueue(futex_queue_t *q, umword_t e)
|
||||
{
|
||||
if (((q->rear + 1) % FUTEX_QUEUE_LEN) == q->front)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
q->m[q->rear] = e;
|
||||
q->rear = (q->rear + 1) % FUTEX_QUEUE_LEN;
|
||||
return 0;
|
||||
}
|
||||
int fq_dequeue(futex_queue_t *q, umword_t *e)
|
||||
{
|
||||
if (q->front == q->rear)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
*e = q->m[q->front];
|
||||
q->front = (q->front + 1) % FUTEX_QUEUE_LEN;
|
||||
return 0;
|
||||
}
|
||||
int fq_queue_len(futex_queue_t *q)
|
||||
{
|
||||
return (q->rear - q->front + FUTEX_QUEUE_LEN) % FUTEX_QUEUE_LEN;
|
||||
}
|
||||
int fq_queue_iter(futex_queue_t *q, futex_iter_func iter_func, void *data)
|
||||
{
|
||||
assert(iter_func);
|
||||
int i;
|
||||
int j = q->front;
|
||||
int e = (q->rear - q->front + FUTEX_QUEUE_LEN) % FUTEX_QUEUE_LEN;
|
||||
for (i = 0; i < e; i++)
|
||||
{
|
||||
int ret = iter_func(q->m[j], data);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
j = (j + 1) % FUTEX_QUEUE_LEN;
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* @file globals.c
|
||||
* @author ATShining (1358745329@qq.com)
|
||||
* @brief
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2023-09-29
|
||||
*
|
||||
*
|
||||
* @copyright Copyright (c) 2023
|
||||
*
|
||||
*
|
||||
*/
|
||||
#include "globals.h"
|
||||
#include "types.h"
|
||||
@@ -18,33 +18,47 @@
|
||||
#include "mm_man.h"
|
||||
#include "ipc.h"
|
||||
static mem_t global_mem; //!< 全局内存管理块
|
||||
static uint8_t mem_block[1019 * 1024]; //!< 内核内存分配堆 TODO:自动识别大小,或者从bootstrap中读取
|
||||
static uint8_t mem_block[1019 * 1024]; //!< 内核内存分配堆 TODO:自动识别大小,或者从bootstrap中读取
|
||||
static kobject_t *kobj_ls[FACTORY_FUNC_MAX]; //!< 全局静态内核对象
|
||||
|
||||
/**
|
||||
* @brief 注册一个全局静态的内核对象
|
||||
*
|
||||
* @param kobj 注册的内核对象
|
||||
* @param inx 注册的内核对象号
|
||||
*/
|
||||
void global_reg_kobj(kobject_t *kobj, int inx)
|
||||
{
|
||||
assert(inx >= 0);
|
||||
assert(inx < FACTORY_FUNC_MAX);
|
||||
kobj_ls[inx - 1] = kobj;
|
||||
}
|
||||
/**
|
||||
* @brief 获取注册的内核对象
|
||||
*
|
||||
* @param inx 获取哪一个
|
||||
* @return kobject_t* ==NULL 失败 !=NULL成功
|
||||
*/
|
||||
kobject_t *global_get_kobj(int inx)
|
||||
{
|
||||
assert(inx >= 0);
|
||||
assert(inx < FACTORY_FUNC_MAX);
|
||||
return kobj_ls[inx - 1];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取内存分配对象
|
||||
*
|
||||
* @return mem_t*
|
||||
*/
|
||||
mem_t *mm_get_global(void)
|
||||
{
|
||||
return &global_mem;
|
||||
}
|
||||
extern void log_dump(void);
|
||||
extern void sys_dump(void);
|
||||
/**
|
||||
* @brief 系统内存初始化
|
||||
*
|
||||
*/
|
||||
static void mem_sys_init(void)
|
||||
{
|
||||
log_dump();
|
||||
mm_man_dump();
|
||||
sys_dump();
|
||||
mem_init(&global_mem);
|
||||
mem_heap_add(mm_get_global(), mem_block, sizeof(mem_block));
|
||||
}
|
||||
|
||||
@@ -1,19 +1,23 @@
|
||||
/**
|
||||
* @file init.c
|
||||
* @author ATShining (1358745329@qq.com)
|
||||
* @brief
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2023-09-29
|
||||
*
|
||||
*
|
||||
* @copyright Copyright (c) 2023
|
||||
*
|
||||
*
|
||||
*/
|
||||
#include "types.h"
|
||||
#include "init.h"
|
||||
|
||||
extern char *__init_array_start[];
|
||||
extern char *__init_array_end[];
|
||||
extern char *__init_array_start[]; //!< 自动调用函数的开始
|
||||
extern char *__init_array_end[]; //!< 自动调用函数的结尾
|
||||
|
||||
/**
|
||||
* @brief 自动调用初始化函数
|
||||
*
|
||||
*/
|
||||
void sys_call_init(void)
|
||||
{
|
||||
uintptr_t a = (uintptr_t)&__init_array_start;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
export TOOLCHAIN=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/
|
||||
export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/armv7-m
|
||||
# export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
|
||||
# export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
|
||||
# export TOOLCHAIN=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/
|
||||
# export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/armv7-m
|
||||
export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
|
||||
export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
|
||||
export KEN_OFFSET=0x2000
|
||||
export INIT_OFFSET=0x10000
|
||||
export BOOTFS_ADDR_OFFSET=0x20000
|
||||
|
||||
Reference in New Issue
Block a user