环境:Ubuntu 12.10     学号:SA****199

1.更新内核:

直接安装的系统内核版本一般不是最新,用

uname -a

查看一下 自己的版本,OK,我的是:

Linux chenhao-Rev-1-0 3.5.0-31-generic #52-Ubuntu SMP Thu May 16 16:30:01 UTC 2013 i686 i686 i686 GNU/Linux

下面来手动更新内核到最新的稳定版本。

1.获取源码

在http://www.kernel.org/上下载最新稳定内核源代码,我下载的最新稳定版为  linux-3.9.4

下载好之后,解压到 /usr/src 文件夹下,命令如下:

sudo tar -xvf linux-3.9.4.tar.xz -C /usr/src/

进入该文件夹,

cd linux-3.9.4/

sudo make mrproper

该命令的功能在于清除当前目录下残留的.config和.o文件,这些文件一般是以前编译时未清理而残留的。

2.配置内核

将原来的配置文件拷过来,先到usr/src/linux-3.9.4文件夹底下,

sudo cp /usr/src/linux-headers-3.5.0-27-generic/.config .config

首先进行一下配置,进入到 /usr/src//linux-3.9.4 文件夹下,执行

sudo make menuconfig

在这之前需要安装一个ncurses,这里就不再记录安装过程了~

显示出来这种结果:

选Load,然后Ok,然后Save。

3.编译和安装

这个过程请耐心等待。。。

make bzImage //生成新内核

make modules //编译模块

make modules_install //安装模块

make install // 安装内核

完成之后,grub 已经自动更新,不用在去手动更新。

OK ,重启机器,进入Ubuntu ,更新的第一次加载有点慢

重启之后,我们在看一下新的版本。

更新成功~

2.添加系统调用:

什么是系统调用:

Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。二者在使用方式上也有相似之处。Linux系统的核心部分即是Linux内核,是一系列设备的驱动程序。系统调用是Linux内核提供的功能十分强大的一系列的函数。这些函数是在内核中实现的,它们是应用程序和内核交互的接口,系统调用在Linux系统中发挥着巨大的作用,如果没有系统调用,那么应用程序就失去了内核的支持。

Linux核心还提供了一些C语言函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。

系统调用是如何工作的:

一般的,进程是不能访问内核的。它不能访问内核所占内存空间也不能调用内核函数。CPU硬件决定了这些(这就是为什么它被称作"保护模式")。系统调用是这些规则的一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在Intel CPU中,这个由中断0x80实现。硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核--所以你就可以为所欲为。

进程可以跳转到的内核位置叫做sysem_call。这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。如果你希望读这段代码,它在/kernel/entry.S,Entry(system_call)的下一行。

下面来实现一个简单的系统调用。

1)系统调用函数的实现。

添加一个系统调用我们需要在系统调用表中增加一个新的条目,然后存储新的系统调用函数的地址。

x86架构的系统调用表 在内核代码的 arch/x86/syscalls 文件夹底下,我们显示出来它的内容,并且进入

chenhao@chenhao-Rev-1-0:/usr/src/linux-3.9.4$ ls arch/x86/syscalls/

Makefile syscall_32.tbl syscall_64.tbl syscallhdr.sh syscalltbl.sh

syscall_32.tbl 包含了 x86 32bit的系统调用 ,而syscall_64.tbl 包含了 x86 64bit的系统调用,需要根据自己使用机器的类型来向不同的表中添加系统调用。

sudo vim arch/x86/syscalls/syscall_32.tbl

在表中添加新的系统调用:

349 i386 kcmp sys_kcmp

350 i386 finit_module sys_finit_module

351 i386    lsproc          sys_lsproc// 自己添加的系统调用号码

新的系统调用的名字为 lsproc,这个时候我们已经添加了新的条目,系统调用的函数 名字叫做 sys_lsproc.在linux 内核中,系统调用的函数名称 使用 sys_syscallname 这种格式。这使得我们在浏览内核目录的时候很容易的辨别一个函数是不是系统调用函数。

OK,下一步我们来完成 我们的系统调用函数sys_lsproc,首先我们应该去声明一下函数原型,在 syscall.h中

打开该文件,

sudo vim include/linux/syscalls.h

在最后添加 函数原型:

asmlinkage int sys_lsproc(int num);

asmlinkage是个宏,使用它是为了保持参数在stack中。

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))

asmlinkage大都用在系统调用中。有一些情况下是需要明确的告诉编译器,我们是使用stack来传递参数的,比如X86中的系统调用,是先将参数压入stack以后调用sys_*函数的,所以所有的sys_*函数都有asmlinkage来告诉编译器不要使用寄存器来编译,

OK,下一步我们来定义我们自己的系统调用函数, 进入 kernel 文件夹,

chenhao@chenhao-Rev-1-0:/usr/src/linux-3.9.4/kernel$ sudo vim sys.c

下面这一步:

asmlinkage int sys_lsproc (int num)

