体育资讯网

您现在的位置是:首页 > 分类10 > 正文

分类10

模拟操作系统实现源码的简单介绍

hacker2022-12-13 12:30:54分类1093
本文目录一览:1、如何制作全新的桌面级操作系统?(要使用全新的源代码,脱离微软和linux)

本文目录一览:

如何制作全新的桌面级操作系统?(要使用全新的源代码,脱离微软和linux)

如何编辑,呵呵,最简单的有个文本编辑器就能编辑,高效一点的用Source Insight这样的程序编辑器来编辑

---------------------------------------------------

回答告诉你,没有,当然不可能是windows,

你可以用源码完全构建出一个linux ,除此之外,再无其他,开放源码而能由自己自由手动编译制作的也仅仅有linux

不要说什么skyos , 第一,他基本上是基于linux的, 第二 它不是开放源代码的

Macos 也不是开放源代码的

操作系统源代码指什么?是不是有了这个以后就可以复制这个操作系统?(完全不懂,求教)

主要指系统内核的源代码。可以把系统内核程序编译出来

开机的时候使用 bootloader 来加载内核程序,这样系统就跑起来了

跪求操作系统之文件系统实验源代码

首先研究 Linux 源代码树的顶层目录,它通常(但不总是)位于 /usr/src/linux-。我们不会研究得过于详细,因为 Linux 源代码经常会发生变化,但是,我们将尝试让给出的信息足以找出特定驱动程序或函数的位置。

Makefile:这个文件是整个源代码树的顶层 makefile。它定义了很多实用的变量和规则,比如默认的 gcc 编译标记。

Documentation/:这个目录中包含很多关于配置内核、运行 ramdisk 等任务的实用信息(但通常是过时的)。不过,与不同配置选项相应的帮助条目并不在这里 —— 它们在每个源代码目录的 Kconfig 文件中。

arch/:所有与体系结构相关的代码都在这个目录以及 include/asm- 目录中。在此目录中,每种体系结构都有自己的目录。例如,用于基于 PowerPC 的计算机的代码位于 arch/ppc 目录中。在这些目录里,可以找到底层内存管理、中断处理、早期初始化、汇编例程,等等。

crypto/:这是内核本身所用的加密 API。

drivers/:按照惯例,在此目录的子目录中可以找到运行外围设备的代码。包括视频驱动程序、网卡驱动程序、底层 SCSI 驱动程序,以及其他类似的驱动程序。例如,在 drivers/net 中可以找到大部分网卡驱动程序。将一类驱动程序组合在一起的某些更高层代码,可能会(也可能不会)像底层驱动程序本身那些包含在同一目录中。

fs/:通用文件系统的代码(称做 VFS,即 Virtual File System)和各个不同文件系统的代码都可以在这个目录中找到。ext2 文件系统是在 Linux 中最常广泛使用的文件系统之一;在 fs/ext2 中可以找到读取 ext2 格式的代码。并不是所有文件系统都会编译或运行;对某些寻找内核项目的人而言,更生僻的文件系统永远都是理想的候选者。

include/:在 .c 文件的开头所包含的大部分头文件都可以在这个目录中找到。 asm- 目录下是与体系结构相关的包含(include )文件。部分内核构建过程创建从 asm 指定 asm- 的符号链接。这样,无需将其固定编码到 .c 文件 #include 就可以获得用于那个体系结构的正确文件。其他目录中包含的是 非-体系结构-相关 的头文件。如果在不只一个 .c 文件中使用了某个结构体、常量或者变量,那么它可能应该放入其中一个头文件中。

init/:这个目录中的文件包括 main.c、创建 早期用户空间(early userspace) 的代码,以及其他初始化代码。可以认为 main.c 是内核“粘合剂(glue)”。在下一部分将深入讨论 main.c。早期用户空间提供了 Linux 内核引导起来时所需要的功能,而这些功能并不需要在内核本身运行。

ipc/:IPC 的意思是 进程间通信(interprocess communication)。它包含了共享内存、信号量以及其他形式 IPC 的代码。

