文档库 最新最全的文档下载
当前位置:文档库 › Linux 系统课程设计报告

Linux 系统课程设计报告

Linux 系统课程设计报告
Linux 系统课程设计报告

Linux 系统课程设计报告

专业班级:

学号:

姓名:

同组成员:

2016年6月2日星期四

序论实验要求

实验目的

了解Linux内核源代码的目录结构及各目录的相关内容。

了解Linux内核各配置选项内容和作用。

掌握Linux内核配置文件的作用。

掌握Linux内核的编译过程。

掌握将新增内核代码加入到Linux内核结构中的方法。

实验指引

尽管目前Linux 2.6版本内核已经增加了很多对ARM体系甚至是S3C2440 CPU 的支持,但仍然需要对内核作一些小的修改来适应我们的开发板,并且需要重新配置、编译和重新生成新的内核映像。本实验从软硬件准备到下载到开发板等一系列连贯的操作来进行嵌入式Linux内核的移植。本实验的内核版本为2.6.29.1。

第一章Linux内核基础知识

1.1Linux版本

Linux主要的版本定义为“[主].[次].[发布].[修改]”的样式,次版本为奇数表示此版本为开发中版本,次版本为偶数表示此版本为稳定版本。

Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:

VERSION = 2

PATCHLEVEL = 6

SUBLEVEL = 29

EXTRA VERSION = .1

其中的“VERSION”和“PATCHLEVEL”组成主版本号,比如 2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。

1.2什么是标准内核

按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在https://www.wendangku.net/doc/1717931167.html,/维护和获取的内核,实际上它也有平台属性的。这些linux

内核并不总是适用于所有linux支持的体系结构。实际上,这些内核版本很多时候并不是为一些流行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux系统上,这个站点上的内核首先确保的是在Intel X86体系结构上可以正常运行,它是基于X86处理器的内核,如对 linux-2.4.18.tar.bz2的配置make menuconfig时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III /Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 选项,而没有类似Samsun 2410等其他芯片的选择。如果需要用在其他特定的处理器平台上就需要对内核进行打补丁,形成不同的嵌入式内核。实际上,不同处理器系统的内核下载站点中提供的也往往是补丁patch而已,故原x86平台上的内核变成了基础内核,也被称为标准内核了。

1.3Linux操作系统的分类

1.3.1以功能和发行组织区分

第一种分类:以主要功能差异和发行组织区分(基础linux系统/内核)。

1、标准linux 。

2、μClinux,μClinux无MMU支持的linux系统,运行在无MMU的CPU上。

3、Linux-RT ,Linux-RT是最早在linux上实现硬实时支持的linux发行版本。

4、Linux/RTAI ,Linux/RTAI支持硬实时的linux,于RT-linux最大的不同之处在于RTAI定义了RTHAL,它将RTAI需要在linux中修改的部分定义成一组API 接口,RTAI只使用API接口与linux交互。

5、Embedix ,Embedix 是由Lineo公司开发,基于PowerPC和x86平台开发的。

6、Blue Cat Linux 。

7、Hard Hat Linux 。

8、其他。

1.3.2以应用的嵌入式平台区分

第二种分类:以应用的嵌入式平台区分。

由于嵌入式系统的发展与linux内核的发展是不同步的,所以为了要找一个能够运行于目标系统上的内核,需要对内核进行选择、配置和定制。因为每一种系统都是国际上不同的内核开发小组维护的,因此选择linux内核源码的站点也不尽相同。

第二种分类中的linux系统/内核相对于第一层分类的标准内核来说,也可以称为嵌入式linxu系统/内核。如应用在ARM平台上的嵌入式Linux系统通常有arm-linux(常运行在arm9平台上),μClinux(常用在arm7平台上),在标准linux基础上扩展对其他的平台的支持往往通过安装patch实现,如armlinux

就是对linux安装rmk补丁(如patch-2.4.18-rmk7.bz2)形成的,只有安装了这些补丁,内核才能顺利地移植到ARM Linux上。也有些是已经安装好补丁的内核源码包,如linux-2.4.18-rmk7.tar.bz2。

不同处理器系统的内核/内核补丁下载站点:

处理器系统适合的内核站点下载方式

x86 https://www.wendangku.net/doc/1717931167.html,/ ftp, http, rsync

ARM https://www.wendangku.net/doc/1717931167.html,/developer/ ftp, rsync

PowerPC https://www.wendangku.net/doc/1717931167.html,/ ftp,http,rsync,BitKeeper MIPS https://www.wendangku.net/doc/1717931167.html,/ ftp, cvs

SuperH https://www.wendangku.net/doc/1717931167.html,/ cvs, BitKeeper

M68K https://www.wendangku.net/doc/1717931167.html,/ ftp, http

non-MMU CPUs https://www.wendangku.net/doc/1717931167.html,/ ftp, http

这些站点不仅仅是linux内核站点,它们可能直接提供了针对你的目标硬件系统的linux内核版本。

1.4Linux内核的选择

选择内核版本是很困难的,应该与负责维护该内核的小组保持联系,方法是通过订阅一些合适的邮件列表(maillist)并查看邮件中相关的重要新闻,以及浏览一些主要站点,可以得到该内核的最新发展动态。如针对ARM的Linux内核,可以访问https://www.wendangku.net/doc/1717931167.html,/ 并订阅该网站上提供的maillist就可以了。如果觉得查阅邮箱中的邮件列表耗费太多时间,那么至少每周访问所关心的内核网站,并阅读Kernel Traffic提供的过去一周中在内核邮件清单中发生的重要的摘要,网址为https://www.wendangku.net/doc/1717931167.html,/kernel-traffic 这样就可以得到相关Linux内核的最新信息。

在本课程设计中我们选择的内核版本是2.6.29.1.此版本的内核源码可以在https://www.wendangku.net/doc/1717931167.html,/主页中找到对应的下载链接后下载下来。

第二章Linux内核启动过程概述

一个嵌入式Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序。其中Bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。根文件系统是Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。

2.1Bootloader启动过程

Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核。

2.1.1Bootloader概念和作用

Bootloader 是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于PC 机上的BIOS。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是Flash或DOC等)中的Linux 内核拷贝到RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动Linux 内核。由此可见,Bootloader 和Linux 内核有着密不可分的联系,要想清楚的了解Linux内核的启动过程,我们必须先得认识Bootloader的执行过程,这样才能对嵌入式系统的整个启动过程有清晰的掌握。

2.1.2Bootloader的执行过程

