操作系统内核的编译与添加系统调用.docx

上传人:b****2 文档编号:3476462 上传时间:2023-05-05 格式:DOCX 页数:17 大小:938.17KB
下载 相关 举报
操作系统内核的编译与添加系统调用.docx_第1页
第1页 / 共17页
操作系统内核的编译与添加系统调用.docx_第2页
第2页 / 共17页
操作系统内核的编译与添加系统调用.docx_第3页
第3页 / 共17页
操作系统内核的编译与添加系统调用.docx_第4页
第4页 / 共17页
操作系统内核的编译与添加系统调用.docx_第5页
第5页 / 共17页
操作系统内核的编译与添加系统调用.docx_第6页
第6页 / 共17页
操作系统内核的编译与添加系统调用.docx_第7页
第7页 / 共17页
操作系统内核的编译与添加系统调用.docx_第8页
第8页 / 共17页
操作系统内核的编译与添加系统调用.docx_第9页
第9页 / 共17页
操作系统内核的编译与添加系统调用.docx_第10页
第10页 / 共17页
操作系统内核的编译与添加系统调用.docx_第11页
第11页 / 共17页
操作系统内核的编译与添加系统调用.docx_第12页
第12页 / 共17页
操作系统内核的编译与添加系统调用.docx_第13页
第13页 / 共17页
操作系统内核的编译与添加系统调用.docx_第14页
第14页 / 共17页
操作系统内核的编译与添加系统调用.docx_第15页
第15页 / 共17页
操作系统内核的编译与添加系统调用.docx_第16页
第16页 / 共17页
操作系统内核的编译与添加系统调用.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统内核的编译与添加系统调用.docx

《操作系统内核的编译与添加系统调用.docx》由会员分享,可在线阅读,更多相关《操作系统内核的编译与添加系统调用.docx(17页珍藏版)》请在冰点文库上搜索。

操作系统内核的编译与添加系统调用.docx

操作系统内核的编译与添加系统调用

广州大学松田学院

操作系统课程设计

(第1次)

题目:

修改内核及Linux内核重编译

 

学生学号:

00908010116

学生姓名:

林涛

专业班级:

计算机科学与技术

(1)班

老师姓名:

甘页昌

二○一二年六月

修改内核及Linux内核重编译

--为Linux内核增加系统调用systest()

概述

1、由同学自由组合,5人一组共同完成

组长:

林涛

组员:

董守义许建伟陈嘉茵黄坚钊

分工:

林涛:

具体操作与指导

董守义:

平台的提供与调试

许建伟:

收集资料

陈嘉茵:

PPT的处理

黄坚钊:

后期修改

2、修改内核的具体内容,由同组人员共同协商确定,如

(1)为系统增加某个设备驱动程序

(2)为系统增加一个系统调用如systest,该系统调用的功能,可以很简单

3、组内成员中分工明确,同步进行

4、第18周实验课,每组要求做PPT,上台讲解课程设计的内容以及编译过程(10分钟)

5、其他同学为讲解的组打分(ABCDE级别)核修改内容介绍

本次实验目的:

为系统添加一个系统调用

内核编译环境介绍

硬件环境:

台式机CPU:

酷睿2双核2.5G内存:

3G

软件环境:

本次编译采用Ubuntu11.10系统。

并且系统安装在虚拟机中。

虚拟机版本:

VmwareWorkstation8.04。

内核版本:

linux-2.6.34.12

内核修改

系统设计

内核修改的基本思路

配置内核→编译二进制内核映像文件→编译模块

内核修改的实现步骤

搭建环境:

在Win7环境下安装虚拟机软件,安装Ubuntu系统,为了给内核的编译预留足够的磁盘与内存空间,建议给Ubuntu系统分配20G硬盘空间,1G内存.。

任务描述:

编译内核(注意内核编译需要root权限)

获取root权限的方法:

lt@ubuntu:

~$sudopasswdroot

[sudo]passwordforlt:

EnternewUNIXpassword:

RetypenewUNIXpassword:

passwd:

passwordupdatedsuccessfully

lt@ubuntu:

~$su

Password:

root@ubuntu:

/home/lt#

RetypenewUNIXpassword:

passwd:

passwordupdatedsuccessfully

任务分析:

内核编译过程中最复杂的是参数的配置,选项根据实际情况进行选择。

(硬盘空间要大于8G,建议16-20G)

下载新内核

地址:

http:

//www.kernel.org/

可以下载Linux的最新内核代码。

文件被冠以“linux-x.y.z.tar.gz”和“linux-x.y.z.tar.bz2”等,这些就是Linux内核的源代码。

