操作系统实验一(内核编译,系统调用)

操作系统实验一

——-系统调用

 

注:  实验前的准备工作就不一一叙述了。

Ubuntu运行环境:mac osx10.9.1 +VMware Fusion 6.0.2

Ubuntu 版本: 12.10   64位

 

具体实验流程如下:

 

1.安装有关编译程序。(这是第二次重装虚拟机时候加入的步骤, 不然在make步骤中会报错,要事先安装好有关编译程序)

sudo  apt-getinstall build-essential kernel-package  libncurses5-dev

 

2.下载需要编译的内核源码文件。(直接在终端上下载。找到适合对应版本Ubuntu的内核源码)

sudo apt-getinstall linux-source

安装界面如下:


(图一:提示安装内核源码)


(图二:内核源码安装完成)

 

3。进入 /usr/src,解压源码文件

cd /usr/src

sudo tar jxvf/usr/src/linux-source-3.5.0/linux-source-3.5.0.tar.bz2


(图三:解压源码文件成功)

 

4。进入解压出的文件目录

cd/usr/src/linux-source-3.5.0/kernel

5. 安装vim

sudo apt-getinstall vim

 

注:ubuntu默认没有安装vim,出现:

jyg@ubuntu:~$vim test.c


The program 'vim' can be found in thefollowing packages:
 

* vim

* vim-gnome

 * vim-tiny
 

* vim-athena
 

* vim-gtk
 * vim-nox


Try: sudo apt-get install <selectedpackage>

 

6.打开sys.c 加入函数

vim sys.c(在vim中, i进入编辑, esc退出编辑状态. G跳到末尾, gg进入开头。 :wq保存退出, :q不保存退出)

在开头加入头文件:

#include<linux/linkag.h>

在末尾加入函数

asmlinkage intsys_helloworld(void){

    printk(KERN_EMERG “hello world!”);

     return 1;

}


(图四:在sys.c中加入函数)

 

7.添加声明

a、进入/usr/src/linux-source-3.5.0/arch/x86/include/asm/目录

 

cd/usr/src/linux-source-3.5.0/arch/x86/include/asm/

 

b、用vim打开文件syscalls.h进行编辑,加入我们的声明

(倒数第二行后插入asmlinkage int sys_helloworld(void);)

(图五:添加声明)

 

8.加一个系统调用的id

a、进入/usr/src/linux-source-3.5.0/arch/x86/syscalls目录

b、打开文件syscall_32.tbl(该文件有一个系统调用列表,最前面的属性是id)

c、可以发现222是没有使用的系统调用,所以我们可以插入系统调用(222 i386 helloworld sys_helloworld)

d、使用:wq命令保存退出


(图六: 加入系统调用ID)

 

9.编译

A。进入/usr/src/linux-xxx/目录下

cd  /usr/src/linux-source-3.5.0

B。make prproper

删除以前进行过的内核功能选择文件

C。 make menuconfig 并且在makemenuconfig时,将那个General setup内的local version修改成新的名称,比如我这里的myKernel

D。 vim/usr/src/linux-source-3.5.0/.config

修改CONFIG_RTS5139=n in .config file in the source code directory.

 

E。 make bzImage (编译内核)

F。 make modules (编译模块)

G。 makemodules_install (安装模块到正确目录)

 

这个过程错误总结:

输入sudo make bzImage报错后。

 

apple@ubuntu:/usr/src/linux-source-3.5.0$sudo make bzImage

 HOSTLD  scripts/kconfig/conf

scripts/kconfig/conf --silentoldconfigKconfig

***

*** Configuration file ".config"not found!

***

*** Please run some configurator (e.g."make oldconfig" or

*** "make menuconfig" or"make xconfig").

***

make[2]: *** [silentoldconfig] Error 1

make[1]: *** [silentoldconfig] Error 2

make[1]: Nothing to be done for `all'.

make[1]: Nothing to be done for `relocs'.

make: *** No rule to make target`include/config/auto.conf', needed by `include/config/kernel.release'.  Stop.

 

解决方法:先make menuconfig, 并设置对应64位的配置。

 