不同的处理器上电或复位后执行的第一条指令地址并不相同,对于 ARM 处理器来说,该地址为 0x00000000。对于一般的嵌入式系统,通常把 Flash 等非易失性存储器映射到这个地址处,而 Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader。而因为存储Bootloader的存储器不同,Bootloader的执行过程也并不相同,下面将具体分析。

嵌入式系统中广泛采用的非易失性存储器通常是 Flash,而 Flash 又分为Nor Flash 和Nand Flash 两种。它们之间的不同在于:Nor Flash 支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而Nand Flash并不支持XIP,所以要想执行 Nand Flash 上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行。

2.1.3Bootloader的功能

实际应用中的 Bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化系统和调用 Linux 内核等基本任务外,还可以执行很多用户输入的命令,比如设置 Linux 启动参数,给 Flash 分区等;也可以设计得很简单,只完成最基本的功能。但为了能达到启动Linux 内核的目的,所有的Bootloader都必须具备以下功能:

(1)、初始化 RAM。

因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备。初始化 RAM 的任务包括设置CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等。

(2)、初始化串口。

串口在 Linux 的启动过程中有着非常重要的作用,它是 Linux内核和用户

交互的方式之一。Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解 Linux 的启动过程。虽然它并不是 Bootloader 必须要完成的工作,但是通过串口输出信息是调试Bootloader 和Linux 内核的强有力的工具,所以一般的 Bootloader 都会在执行过程中初始化一个串口做为调试端口。

(3)、检测处理器类型。

Bootloader在调用 Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给 Linux 内核。Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序。

(4)、设置 Linux启动参数。

Bootloader 在执行过程中必须设置和初始化 Linux 的内核启动参数。目前传递启动参数主要采用两种方式:即通过 struct param_struct 和struct tag (标记列表,tagged list)两种结构传递。struct param_struct 是一种比较老的参数传递方式,在 2.4 版本以前的内核中使用较多。从 2.4 版本以后Linux 内核基本上采用标记列表的方式。但为了保持和以前版本的兼容性,它仍支持 struct param_struct 参数传递方式,只不过在内核启动过程中它将被转换成标记列表方式。标记列表方式是种比较新的参数传递方式,它必须以ATAG_CORE 开始,并以ATAG_NONE 结尾。中间可以根据需要加入其他列表。Linux 内核在启动过程中会根据该启动参数进行相应的初始化工作。

(5)、调用 Linux内核映像。

Bootloader 完成的最后一项工作便是调用 Linux内核。如果 Linux 内核存放在 Flash 中,并且可直接在上面运行(这里的 Flash 指 Nor Flash),那么可直接跳转到内核中去执行。但由于在 Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将 Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行。

不论哪种情况,在跳到 Linux 内核执行之前 CPU的寄存器必须满足以下条件:r0=0,r1=处理器类型,r2=标记列表在 RAM中的地址。

2.2Linux启动过程

在Bootloader将 Linux 内核映像拷贝到 RAM 以后,可以通过下例代码启动 Linux 内核:

call_linux(0, machine_type, kernel_params_base)。

其中,machine_tpye 是Bootloader检测出来的处理器类型,kernel_params_base 是启动参数在 RAM 的地址。通过这种方式将 Linux 启动需要的参数从 bootloader传递到内核。

Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫 zImage。根据内核映像的不同,Linux 内核的启动在开始阶段也有所不同。zImage 是 Image经过压缩形成的,所以它的大小比 Image 小。但为了能使用 zImage,必须在它的开头加上解压缩的代码,将 zImage 解压缩之后才能执行,因此它的执行速度比 Image 要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用 zImage 可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。所以一般的嵌入式系统均采用压缩内核的方式。

对于ARM系列处理器来说,zImage的入口程序即为arch/arm/boot/compressed/head.S。它依次完成以下工作:开启 MMU 和 Cache,调

用 decompress_kernel()解压内核,最后通过调用 call_kernel()进入非压缩内核 Image 的启动。下面将具体分析在此之后Linux内核的启动过程。

2.2.1Linux内核入口

Linux 非压缩内核的入口位于文件/arch/arm/kernel/head-armv.S 中的stext 段。该段的基地址就是压缩内核解压后的跳转地址。如果系统中加载的内核是非压缩的 Image,那么bootloader将内核从 Flash中拷贝到 RAM 后将直接跳到该地址处,从而启动 Linux 内核。不同体系结构的 Linux 系统的入口文件是不同的,而且因为该文件与具体体系结构有关,所以一般均用汇编语言编写。对基于 ARM 处理的 Linux 系统来说,该文件就是head-armv.S。该程序通过查找处理器内核类型和处理器类型调用相应的初始化函数,再建立页表,最后跳转到 start_kernel()函数开始内核的初始化工作。检测处理器内核类型是在汇编子函数__lookup_processor_type中完成的。通过以下代码可实现对它的调用:

bl __lookup_processor_type。

__lookup_processor_type调用结束返回原程序时,会将返回结果保存到寄存器中。其中r8 保存了页表的标志位,r9 保存了处理器的 ID 号,r10 保存了与处理器相关的 stru proc_info_list 结构地址。

检测处理器类型是在汇编子函数 __lookup_architecture_type 中完成的。与__lookup_processor_type类似,它通过代码:“bl __lookup_processor_type”来实现对它的调用。该函数返回时,会将返回结构保存在 r5、r6 和 r7 三个寄存器中。其中 r5 保存了 RAM 的起始基地址,r6 保存了 I/O基地址,r7 保存了 I/O的页表偏移地址。当检测处理器内核和处理器类型结束后,将调用__create_page_tables 子函数来建立页表,它所要做的工作就是将 RAM 基地址开始的 4M 空间的物理地址映射到 0xC0000000 开始的虚拟地址处。对笔者的S3C2410 开发板而言,RAM 连接到物理地址0x30000000 处,当调用__create_page_tables 结束后 0x30000000 ~ 0x30400000 物理地址将映射到0xC0000000~0xC0400000 虚拟地址处。当所有的初始化结束之后,使用如下代码来跳到 C 程序的入口函数 start_kernel()处,开始之后的内核初始化工作:b SYMBOL_NAME(start_kernel)。

2.2.2Start_kernel函数

