113 lines
4.0 KiB
C
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);
|
|
}
|