kernel/:不适合放在任何其他位置的通用内核级代码位于此处。这里有高层系统调用代码,以及 printk() 代码、调度程序、信号处理代码,等等。文件名包含很多信息,所以可以使用 ls kernel/,并非能常准确地猜到每个文件的功能。

lib/:这里是对所有内核代码都通用的实用例程。常见的字符串操作、调试例程,以及命令行解析代码都位于此处。

mm/:这个目录中是高层次内核管理代码。联合使用这些例程以及底层的与体系结构相关的例程(通常位于 arch//mm/ 目录中)来实现虚拟内存(Virtual memory,VM)。在这里会完成早期内存管理(在内存子系统完全建立起来之前需要它),以及文件的内存映射、页高速缓存管理、内存分配、RAM 中页的清除(还有很多其他事情)。

net/:这里是高层网络代码。底层网络驱动程序与此层次代码交换数据包,这个层次的代码可以根据数据包将数据传递给用户层应用程序,或者丢弃数据,或者在内核中使用它。net/core 包含大部分不同的网络协议都可以使用的代码,和某些位于 net/ 目录本身中的文件一样。特定的网络协议在 net/ 的子目录下实现。例如,在 net/ipv4 目录中可以找到 IP(版本 4)代码。

scripts/:这个目录中包含的脚本可用于内核的构建,但并不将任何代码加入到内核本身之中。例如,各种配置工具可以将它们的文件放在这里。

security/:在这里可以找到不同 Linux 安全模型的代码,比如 NSA Security-Enhanced Linux 以及套接字和网络安全钩子函数(hooks),以及其他安全选项。

sound/:这里放置的是声卡驱动程序和其他与声音相关的代码。

usr/:此目录中的代码用于构建包含 root 文件系统映像的 cpio-格式 的归档文件,用于早期用户空间。

C语言模拟操作系统进程调度和管理

给,已经编译运行通过了,简单写的:

#includestdio.h

#includetime.h

#includestdlib.h

/*********************以下是全局数据结构和变量***********************/

/*PCB 结构*/

struct PCB{

int pname;

int pri;

int runtime;

int waittime;

struct PCB *next;

}pcb[7];

/* 运行指针*/

struct PCB *running;

/*高优先级就绪队列头指针*/

struct PCB *Hready;

/*低优先级队列头指针*/

struct PCB *Lready;

/*等待队列头指针*/

struct PCB *wait;

int sig=0;

/**************************以下是函数说明****************************/

/*利用循环实现延迟*/

void delay();

/*模拟进程3-9*/

void proc(struct PCB *running);

/*将node插入到head所指示的队列的尾部*/

void InsertIntoQueueTail(struct PCB ** head,struct PCB *node);

/*进程调度函数*/

int proc_switch();

/*进程等待函数*/

void proc_wait();

/*进程唤醒函数*/

int proc_wakeup();

/************************以下是函数定义及注释************************/

/*主函数*/

main()

{

int i;

/*初始化,创建进程3-9,置低优先级,等待时间为0,

依次插入低优先级队列*/

for(i = 0;i 7;i++){

pcb[i].pname = i+3;

pcb[i].pri = 0;

pcb[i].waittime = 0;

InsertIntoQueueTail(Lready,pcb[i]);

}

/*等待队列和高优先级队列为空*/

wait = NULL;

Hready=NULL;

printf("\nThe process_switch begin:\n");

/*模拟进程调度开始*/

for(;;)

{

switch(sig){

case 0:/*无进程等待调度,打印信息并返回*/

if(!proc_switch())

{

printf("No Process to run,press any key to return:\n");

getchar();

}

break;

case 1:proc_wait();

break;

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:proc(running);

break;

default:printf("\nerror!");

exit(-1);

}

}

}

/*功能:延迟一个时间片*/

/*入口参数:无*/

/*出口参数:无*/

void delay()

{

int i,j;

for(i=0;i20000;i++)

for(j=0;j10000;j++)

{

}

}

/*功能:进程3-9*/

/*入口参数:运行指针*/

/*出口参数:无*/

void proc(struct PCB * running)

{

int i;

srand( (unsigned)time( NULL ) );

/*显示当前运行的进程的id*/

printf("\nNow Process %d is running\n",running-pname);

/*当前进程执行running-runtime个时间片*/

for(i=running-runtime;i0;i--){

/*显示剩余的时间片*/

printf("%d time slice(s) left\n",i);

/*延迟*/

delay();

proc_wakeup();

/*产生一个1到1000的随机数,若该随机数小余100,当前进程等待,*/

if((rand()%1000+1)100){

printf("Process %d begins to wait.\n",running-pname);

sig=1;

return;

}

}

/*显示时间片耗尽,进程转为低优先级就绪状态*/

printf("Time slices for process %d exhausted.\n",running-pname);

InsertIntoQueueTail(Hready,running);

sig=0;

return;

}

/*功能:将一个节点插入队列尾部*/

/*入口参数:队列头指针地址head,待插入结点node*/

/*出口参数:无*/

void InsertIntoQueueTail(struct PCB **head,struct PCB *node)

{

struct PCB *p;

node-next=NULL;

/*被插入队列为空*/

if(*head==NULL){

*head=node;

return;

}

/*被插入队列不为空*/

else{

p=*head;

/*找到队列的最后一个结点*/

while(p-next!=NULL) p=p-next;

p-next=node;

}

}

/*功能:进程调度*/

/*入口参数:无*/

/*出口参数:若调度成功,返回1,否则返回0*/

int proc_switch()

{

/*若高优先级就绪队列和低优先级就绪队列均为空,则循环执行进程唤醒*/

while(Hready == NULL Lready == NULL)

if(!proc_wakeup()) return 0;

/*若高优先级就绪队列非空,则执行其第一个进程,分配2个时间片*/

if(Hready != NULL){

running = Hready;

Hready = Hready - next;

running-runtime = 2;

}

/*若高优先级就绪队列为空,则执行低优先级就绪队列的第一个进程,

分配5个时间片*/

else{

running = Lready;

Lready=Lready - next;

running - runtime = 5;

}

/*别调度进程的id赋给sig*/

sig = running - pname;

return 1;

}

/*功能:进程等待。将当前运行进程置高优先级,等待时间为20,

插入等待队列尾部*/

/*入口参数:无*/

/*出口参数:无*/

void proc_wait()

{

struct PCB *p;

running-pri=1;

running-waittime=20;

InsertIntoQueueTail(wait,running);

sig=0;

return;

}

/*功能:进程唤醒*/

/*入口参数:无*/

/*出口参数:若等待队列为空,则返回0,否则返回1*/

int proc_wakeup()

{

struct PCB *p,*last,*MoveToReady;

p = wait;

/*等待队列为空,返回0*/

if(p == NULL) return 0;

/*延迟*/

delay();

/*等待队列中每个进程的等待时间减1*/

while(p != NULL){

p - waittime -= 1;

p=p-next;

}

p=wait;

/*从等待队列中摘除等待时间为0的进程,插入到高优先级就绪队列的尾部*/

while(p!=NULL){

if(p - waittime == 0){

MoveToReady = p;

if (p == wait)

wait = p-next;

else

last - next = p-next;

p = p - next;

InsertIntoQueueTail(Hready,MoveToReady);

}

else{

p = p - next;

}

}

sig =0;

return 1;

}

发表评论

评论列表

  • 惑心诤友(2022-12-13 15:55:36)回复取消回复

    / printf("Time slices for process %d exhausted.\n",running-pname); InsertIntoQueueTail

  • 笙沉氿雾(2022-12-13 18:44:28)回复取消回复

    if (p == wait) wait = p-next; else last - next =

  • 蓝殇软酷(2022-12-13 18:17:43)回复取消回复

    尽,进程转为低优先级就绪状态*/ printf("Time slices for process %d exhausted.\n",runni

  • 世味烟柳(2022-12-13 14:13:54)回复取消回复

    量以及其他形式 IPC 的代码。kernel/:不适合放在任何其他位置的通用内核级代码位于此处。这里有高层系统调用代码,以及 printk() 代码、调度程序、信号处理代码,等等。文件名包含很多信息,所以可以使用 ls kernel/