start_kernel 是所有 Linux 平台进入系统内核初始化后的入口函数,它主要完成剩余的与硬件平台相关的初始化工作,在进行一系列与内核相关的初始化后,调用第一个用户进程-init 进程并等待用户进程的执行,这样整个 Linux 内核便启动完毕。该函数所做的具体工作有:调用 setup_arch()函数进行与体系结构相关的第一个初始化工作;对不同的体系结构来说该函数有不同的定义。对于 ARM 平台而言,该函数定义在arch/arm/kernel/Setup.c。它首先通过检测出来的处理器类型进行处理器内核的初始化,然后通过 bootmem_init()函数根据系统定义的 meminfo 结构进行内存结构的初始化,最后调用paging_init()开启 MMU,创建内核页表,映射所有的物理内存和 I/O空间。创建异常向量表和初始化中断处理函数;初始化系统核心进程调度器和时钟中断处理机制;初始

化串口控制台(serial- console);ARM-Linux 在初始化过程中一般都会初始化一个串口做为内核的控制台,这样内核在启动过程中就可以通过串口输出信息以便开发者或用户了解系统的启动进程。创建和初始化系统 cache,为各种内存调用机制提供缓存,包括;动态内存分配,虚拟文件系统(VirtualFile System)及页缓存。初始化内存管理,检测内存大小及被内核占用的内存情况;初始化系统的进程间通信机制(IPC);当以上所有的初始化工作结束后,start_kernel()函数会调用 rest_init()函数来进行最后的初始化,包括创建系统的第一个进程-init 进程来结束内核的启动。init 进程首先进行一系列的硬件初始化,然后通过命令行传递过来的参数挂载根文件系统。最后 init 进程会执行用户传递过来的“init=”启动参数执行用户指定的命令,或者执行以下几个进程之一: execve("/sbin/init",argv_init,envp_init)

execve("/etc/init",argv_init,envp_init)

execve("/bin/init",argv_init,envp_init)

execve("/bin/sh",argv_init,envp_init)

当所有的初始化工作结束后,cpu_idle()函数会被调用来使系统处于闲置(idle)状态并等待用户程序的执行。至此,整个 Linux 内核启动完毕。

Linux 内核是一个非常庞大的工程,经过十多年的发展,它已从从最初的几百 KB 大小发展到现在的几百兆。清晰的了解它执行的每一个过程是件非常困难的事。但是在嵌入式开发过程中,我们并不需要十分清楚Linux 的内部工作机制,只要适当修改Linux 内核中那些与硬件相关的部分,就可以将Linux 移植到其它目标平台上。通过对Linux 的启动过程的分析,我们可以看出哪些是和硬件相关的,哪些是Linux 内核内部已实现的功能,这样在移植Linux 的过程中便有所针对。而Linux内核的分层设计将使Linux 的移植变得更加容易。

第三章Linux kernel的移植

3.1移植内核的准备工作

移植内核前,保证你已经装上了Linux系统,建立好了交叉编译环境,我用的是虚拟机,装的Redhat9.0系统,交叉编译工具用的是友善之臂的arm-linux-gcc-4.3.2。

开始移植Linux内核了,下面是我我使用的内核,所用到的工具及获取方法:

1、Linux系统

我是在虚拟机上安装的Redhat9.0。XP系统下虚拟机设置的共享目录是D:\share,对应的Linux系统的目录是/mnt/hgfs/share。我将下面准备的压缩包和文件都统一放到该目录下。

2、Linux内核

到https://www.wendangku.net/doc/1717931167.html,/主页,进入该网站中链接FTP ftp://https://www.wendangku.net/doc/1717931167.html,/pub/,在里面进入文件夹“linux->kernel->v2.6”,会出现很多版本的内核压缩包和补丁,选中Linux-2.6.29.1.tar.bz2下载。

3、交叉编译工具链

使用友善之臂提供的arm-linux-4.3.2工具链,没有的到https://www.wendangku.net/doc/1717931167.html,/下载。工具链也可以自己做,可以参考《构建嵌入式Linux系统》一书或其它资料。

4、硬件平台

友善之臂的mini2440 。

5、yaffs2代码

进入https://www.wendangku.net/doc/1717931167.html,/cgi-bin/viewcvs.cgi/,点击“Download GNU tarball”,下载后出现cvs-root.tar.gz压缩包。

3.2修改Linux源码中的参数

3.2.1解压内核源码

mkdir /opt/studyarm

cd /mnt/hgfs/share

tar –jxvf linux-2.6.29.1.tar.bz2 –C /opt/studyarm

3.2.2进入内核目录,修改makefile,并对内核的默认配置进行修改

193行,修改

ARCH ?=arm

CROSS_COMPILE ?=arm-linux-

3.2.3修改平台时钟

找到内核源码arch/arm/mach-s3c2440/mach-smdk2440.c文件,在函数static void __init smdk2440_map_io(void)中,修改成s3c24xx_init_clocks(12000000)。

3.2.4修改Nand flash分区信息

修改文件kernel.git/arch/arm/plat-s3c24xx/common-smdk.c。

第一,修改分区信息:

static struct mtd_partition smdk_default_nand_part[] =

{

[0] = {

.name = "bootloader",

.offset = 0x00000000,

.size = 0x00030000, },

[1] = {

.name = "kernel",

.offset = 0x00050000,

.size = 0x00200000, },

[2] = {

.name = "root",

.offset = 0x00250000,

.size = 0x03dac000, }

};

第二,再修改s3c2410_platform_nand_smdk_nand_info smdk_nand_info = {

.tacls = 0,

.twrph0 = 30,

.twrph1=0,

};

3.2.5修改LCD背光

修改文件/arch/arm/mach-s3c2440/mach-smdk2440.c,因为友善的3.5寸液晶的背光控制是由S3C2440的GPG4引脚来控制的,故下面的改动将开启背光。

static void __init smdk2440_machine_init(void)

{

s3c24xx_fb_set_platdata(&smdk2440_fb_info);

platform_add_devices();

s3c2410_gpio_cfgpin(S3C2410_GPG4,S3C2410_GPG4_OUTP);

s3c2410_gpio_setpin(S3C2410_GPG4,1); smdk_machine_init();

}

3.2.6LCD参数修改

这里用的是NEC3.5英寸屏液晶屏,大小为320x240,需要修改修改文件arch/arm/mach-s3c2440/mach-smdk2440.c。

static struct s3c2410fb_display smdk2440_lcd_cfg __initdata =

{

.right_margin = 37,

.hsync_len = 6,

.upper_margin =2,

.lower_margin = 6,

.vsync_len =2,

};

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata ={

.default_display =0

.gp

ccon = 0xaa955699,

.gpccon_mask = 0xffc003cc,

.gpcup = 0x0000ffff,

.gpcup_mask = 0xffffffff,

.gpdcon = 0xaa95aaa

1,

.gpdcon_mask = 0xffc0fff0,

.gpdup = 0x0000faff,

.gpdup_mask = 0xffffffff,

.lpcsel = 0xf82,

};