{

printk("Hi,I'm Chen Hao . My student No. is SA*****199~");

return 1;

}

OK,下一步重新编译内核安装

linux 3.5.0-23-generic内核版本系统调用数目,Linux操作系统分析(三)- 更新内核与添加系统调用...相关推荐

  1. 安卓与linux内核版本的关系,Linux内核是如何定义版本的?

    我们平时常用到的Linux系统包括CentOS.Ubuntu等,其实这些都是Linux的发行版本,Linux还有一个版本是内核版本. 内核版本的命名规则 在Linux官网(kernel.org)上,我 ...

  2. 如何查看docker的内核版本_查看Linux内核版本的方法有几个?你也是这样操作吗?...

    请关注本头条号,每天坚持更新原创干货技术文章.如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 内核是操作系统的核心组件. 它管理系统的资源,是计算机硬 ...

  3. linux 脚本 $? -ne 0是什么意思,【shell】linux之if [ $? -ne 0 ];-ne 表示 不等于,参考shell中运算符整数比较

    $# 是启动脚本时携带的参数个数 -ne 是不等于 这个语句的意思是"如果shell的启动参数不等于1个" $# 表示提供到shell脚本或者函数的参数总数: $1 表示第一个参数 ...

  4. linux降内核版本_查看linux版本内核 Linux内核版本的变化

    1.major:表示主版本号,有结构性变化时才变更. 2.minor:表示次版本号,新增功能时才发生变化;一般奇数表示测试版,偶数表示生产版. 3.patch:表示对次版本的修订次数或补丁包数. 4. ...

  5. 输出linux内核版本信息,查看linux内核和版本信息

    一.查看Linux内核版本命令(2种方法): 1.cat /proc/version Linux version 3.10.0_1-0-0-8 (root@xxx) (gcc version 4.8. ...

  6. 如何知道linux内核版本,如何查看linux内核版本

    如何得知自己正在使用的linux是什么版本 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux version 2.6.9-22.EL ...

  7. linux 内核版本 4.4,Linux Kernel 4.4 正式发布下载

    Linux Kernel 4.4 正式发布下载,Linux kernel 4.4 是一个 LTS(长期支持版本) 版本,将会提供 1 年的维护和 2 年的支持.暂未找到相关详细说明. 根据来自 Pho ...

  8. Linux安装Mysql8.0.23

    文章目录 简介 一.下载 二.下载完解压到服务器的目录 三.创建用户组和用户 四.编辑my.cnf 五.初始化mysql 六.启动mysql 1. 权限问题以及文件是否存在验证 2. 启动mysql ...

  9. linux内核版本5.3,Linux 5.3-rc1内核kernel-ppa已经推出,用户可用deb安装5.3内核版本...

    当前Linux 5.3内核已经推出了第一个RC版本:Linux 5.3-rc1,同时kernel-ppa已经推出,这意味着使用深度系统.Ubuntu等发行版可用deb软件包来安装Linux 5.3-r ...

最新文章

  1. 独家 | 5大冠军出炉!李开复的AI挑战赛,冠军们聊到了这么些感受
  2. firefox input 缓存
  3. Spring Boot日志集成
  4. 百度 Java 后端三轮面试题,这些你会吗?
  5. 文本分类入门(三)统计学习方法
  6. java语法特点是什么意思_java的语法是什么意思
  7. Oracle 监听(Listener) 中 services 说明
  8. 微型计算机控制理论基础答案,微型计算机控制技术试卷c
  9. 一文弄懂什么是RPC
  10. python课后题答案第一章_python核心编程课后习题解答第一章
  11. Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群
  12. nginx rtmp HLS直播
  13. python序列中各元素之间存在顺序关系_《Python Cookbook(第3版)中文版》——1.10 从序列中移除重复项且保持元素间顺序不变-阿里云开发者社区...
  14. 【PS】制作透明质感按钮
  15. 个人学习C语言的目标
  16. C语言将图片转化成Base64码
  17. Mode首席执行官Paul Dawes:从销售工程师到科技领导者
  18. katacontainers启动分析
  19. Cannot create symlink/symbolic to `xxx': Operation not supported
  20. 企业文档管理难题,云盒子来解决!

热门文章

  1. 【Python】Python简单入门
  2. mysql顺序结构_MySQL学习之流程结构
  3. python 同时遍历两个列表并组成一个字典
  4. Linux安装HDF5及遇到的问题总结
  5. LeetCode 104. Maximum Depth of Binary Tree--二叉树高度--递归或迭代--C++,Python解法
  6. LeetCode 300. Longest Increasing Subsequence--O(n log n)--Java,C++,Python解法
  7. ejs文件与html,将HTMLWebpackPlugin与EJS文件一起使用
  8. es分布式搜索引擎在几十亿数据量级的场景下如何优化查询性能
  9. 你知道那些JVM性能调优
  10. 联想服务器升级微码文件,ThinkPad如何升级硬盘微码程序(适用于SL系列机器)