BigOS/kernel/syscallc.c
2023-01-15 16:10:09 +08:00

113 lines
4.0 KiB
C

/*********************************************************
*系统调用具体函数的实现
*
*
*
**********************************************************/
#include "type.h"
#include "const.h"
#include "protect.h"
#include "string.h"
#include "proc.h"
#include "global.h"
#include "proto.h"
#include "memman.h"
struct memfree *memarg = 0;
/*======================================================================*
sys_get_ticks add by visual 2016.4.6
*======================================================================*/
int sys_get_ticks()
{
return ticks;
}
/*======================================================================*
sys_get_pid add by visual 2016.4.6
*======================================================================*/
int sys_get_pid()
{
return p_proc_current->task.pid;
}
/*======================================================================*
sys_kmalloc add by visual 2016.4.6
*======================================================================*/
void *sys_kmalloc(int size)
{ // edit by visual 2015.5.9
return (void *)(do_kmalloc(size));
}
/*======================================================================*
sys_kmalloc_4k add by visual 2016.4.7
*======================================================================*/
void *sys_kmalloc_4k()
{
return (void *)(do_kmalloc_4k());
}
/*======================================================================*
sys_malloc edit by visual 2016.5.4
*======================================================================*/
void *sys_malloc(void* uesp)
{
// int vir_addr, AddrLin;
void* vir_addr = K_PHY2LIN(sys_kmalloc(get_arg(uesp, 1)));
// for (AddrLin = vir_addr; AddrLin < vir_addr + size; AddrLin += num_4B) // 一个字节一个字节处理
// {
// lin_mapping_phy(AddrLin, // 线性地址 //add by visual 2016.5.9
// MAX_UNSIGNED_INT, // 物理地址 //edit by visual 2016.5.19
// p_proc_current->task.pid, // 进程pid //edit by visual 2016.5.19
// PG_P | PG_USU | PG_RWW, // 页目录的属性位
// PG_P | PG_USU | PG_RWW); // 页表的属性位
// }
return (void *)vir_addr;
}
/*======================================================================*
sys_malloc_4k edit by visual 2016.5.4
*======================================================================*/
void *sys_malloc_4k()
{
int vir_addr, AddrLin;
vir_addr = vmalloc(num_4K);
for (AddrLin = vir_addr; AddrLin < vir_addr + num_4K; AddrLin += num_4K) // 一页一页处理(事实上只有一页,而且一定没有填写页表,页目录是否填写不确定)
{
lin_mapping_phy(AddrLin, // 线性地址 //add by visual 2016.5.9
MAX_UNSIGNED_INT, // 物理地址
p_proc_current->task.pid, // 进程pid //edit by visual 2016.5.19
PG_P | PG_USU | PG_RWW, // 页目录的属性位
PG_P | PG_USU | PG_RWW); // 页表的属性位
}
return (void *)vir_addr;
}
/*======================================================================*
sys_free add by visual 2016.4.7
*======================================================================*/
int sys_free(void *arg)
{
memarg = (struct memfree *)arg;
return do_free(memarg->addr, memarg->size);
}
/*======================================================================*
sys_free_4k edit by visual 2016.5.9
*======================================================================*/
int sys_free_4k(void *AddrLin)
{ // 线性地址可以不释放,但是页表映射关系必须清除!
int phy_addr; // add by visual 2016.5.9
phy_addr = get_page_phy_addr(p_proc_current->task.pid, (int)AddrLin); // 获取物理页的物理地址 //edit by visual 2016.5.19
lin_mapping_phy((int)AddrLin, // 线性地址
phy_addr, // 物理地址
p_proc_current->task.pid, // 进程pid //edit by visual 2016.5.19
PG_P | PG_USU | PG_RWW, // 页目录的属性位
0 | PG_USU | PG_RWW); // 页表的属性位
return do_free_4k(phy_addr);
}