3.2.7给内核打yaffs2文件系统的补丁

cd /mnt/hgfs/share

tar –zxvf /mnt/hgfs/share/cvs-root.tar.gz –C /opt/studyarm

cd /opt/stdudyarm/cvs/yaffs2/

./patch-ker.sh c /opt/studyarm/linux-2.6.29.1/

注:上面命令完成下面三件事情:

(1)修改内核fs/Kconfig

增加一行:source "fs/yaffs2/Kconfig"

(2)修改内核fs/Kconfig

增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/

(3)在内核fs/目录下创建yaffs2目录

将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;

将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下;

将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.

3.2.8修改s3c2440的机器号

由于Bootloader传递给Linux内核的机器号为782,为与Bootloader传递参数一致,修改 arch/arm/tools/math-types文件。

s3c2440 ARCH_S3C2440 S3C2440 362

修改为:

s3c2440 ARCH_S3C2440 S3C2440 782

另外,还可以不修改内核中的S3C2440机器号,只需修改修改Bootloader传给内核的参数中的机器号就可以了。在VIVI中菜单中,按s,再按s,输入mach_type,回车,输入362,w,保存。

3.3配置Linux内核

进入Linux-2.6.29.1内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,,在这基础上进行修改。

make s3c2410_defconfig

配置内核模块的功能,有几种方式可以进行界面选择:

make menuconfig(文本选单的配置方式,在有字符终端下才能使用)

make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)

make oldconfig(文本配置方式,在原内核配置的基础修改时使用)

这里使用make menuconfig命令。

配置信息如下:

[*]Enable loadable module support--->

[*]Forced module loading

[*]Module unloading

System Type--->

S3C2410 Machines--->

[*]SMDK2410/A9M2410选上其余不选

S3C2440 Machines--->

[*]SMDK2440

[*]SMDK2440 with S3C2440 CPU module,其余不选

其余的Machines下选项全部不选(如2400,2412,2442,2443)

Kernel Features--->

[*]Use the ARM EABI to compile the kernel

noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0

Userspace binary formats--->

[*]Kernel support for ELF binaries

其它的可以全部不选。

选择支持yaffs2文件系统。

Filesystem--->

Miscellaneous filesystems--->

<*>YAFFS2 file system support

[*] Lets Yaffs do its own ECC

Native language support

<*> Codepage 437 (United States,Canada)

<*>Simplified Chinese charset(GB2312)

<*>Traditional Chinese charset(Big5)

<*>NLS ISO 8859-1(Latin1:Western European Languages)

<*>NLS UTF-8

Device Drivers--->

Graphics support--->

<*>Support for frame buffer devices--->

[*]Enable firmware EDID

[*]Enable Video Mode Handling Helpers

<*>S3C2410 LCD framebuffer support

Console display driver support--->

<*>Framebuffer Console support

[*]Select compiled-in fonts

[*] VGA8x8 font

[*]VGA8x16 font

[*]Bootup logo--->

[*]Standard black and white Linux logo

[*]Standard 16-color Linux logo

[*]Standard 224-color Linux logo

注:在Bootup logo--->选择的那几项,将会在系统启动时在液晶上显示开机logo。

3.4编译内核

1、make dep

make dep的意思就是说:如果你使用程序A(比如支持特殊设备),而A需用到B(比如B是A的一个模块/子程序)。而你在做make config的时候将一个设备的驱动由内核支持改为module,或取消支持,这将可能影响到B的一个参数的设置,需重新编译B,重新编译或连接A....如果程序数量非常多,你是很难手工完全做好此工作的。make dep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要编译。所以,你要make dep。

2、make clean

清除一些以前留下的文件,比如以前编译生成的目标文件,这一步必须要进行。否则,即使内核配置改动过,编译内核时还是将原来生成的目标文件进行连接,而不生成改动后的文件。

3、make zImage

Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩形成的,所以它的大小比 Image小。但为了能使用zImage,必须在它的开头加上解压缩的代码,将 zImage解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的,所以一般的嵌入式系统均采用压缩内核的方式。

编译完成后,会在内核目录arch/arm/boot/下生成zImage内核映像文件。

第四章总结

Linux模块是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。Linux提供了内核模块这种功能强大的扩展方式,它不仅弥补了单内核的一些不足,而且对性能没有影响。通过内核模块机制,可以方便的进行内核开发和驱动开发,而事实上Linux中大多数驱动和文件系统都是已内核模块方式实现的。在内核模块机制下,可以随时在需要的情况下加载新的内核模块,而不需要重新编译内核和引导系统。

当内核被加载到系统中时,他就成为内核源代码的一部分,与其他内核代码地位完全相同。模块自身并不是独立的进程,它可以认为就是核心态运行。同样,既然内核模块和内核其他部分地位一样,这就导致在开发式必须谨慎,因为可能一个小错误就会导致整个系统崩溃。深刻理解Linux内核模块编程,利用好Linux 内核模块的优势,无论是进行Linux学习还是内核模块开发都是十分有益的。

操作系统课程设计

课程设计报告 2015~2016学年第一学期 操作系统综合实践课程设计 实习类别课程设计 学生姓名李旋 专业软件工程 学号130521105 指导教师崔广才、祝勇 学院计算机科学技术学院 二〇一六年一月

- 1 -

- 2 -

一、概述 一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX 的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下: 本次课程设计是要实现一个简单的模拟Linux文件系统。我们在内存中开辟一个虚拟磁盘空间(20MB)作为文件存储器,并将该虚拟文件系统保存到磁盘上(以一个文件的形式),以便下次可以再将它恢复到内存的虚拟磁盘空间中。文件存储空间的管理可采用位示图方法。 二、设计的基本概念和原理 2.1 设计任务 多用户、多级目录结构文件系统的设计与实现。可以实现下列几条命令login 用户登录 logout 退出当前用户 dir 列文件目录 creat 创建文件 delete 删除文件 open 打开文件 close 关闭文件 - 3 -