同时存在一些类似“patch-x.y.z.gz”和“patch-x.y.z.bz2”的文件,这是用来更新前面完整的内核源代码的补丁包。

本实验从http:

//www.kernel.org下载linux-2.6.34.tar.bz2内核,并将下载的内核保存在“/usr/src”目录下。

内核解压(以linux-2.6.33.3.tar.bz2为例子)

编译内核前,应对下载的内核文件进行解压。

(1)用以下命令将当前目录改到/usr/src下:

cd/usr/src

(2)如果/usr/src目录下存在一个“linux”的目录,应将其改名为“linux.old”;如果不存在,则直接执行以下命令:

bzip2-dlinux-2.6.34.12tar.bz2

tar-xvflinux-2.6.34.12.tar

(3)文件将解压到/usr/src/linux目录中,我们把它稍作修改:

ln–slinux-2.6.34.12linux

配置内核,修改相关参数,

修改路径为cd/usr/src/linux

在图形界面下,makexconfig;

字符界面下,makemenuconfig

在内核配置菜单中正确设置内核选项,保存退出

如何配置内核参数?

  

y:

将该功能编译进内核。

n:

不将该功能编译进内核。

m:

将该功能编译成在需要时动态插入到内核中的模块。

单击“MainMenu”按钮,返回主配置窗口;

单击“Next”按钮,配置下一个配置项;

单击“Prev”按钮,配置上一个配置项。

选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于缩减内核,减少内核消耗的内存。

与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。

  

修改内核范围(更新后能否启动至关重要):

1)文件系统

请务必要选中ext3文件系统,

  Filesystems--->

  [*]Ext3journallingfilesystemsupport

  [*]Ext3SecurityLabels

  [*]JBD(ext3)debuggingsupport

(一定要修改)

  以上三项一定要选上,而且要内建(即标*).这个非常重要,在配置完后一定要检查一下.config文件有没有"CONFIG_EXT3_FS=y"这一项.如果不是"CONFIG_EXT3_FS=y"而是"CONFIG_EXT3_FS=m",你在运行内核时就会遇上以下错误:

pivotroot:

pivot_root(/sysroot,/sysroot/initrd)failed

网卡驱动

  请务必把自己网卡对应的驱动编译进内核,比较普遍的网卡是realtek8139,以下就是这种网卡的配置,以供参考

  DeviceDrivers--->

  Networkingsupport--->

  Ethernet(10or100Mbit)--->

  <*>RealTekRTL-8139C+PCIFastEthernetAdaptersupport(EXPERIMENTAL)

  <*>RealTekRTL-8139PCIFastEthernetAdaptersupport

3)声卡驱动(供参考)

  也要选择自己声卡对应的驱动编译进内核,比较普遍的声卡是i810_audio,以下就是这种声卡的配置,以供参考

  DeviceDrivers--->

  Sound--->

  <*>Soundcardsupport

  AdvancedLinuxSoundArchitecture--->

  <*>AdvancedLinuxSoundArchitecture

  <*>Sequencersupport

  <>Sequencerdummyclient

  <*>OSSMixerAPI

  <*>OSSPCM(digitalaudio)API[*]OSSSequencerAPI

  <*>RTCTimersupport

  PCIdevices--->

  <*>Inteli8x0/MX440,SiS7012;Ali5455;NForceAudio;AMD768/8111

  OpenSoundSystem--->

<>OpenSoundSystem(DEPRECATED)

保存内核配置:

SaveanAlternateConfigurationFile(一般无需改名,直接保存即可)若要改名,记得加后缀“.config”

程序设计

Systest()系统调用介绍

操作系统的主要功能是为应用程序的运行创建良好的环境,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(systemcall)的接口呈现给用户。

系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序。

Systest()系统调用程序设计

Asmlinkageinsyssys_mycall(intn)