安装后继续输入sudo make menuconfig

 

#

# using defaults found in/boot/config-3.5.0-17-generic

#

Your display is too small to runMenuconfig!

It must be at least 19 lines by 80 columns.

make[1]: *** [menuconfig] Error 1

make: *** [menuconfig] Error 2

 

解决方法:窗口最大化

 

之后继续make modules。

make modules的时候碰到了错误

 

ERROR: "__modver_version_show" [drivers/staging/rts5139/rts5139.ko] undefined!

make[1]: *** [__modpost] Error 1

make: *** [modules] Error 2

 

(修改/usr/src/linux-headers-3.2.0-24-generic-pae/.config文件,找到STAGING项,将其值改为n)

CONFIG_RTS5139=m

修改CONFIG_RTS5139=n in .config file in the source code directory.

      

(图七:make menuconfig成功)


(图八:make bzImage成功)



(图九: make modules成功)

 

10.建立要载入ramdisk的映像文件(因为是虚拟硬盘,所以需要这一步)

mkinitramfs -o/boot/initrd.img-3.5.0-17-generic

 

 

11.拷贝原始内核,避免内核编译出错导致无法开机

sudo cp /usr/src/linux-source-3.5.0/arch/x86/boot/bzImage/boot/vmlinuz-3.5.0-17-generic

 

12.完成编译

sudo cp/usr/src/linux-source-3.5.0/.config /boot/config-3.5.0-17-generic

 

13.修改开机启动项

A。vim/etc/default/grub

B。将GRUD_HIDDEN_TIMEOUT改为一个大于0的数

C。更新一下开机启动项

sudo update-grub


(图十:将GRUD_HIDDEN_TIMEOUT改为一个大于0的数)

 

14.reboot。进入自己的内核。

这里遇到了一个问题, Ubuntu无法进入图形界面,停留在initramfs。但是我尝试uname –a显示内核信息。发现是进入了自己编译好的内核(myKernel)中。

如下所示。


(图十一:initramfs下显示内核信息)

后百度了一下,发现了解决方法。在grub引导中,设置rootdelay。正常进入图形界面。



(图十二: grub设置rootdelay=90)

 

15. 利用helloworld.c进行测试

gcc helloworld.c–o helloworld

./helloworld

sudo dmesg -c

( 图十三: 利用helloworld.c进行测试)

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
杭电实验1所涉及的内容是Linux内核编译及添加系统调用。 在这个实验中,首先需要了解Linux内核编译过程。Linux内核是操作系统的核心部分,由C语言编写。编译内核的目的是为了生成可执行的内核镜像文件,即vmlinuz。内核编译的一个重要环节是配置内核,确定编译时的各种选项和功能。 首先,需要从官方网站(https://www.kernel.org/)上获取最新的Linux内核源代码。在命令行中使用wget命令下载源代码文件,并解压缩到合适的目录。 接下来,进入源代码目录,使用make menuconfig命令配置内核。此命令会打开一个文本界面菜单,可以选择需要的功能和驱动,并进行一些优化设置。可以根据实验要求选择需要的功能,也可以使用默认配置。 配置完成后,使用make命令开始编译内核编译过程需要一定时间,取决于计算机性能和内核大小。编译完成后会生成可执行的内核镜像文件vmlinuz。 接下来是添加新的系统调用系统调用是应用程序与操作系统之间的接口,用于请求操作系统提供服务。在实验中,需要在内核中添加一个自定义的系统调用。 首先,在内核源代码中找到系统调用表文件syscalls.h,添加新的系统调用的函数原型。然后,在内核的核心文件kernel/sys.c中实现该系统调用的功能代码。 在添加完系统调用的功能代码后,需要编译内核并安装。使用make命令编译内核,并使用make install命令将编译好的内核安装到系统中。安装完成后,重启计算机,系统就会使用新的内核和新添加的系统调用。 总结来说,杭电实验1是介绍了Linux内核编译过程和系统调用的添加方法。通过这个实验,可以了解Linux内核的基本结构和编译过程,以及如何在内核中添加新的系统调用。这对于深入理解操作系统内核开发是非常有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Colin丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值