read 读文件 write 写文件 mkdir 创建目录 ch 改变文件目录 rd 删除目录树 format 格式化文件系统 Exit 退出文件系统 2.2设计要求 1) 多用户:usr1,usr2,usr3,……,usr8 (1-8个用户) 2) 多级目录:可有多级子目录; 3) 具有login (用户登录)4) 系统初始化(建文件卷、提供登录模块) 5) 文件的创建:create (用命令行来实现)6) 文件的打开:open 7) 文件的读:read8) 文件的写:write 9) 文件关闭:close10) 删除文件:delete 11) 创建目录(建立子目录):mkdir12) 改变当前目录:cd 13) 列出文件目录:dir14) 退出:logout 新增加的功能: 15) 删除目录树:rd 16) 格式化文件系统:format 2.3算法的总体思想 - 4 -

Linux 系统课程设计报告

Linux 系统课程设计报告 专业班级: 学号: 姓名: 同组成员: 2016年6月2日星期四

序论实验要求 实验目的 了解Linux内核源代码的目录结构及各目录的相关内容。 了解Linux内核各配置选项内容和作用。 掌握Linux内核配置文件的作用。 掌握Linux内核的编译过程。 掌握将新增内核代码加入到Linux内核结构中的方法。 实验指引 尽管目前Linux 2.6版本内核已经增加了很多对ARM体系甚至是S3C2440 CPU 的支持,但仍然需要对内核作一些小的修改来适应我们的开发板,并且需要重新配置、编译和重新生成新的内核映像。本实验从软硬件准备到下载到开发板等一系列连贯的操作来进行嵌入式Linux内核的移植。本实验的内核版本为2.6.29.1。 第一章Linux内核基础知识 1.1Linux版本 Linux主要的版本定义为“[主].[次].[发布].[修改]”的样式,次版本为奇数表示此版本为开发中版本,次版本为偶数表示此版本为稳定版本。 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中: VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 29 EXTRA VERSION = .1 其中的“VERSION”和“PATCHLEVEL”组成主版本号,比如 2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。 1.2什么是标准内核 按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在https://www.wendangku.net/doc/1717931167.html,/维护和获取的内核,实际上它也有平台属性的。这些linux

操作系统课程设计报告书

题目1 连续动态内存管理模拟实现 1.1 题目的主要研究内容及预期达到的目标 (1)针对操作系统中内存管理相关理论进行设计,编写程序并进行测试,该程序管理一块虚拟内存。重点分析三种连续动态内存分配算法,即首次适应算法、循环首次适应算法和最佳适应算法。 (2)实现内存分配和回收功能。 1.2 题目研究的工作基础或实验条件 (1)硬件环境:PC机 (2)软件环境:Windows XP,Visual C++ 6.0 1.3 设计思想 首次适应算法的实现:从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高址空间保留大的空闲区。 循环首次适应算法的实现:在分配内存空间时,不再每次从表头开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。 最佳适应算法的实现:从全部空闲区中找到能满足作业要求的、且最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表中的空闲分区要按从小到大进行排序,从表头开始查找第一个满足要求的自由分配。 1.4 流程图 内存分配流程图,如图1-1所示。

图1-1 内存分配流程图内存回收流程图,如1-2所示。