{

Printk("Hey,IamLinTao!

")

}

Systest()系统调用验证程序设计

#include

#include

intmain()

{

inttest;

test=syscall(338,2);

printf("%d\n",test);

if(test==2)

printf("thefirstsyscallissuccessfull!

\n");

}

内核重编译

Linux内核源代码下载及其版本说明

地址:

http:

//www.kernel.org/

可以下载Linux的最新内核代码。

文件被冠以“linux-x.y.z.tar.gz”和“linux-x.y.z.tar.bz2”等,这些就是Linux内核的源代码。

同时存在一些类似“patch-x.y.z.gz”和“patch-x.y.z.bz2”的文件,这是用来更新前面完整的内核源代码的补丁包。

本实验从http:

//www.kernel.org下载linux-2.6.34.12tar.bz2内核,并将下载的内核保存在“/usr/src”目录下。

本次使用linux-2.6.34.12.内核由:

http:

//www.kernel.org/下载

在Linux内核源代码中添加systest系统调用

.添加系统调用号表:

将.longsys_mycall添加到syscall_table_32.S中最后一行

root@ubuntu:

#sudogedit/usr/src/linux/arch/x86/kernel/syscall_table_32.S

3.2.1添加系统调用号

root@ubuntu:

#sudogedit/usr/src/linux/arch/x86/include/asm/unistd_32.h

将“#define__NR_mycall338”加入到unistd_32.h因为

内核的系统调用号已经到337了调用号在此

基础上加1并且将“#defineNR_syscalls338”改为“#defineNR_syscalls339”

3.2.2编写系统调用

对于32位x86处理器架构请将以上一段代码添加到arch/x86/kernel/sys_i386_32.c的最后一行,而对于64位架构将其添加到arch/x86/kernel/sys_x86_64.c中的最后一行。

root@ubuntu:

#sudogedit/usr/src/linux/arch/x86/kernel/sys_i386_32.c

Asmlinkageinsyssys_mycall(intn)

{

Printk("Hey,IamLinTao!

")

}

内核重编译

内核重编译步骤介绍

生成依赖(dependency)信息,清除旧的编译结果

配置内核后,返回命令窗口。

为确保关键文件,在正确的位置输入以下命令:

makedep

为确保所有有关文件都处于最新版本状态,需要输入命令:

makeclean

检查是否生成依赖(dependency)信息并清除旧的编译结果。

编译二进制内核映像文件

在“/usr/src/linux”目录下建立二进制的内核映像文件,命令如下:

makebzImage(输入命令时请注意区分大小写)(大概用25分钟——40分钟)

编译过程持续一段时间。

编译结束后,在/usr/src/linux/arch/i386/boot目录下可找到名为“bzImage”的映像文件,即新内核的映像文件。

编译模块

编译二进制内核映像文件后,需要进行模块的编译,命令如下:

makemodules(用了2个小时)

makemodules_install(10分钟左右)

模块被编译且安装到/usr/lib/<内核版本号>目录下。

至此,内核被编译完成,内核模块也编译完成并被安装。

经过以上的步骤,我们终于得到了新版本的内核。

为了能够使用新版本的内核,我们还需要做一些改动:

#cp/usr/src/linux/System.map/boot/System.map-2.6.34.12

#cp/usr/src/linux/arch/i386/boot/bzImage/boot/vmlinuz-2.6.34.12

#cp.config/boot/config-2.6.34.12

#mkinitramfs-o/boot/initrd.img-2.6.34.122.6.34.12

以上这两个文件是刚才编译时新生成的。

下面修改/boot下的两个链接System.map和vmlinuz,使其指向新内核的文件:

#cd/boot

#rm-fSystem.mapvmlinuz

#ln-svmlinuz-2.6.33.3vmlinuz

#ln-sSystem.map-2.6.33.3System.map

新内核重启前的准备

配置启动管理器

如果配置lilo和grub,存在问题:

无法挂载root,如下图:

为了解决上面的错误

只要输入如下命令:

sudoapt-getinstallstartupmanager

过程如下图:

成功安装,如下图:

打开软件,系统内核默认3.0.0.12

修改默认启动内核为刚编译的2.6.34.12内核,如下图:

重启系统,再次进入startupmanager,系统已成功切换至2.6.34.12内核

提示:

若无法找到应用软件,请先更新软件源

更新软件源命令:

sudoapt-getupdate

重启新内核

顺利进入系统,再次进入startupmanager查看内核版本,确认当前系统内核为2.6.34.12

验证systest()系统调用

编译验证程序test.c

#include

#include

intmain()

{

inttest;

test=syscall(338,2);

printf("%d\n",test);

if(test==2)

printf("thefirstsyscallissuccessfull!

\n");

}

运行验证程序test

编译生成可执行文件gcc-otesttest.c

编译成功后执行以下命令运行测试程序

./test

结果:

2

thefirstsyscallissuccessfull!

发现和我们预想的结果不一样"Hey,IamLinTao!

"没有

显示出来因为printk不会直接打印出来而是需要

命令dmesg-c但要注意一定是执行完./test后做才

可以并且要在root权限下

课程设计的体会

林涛:

很多时候编译失败都是在于细节上的问题。

内核的编译是个比较花时间的工作,所以一定要有耐心,敢于尝试,不怕失败。

还要善于借助因特网查资料,和同学们讨论。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2