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

操作系统实验一

——-系统调用

 

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

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

安装界面如下:

操作系统实验一(内核编译,系统调用)_第1张图片

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

操作系统实验一(内核编译,系统调用)_第2张图片

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

 

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

cd /usr/src

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

操作系统实验一(内核编译,系统调用)_第3张图片

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

 

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;

}

操作系统实验一(内核编译,系统调用)_第4张图片

(图四:在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);)

操作系统实验一(内核编译,系统调用)_第5张图片(图五:添加声明)

 

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命令保存退出

操作系统实验一(内核编译,系统调用)_第6张图片

(图六: 加入系统调用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.

      操作系统实验一(内核编译,系统调用)_第7张图片

(图七:make menuconfig成功)

操作系统实验一(内核编译,系统调用)_第8张图片

(图八:make bzImage成功)


操作系统实验一(内核编译,系统调用)_第9张图片

(图九: 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

操作系统实验一(内核编译,系统调用)_第10张图片

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

 

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

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

如下所示。


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

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


操作系统实验一(内核编译,系统调用)_第11张图片

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

 

15. 利用helloworld.c进行测试

gcc helloworld.c–o helloworld

./helloworld

sudo dmesg -c

操作系统实验一(内核编译,系统调用)_第12张图片

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

你可能感兴趣的:(操作系统实验一(内核编译,系统调用))