图1-2 内存回收流程图 1.5 主要程序代码 (1)分配内存 void allocate(char z,float l) { int i,k; float ad; k=-1; for(i=0;i= l && free_table[i].flag == 1) if(k==-1 || free_table[i].length

系统工程课程设计报告

系统工程 课程设计报告 LOGO 题目:关于大学生“课堂低头族”现象的问题分析专业班级:工业141班组别:五组 组长:xx(140xxxxx) 小组成员:薛xx(140xxxxx)桂xx(140xxxxx) xx(140xxxxx)x(140xxxxx)

任xx(140xxxxx)xx(140xxxxx) 目录 关于大学生“课堂低头族”现象的问题分析 (3) 一、利用ISM法进行系统分析 (4) 1.1确定影响因素 (4) 1.2有向图 (5) 1.3可达矩阵 (5) 1.4系统要素集合 (6) 1.5级位划分 (7) 1.6多级递阶有向图 (7) 二、利用AHP法确定评价指标权重体系 (8) 2.1建立递阶层次结构 (8) 2.2重要度分析 (9) 2.2.1判断矩阵标度 (9) 2.2.2建立判断矩阵 (9) 2.3总重要度分析 (11) 三、利用模糊综合判断法对案进行评价 (11) 3.1满意度评价 (11) 3.1.1评价指标 (11) 3.1.2评价过程 (11) 四、结论 (14) 五、参考文献 (14) 六、任务分配 (15) 七、个人心得 (15) XX (15) XX (16) 任XX (16) 桂XX (17) X (17) XX (18) 薛XX (19) 八、会议讨论照片 (19)

关于大学生“课堂低头族”现象的问题分析【摘要】21世纪是信息网络迅速发展的时代,大学生上网是一个普遍现象,网络传递给他们更多的信息与知识,但也造成了不可忽视的负面影响。有部分大学生过度沉迷网络,以至于课上课下沉迷于手游、网游,出现了一种“课堂低头族”的现象。目前,大学生逐渐对网络有了一种消极的心理依赖性,对其身心造成了重的危害,甚至具有一定的社会危害性。为了加强学校学风建设、为了学生的未来我们必须深刻认识,加强教育和管理。 【关键词】大学生网络低头族AHP ISM 系统分析学风建设 确定研究对象 随着互联网和手机技术的发展,学生的生活也在改变。学生利用手机、电脑等多途径上网花去大量的时间和金,过度沉迷网络,以至于形成一种上课玩手机的现象。学生上网的动机及其在网上的活动反映了他们不健康的心理倾向,这必将重影响他们的正常学习与生活,危害健康。鉴于此,我们决定对学校学生课堂沉迷于手机,形成“课堂低头族”的现象进行分析,解决这种不良的学习风气,使学生形成积极向上的学习风气,为学校优良学风建设做贡献。 系统分析的法和步骤 1、分析大学生“课堂低头”的原因,确定影响因素体系;(ISM) 2、制定解决案;

linux网络编程课设报告

《Linux网络编程》 课程设计 班级: 姓名: 指导老师:

一、设计背景 Linux操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!只要是基于GNU公约的软件你都可以任意使用并修改它的源代码。通过这次课程设计能更好的学习网络编程知识和掌握LINUX平台上应用程序设计开发的过程,将大学四年所学知识综合运用,为未来的工作学习打下基础。 二、设计目的 1、学习epoll 跟FTP被动模式 2、掌握linux基本命令,例如ls、cd、login; 3、学会如何编译、运行 三、环境要求 1、centos 64位操作系统 2、gcc编译器 四、设计原理 4.1客户端 客户端程序的主要任务有以下3个: (1)、分析用户输入的命令。 (2)、根据命令向服务器发出请求 (3)、接受服务器返回请求的结果 客户端为用户提供了3种命令:(1)、get:从服务器下载文件(2)、list:列出客户端当前目录的内容(3)、quit离开 4.2 服务器端 (1)、分析请求代码。 (2)、根据请求代码做相应的处理 (3)、等待返回结果或者应答信息

五、软件测试结果

六、部分主代码 #include "ftserve.h" int main(int argc, char *argv[]) { int sock_listen, sock_control, port, pid; if (argc != 2) { printf("usage: ./ftserve port\n"); exit(0); } port = atoi(argv[1]); // create socket if ((sock_listen = socket_create(port)) < 0 ) { perror("Error creating socket"); exit(1); } while(1) { // wait for client request

操作系统课程设计报告

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: 13软件工程1班 提交时间: 2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。

二、环境条件 系统: WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景 计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。

(4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<

软件工程网上书店管理系统详细课程设计报告很经典

一.引言 (1) 二.系统开发的目标 (1) 三.可行性研究 (2) 四.系统需求分析 (2) 五.总体设计 (3) 六.概要设计 (4) 七.详细设计 (7) 八.软件测试 (8) 九.页面显示效果及代码分析 (13) 十.特别说明………………………………………………… ..20

十一.参考资料 (21)

一、引言 1.编写目的 本需求分析文档的目的是说明网上书店管理系统最终需要满足 的条件和限制,为进一步设计和实现提供依据。本文档将用户的需求用文字的形式固定下来,是与用户沟通的成果,也是用户验收项目时的参考。 2. 项目背景 系统名称:《网上书店管理系统》 需求背景分析:随着互联网的迅速发展以及我国经济的稳定平衡发展,人们对于知识的追求也越来越高,因而市场场上出现了各类的图书,但由于各种各样的原因使得消费者在选购图书的时候不能找到自己合意的书籍,同时由于网络经济的迅速发展激生出了网上卖书的现象,由于网上书店里面的图书相当丰富,且价格较市场上的书店里的便宜,以致于越来越多的人上网购书,同时也使得越来越多的人在网上开设自己的书店,本系统即是在以上各种条件成熟的条件下,建立的一个可以让消费者登录本系统购买他们的图书的一个网上书店 管理系统。 系统用途:本系统利用网络平台,使得消费者和销售者足不出户即可实现买书和卖书的行为,同时大大减少的人员的参与。 系统使用围:网上想买书者。 二、系统开发的目标 管理员可以维护客户注册信息、维护图书信息、处订定单信息、维护系统公告、网上售书。查看图书调查报告、游客可以在线注册为会员、投票、购书。本系统的设计目标将最终定位于完成以上所述的系统主要业务的基本模型上。 三、可行性研究 可行性研究是系统分析阶段的第二项活动。此活动的主要目标是:

操作系统课程设计报告

上海电力学院 计算机操作系统原理 课程设计报告 题目名称:编写程序模拟虚拟存储器管理 姓名:杜志豪.学号: 班级: 2012053班 . 同组姓名:孙嘉轶 课程设计时间:—— 评语: 成绩: 目录 一、设计内容及要求 (4) 1. 1 设计题目 (4) 1.2 使用算法分析: (4)

1. FIFO算法(先进先出淘汰算法) (4) 1. LRU算法(最久未使用淘汰算法) (5) 1. OPT算法(最佳淘汰算法) (5) 分工情况 (5) 二、详细设计 (6) 原理概述 (6) 主要数据结构(主要代码) (6) 算法流程图 (9) 主流程图 (9) Optimal算法流程图 (10) FIFO算法流程图 (10) LRU算法流程图 (11) .1源程序文件名 (11) . 2执行文件名 (11) 三、实验结果与分析 (11) Optimal页面置换算法结果与分析 (11) FIFO页面置换算法结果与分析 (16) LRU页面置换算法结果与分析 (20) 四、设计创新点 (24) 五、设计与总结 (27)

六、代码附录 (27) 课程设计题目 一、设计内容及要求 编写程序模拟虚拟存储器管理。假设以M页的进程分配了N

块内存(N

Linux课程设计报告

《Linux课程设计》 设计题目:shell 编程实现用户信息管理专业:软件工程 指导教师:蔡照鹏王斌斌 班级: 学号: 姓名: 同组人: 计算机科学与工程学院

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux 内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。 Linux操作系统是UNIX操作系统的一种克隆系统,它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX 和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux 继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。

安全系统工程课程设计

《安全系统工程》课程设计 姓名 学号 班级 专业安全工程 课程名称安全系统工程 指导教师

目录 前言 (2) 第一章安全评价 (3) 1.1安全评价的目的 (3) 1.2安全评价的原则 (3) 1.3安全评价范围 (3) 1.4安全评价内容 (3) 1.5安全评价步骤 (4) 第二章加油站概况 (5) 2.1站内建设 (5) 2.2工艺流程 (5) 2.3安全管理制度 (6) 2.4消防器材配置 (6) 第三章危险有害因素分析 (7) 3.1 加油站固有危险源 (7) 3.2工艺过程中有害因素分析 (12) 3.2.1加油区危险有害因素辨识 (12) 3.2.2 储油罐区危险、有害因素辨识 (13) 3.3安全管理危险有害因素分析 (14) 3.4重大危险源分析 (15) 3.5事故树定性定量分析 (15) 3.6最小割集与最小径集的计算 (16) 3.7顶上事件概率的计算 (17) 3.8结构重要度分析与计算 (17) 3.9概率重要度的计算 (18) 3.10临界重要度分析 (19) 第四章加油站安全对策与措施 (20) 第五章总结 (21)

前言 我们国家的安全生产方针是“安全第一预防为主”,由此我们可以知道“安全”是我们国家以至于整个人类发展生存活动中永恒的主题,而就当今世界来看,安全问题在我们的日常生活中是无处不在,各行各业,安全问题已经成为关注的首要问题。 根据《中华人民共和国安全生产法》、《危险化学品安全管理条例》国务院令第334号中第十七条规定:“生产、储存、使用剧毒化学品的单位,应对本单位的生产、储存装置每年进行一次安全评价;生产、储存、使用其它化学品的单位,应对本单位的生产、储存装置每两年进行一次安全评价。” 现平顶山市加油站作为危险化学品的经营单位,有必要定期对其进行安全评价。加油站由安全评价事务有限公司对其危险化学品经营情况进行了评价,并取得了危险化学品经营安全许可证。今年,为完成安全现状评价报告,我小组对其进行了安全评价。经过现场勘查,收集有关资料,在对该加油站充分调研分析的基础上,对其进行系统的安全评价,包括危险因素的辨识与分析,定性定量分析及安全措施的提出与改进等。 由于时间仓促,加之评价人员水平有限,本评价中有不当、错漏之处在所难免,恳请各位老师与同学批评指正。

2011180021-Linux操作系统-课程设计报告-基于Linux的进程调度模拟程序

河南中医学院 《linux操作系统》课程设计报告 题目:基于Linux的进程调度模拟程序 所在院系:信息技术学院 专业年级:2011级计算机科学与技术完成学生:2011180021 郭姗 指导教师:阮晓龙 完成日期:201X 年06 月22 日 目录 1. 课程设计题目概述3 2. 研究内容与目的4 3. 研究方法5 4. 研究报告6 5. 测试报告/实验报告7 6. 课题研究结论8 7. 总结9

1、课程设计题目概述 随着Linux系统的逐渐推广,它被越来越多的计算机用户所了解和应用. Linux是一个多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。如果读者对计算机硬件体系有一定了解的话,会知道我们大家常用的单CPU计算机实际上在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?原来Linux使用了一种称为"进程调度(process scheduling)"的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。本文就是对进程调度进行研究、实验的。 本文首先对Linux系统进行了简要的介绍, 然后介绍了进程管理的相关理论知识。其次,又介绍最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)、先来先服务算法的相关知识,并对进程调度进行最高优先数优先的调度算法和先来先服务算法模拟实验,并对比分析两种算法的优缺点,从而加深对进程概念和进程调度过程/算法的理解 设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择某一进程占用处理机。使得系统中的进程能够有条不紊的运行,同时提高处理机的利用率以及系统的性能。所以设计模拟进程调度算法(最高优先数优先的调度算法、先来先服务算法),以巩固和加深处理进程的概念,并且分析这两种算法的优缺点。关键词:linux 进程调度调度算法

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告学院:计算机学院 专业班级:13软件工程1班 提交时间:2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。 二、环境条件 系统:WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景

计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。 (4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下: 钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<

软件工程课程设计报告案例

网上招聘系统分析设计

目录 第一章网上招聘系统需求规格说明书.................... - 3 - 第二章软件项目的概要设计说明书. (16) 第三章网上招聘系统详细设计 (54) 第四章软件项目的编码案例说明 (67) 第五章网上招聘系统客户端系统测试计划 (74) 第六章网上招聘系统客户端系统测试设计 (78) 第八章网上招聘系统客户端系统测试报告 (95)

第一章网上招聘系统需求规格说明书 1.导言 1.1 目的 该文档是关于用户对于网上招聘系统的功能和性能的要求,重点描述了网上招聘系统的功能需求,是概要设计阶段的重要输入。 本文档的预期读者是: ·设计人员; ·开发人员; ·项目管理人员; ·测试人员; ·用户。 1.2 围 该文档是借助于当前系统的逻辑模型导出目标系统的逻辑模型的,解决整个项目系统的“做什么”的问题。在这里,没有涉及开发技术,而主要是通过建立模型的方式来描述用户的需求,为客户、用户、开发方等不同参与方提供一个交流的平台。 1.3 编写说明 HR,Human Resource(人力资源管理)的缩写。 JSP,Java Server Page(Java服务器页面)的缩写,一个脚本化的语言。 UML,Unified Modeling Language(统模语言)的缩写,是一个标准的建模语言。 1.4 术语定义 无 1.5 引用标准 [1]《企业文档格式标准》,****************软件工程过程化组织 [2]《需求规格报告格式标准》,************软件工程过程化组织 1.6 参考资料 [1]《UML说明》,***********************软件 [2]《需求规格报告格式标准》,************公司软件工程过程化组织 1.7 版本更新信息 本文档的更新记录如表A-1所示。 表A-1 版本更新记录 修改编号修改日期修改后版本修改位置修改容概述 001 002 003 004 005 2008.9.5 2006.9.10 2006.9.15 2006.9.16 2006.10.18 0.1 0.2 0.3 0.4 1.0 全部 第3.1节 第4.1节 第5.1节 第7章 初始发布版本 增加 修改 修改 增加 2.系统定义 我们分别阐述一下项目的来源、背景,项目的用户特点和项目的目标。 2.1 项目来源及背景 本项目是为某公司开发的一个网上招聘系统,由于这个公司的规模比较大,需要招聘 的员工也很多,每次招聘总能收到成千上万的简历,如何挑选合适的应聘者常常是公司比较

Linux课程设计报告

《Linux课程设计》 设计题目: shell 编程实现用户信息管理专业:软件工程 指导教师:蔡照鹏王斌斌 班级: 学号: 姓名: 同组人: 计算机科学与工程学院

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux核。Linux可安装在各种计算机硬件设备中。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux核,但实际上人们已经习惯了用Linux来形容整个基于Linux核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。 Linux操作系统是UNIX操作系统的一种克隆系统,它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet 网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的制约的、全世界都能自由使用的Unix兼容产品。

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级:13软件工程1班 提交时间:2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。 二、环境条件

系统:WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景 计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。 (4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。

2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<

北京交通大学系统工程课程设计报告

《系统工程》课程设计基于层次分析法的 校园食堂综合服务水平对比评价 学院:交通运输学院 专业:交通工程 指导老师: 成员:

基于层次分析法的校园食堂综合服务水平对比评价 一、调查背景简介 高校食堂服务是高校后勤服务体系的核心环节之一。食堂服务质量的好坏,对学校教学秩序的稳定有较大影响。在高校后勤工作迈向社会化的今天,高校食堂要在逐渐开放的校内市场中求生存,就必须注重服务质量,以服务质量赢得市场和效益,从而给师生带来安全放心的食品,使他们更好地投入到学习工作和生活中。下面,我们将对学生活动中心一楼食堂、学生活动中心二楼食堂以及明湖餐厅作简要的介绍和定性分析。 1.1学生活动中心一楼食堂简介 学生活动中心一楼食堂位于北京交通大学主校区西北方向,紧邻22号公寓、12号公寓两座学生宿舍。来此就餐的群体主要为从思源西楼、思源楼、建艺楼下课的学生和居住在12号、22号以及19号宿舍楼的学生。 学活一楼共有15个窗口,早餐、午餐、晚餐的供应时间分别为07:00—09:00、11:00—13:00、17:00—19:00,其中早07:30—7:50、午12:05—12:30、晚18:15—18:30为学生就餐高峰。早餐主要供应各类面食和粥,相比之下,晚餐和午餐菜品较为丰富。调查发现,学活一楼的操作间较为卫生、服务人员均带有手套和口罩,餐具均经过反复消毒方给学生使用。 综合以上方面,学活一楼卫生整体条件较好,上菜速度快,价格经济实惠,但菜品口味和质量一般,种类较少,整体就餐环境较为简陋,高峰时期需要等座。1.2学生活动中心二楼食堂简介 学生活动中心二楼食堂位于学生活动中心一食堂楼上。来此就餐的群体和学活一食堂大体相同,但更加追求菜品的种类和质量。 学活二楼一共有16个窗口,早餐、午餐、晚餐的供应时间分别为07:00—10:30、11:00—14:00、17:00—19:30,其中早07:30—7:50、午12:05—12:30、晚18:15—18:30为学生就餐高峰。早餐供应各类面食、粥等,午餐和晚餐除供应早餐的内容之外,还增加了几个窗口供应菜品和小吃。调查发现,学活二楼的操作间较为卫生,但服务人员卫生不及一楼。 综合以上方面,学活二楼卫生整体条件和上菜速度相对一楼略有逊色,价格较一楼略贵,但菜品口味质量以及花色品种要明显优于一楼,整体就餐环境较好,一般情况下无需等座。 1.3明湖餐厅简介 明湖餐厅位于交大东北方向一食堂三楼,紧邻18号公寓、16号公寓两栋学生宿舍。来此就餐的群体主要为图书馆自习、逸夫楼下课学生以及居住在其旁的两栋宿舍楼的学生。一般来明湖就餐的学生以集体或情侣形式为主,主要追求就餐环境和菜品质量。 明湖餐厅共有五个窗口,午餐、晚餐的供应时间分别为10:30—14:30、16:30—21:00,其中午12:05—12:30、晚18:15—18:30为学生就餐高峰。早餐供应各类面食、粥等,午餐和晚餐除供应早餐的内容之外,还增加了几个窗口供应菜品和小吃。但其业务处理过程较以上两个食堂明显不同:顾客通过收银员人为操作,选择喜欢的菜品,付款后生成菜品订单,然后通过顾客提交至厨房售票窗口,后台生成菜品,服务人员将菜品送达餐桌。就餐完毕后,无需将剩余菜品和餐具递

操作系统(一个小型操作系统的设计与实现)课程设计

南通大学计算机科学与技术学院操作系统课程设计报告 专业: 学生姓名: 学号: 时间:

操作系统模拟算法课程设计报告 设计要求 将本学期三次的实验集成实现: A.处理机管理; B.存储器管理; C.虚拟存储器的缺页调度。 设计流程图 主流程图 开始的图形界面 处理机管理存储器管理缺页调度 先来先服务时 间 片 轮 转 首 次 适 应 法 最 佳 适 应 法 先 进 先 出 L R U 算 法

A.处理机调度 1)先来先服务FCFS N Y 先来先服务算法流程 开始 初始化进程控制块,让进程控制块按进程到达先后顺序让进程排队 调度数组中首个进程,并让数组中的下一位移到首位 计算并打印进程的完成时刻、周转时间、带权周转时间 其中:周转时间 = 完成时间 - 到达时间 带权周转时间=周转时间/服务时间 更改计时器的当前时间,即下一刻进程的开始时间 当前时间=前一进程的完成时间+其服务时间 数组为空 结束

2)时间片轮转法 开始 输入进程总数 指针所指的进程是 否结束 输入各进程信息 输出为就绪状态的进程的信息 更改正在运行的进程的已运行时间 跳过已结束的程序 结束 N 指向下一个进程 Y 如果存在下一个进程的话 Y N 输出此时为就绪状态的进程的信息 时间片轮转算法流程图

B.存储器管理(可变式分区管理) 1)首次适应法 分配流程图 申请xkb内存 由链头找到第一个空闲区 分区大小≥xkb? 大于 分区大小=分区大小-xkb,修改下一个空闲区的后向指针内容为(后向指针)+xkb;修改上一个空闲区的前向指针为(前向指针)+xkb 将该空闲区从链中摘除:修改下一个空闲区的后向地址=该空闲区后向地址,修改上一个空闲区的前向指针为该空闲区的前向指针 等于 小于延链查找下 一个空闲区 到链尾 了? 作业等待 返回是 否 登记已分配表 返回分配给进程的内存首地址 开始

linux字符设备驱动课程设计报告

一、课程设计目的 Linux 系统的开源性使其在嵌入式系统的开发中得到了越来越广泛的应用,但其本身并没有对种类繁多的硬件设备都提供现成的驱动程序,特别是由于工程应用中的灵活性,其驱动程序更是难以统一,这时就需开发一套适合于自己产品的设备驱动。对用户而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以像对其它文件一样对此设备文件进行操作。 通过这次课程设计可以了解linux的模块机制,懂得如何加载模块和卸载模块,进一步熟悉模块的相关操作。加深对驱动程序定义和设计的了解,了解linux驱动的编写过程,提高自己的动手能力。 二、课程设计内容与要求 字符设备驱动程序 1、设计目的:掌握设备驱动程序的编写、编译和装载、卸载方法,了解设备文件的创建,并知道如何编写测试程序测试自己的驱动程序是否能够正常工作 2、设计要求: 1) 编写一个简单的字符设备驱动程序,该字符设备包括打开、读、写、I\O控制与释放五个基本操作。 2) 编写一个测试程序,测试字符设备驱动程序的正确性。 3) 要求在实验报告中列出Linux内核的版本与内核模块加载过程。 三、系统分析与设计 1、系统分析 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1、对设备初始化和释放; 2、把数据从内核传送到硬件和从硬件读取数据; 3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4、检测和处理设备出现的错误。 字符设备提供给应用程序的是一个流控制接口,主要包括op e n、clo s e(或r ele as e)、r e ad、w r i t e、i o c t l、p o l l和m m a p等。在系统中添加一个字符设备驱动程序,实际上就是给上述操作添加对应的代码。对于字符设备和块设备,L i n u x内核对这些操作进行了统一的抽象,把它们定义在结构体fi le_operations中。 2、系统设计: 、模块设计:

相关文档
相关文档 最新文档