如何实现一个新的linux系统调用

如何实现一个新的linux系统调用,第1张

.三种方法实现Linux系统调用

投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2016-01-03 我要评论

这篇文章主要介绍了三种方法实现Linux系统调用,感兴趣的朋友可以参考一下

..系统调用(System Call)是 *** 作系统为在用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口。当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。下面介绍Linux 下三种发生系统调用的方法:

一、通过 glibc 提供的库函数

glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库。glibc 为程序员提供丰富的 API(Application Programming Interface),除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了 *** 作系统提供的系统服务,即系统调用的封装。那么glibc提供的系统调用API与内核特定的系统调用之间的关系是什么呢?

1.通常情况,每个特定的系统调用对应了至少一个 glibc 封装的库函数,如系统提供的打开文件系统调用 sys_open 对应的是 glibc 中的 open 函数;

2.其次,glibc 一个单独的 API 可能调用多个系统调用,如 glibc 提供的 printf 函数就会调用如 sys_open、sys_mmap、sys_write、sys_close 等等系统调用;

3.另外,多个 API 也可能只对应同一个系统调用,如glibc 下实现的 malloc、calloc、free 等函数用来分配和释放内存,都利用了内核的 sys_brk 的系统调用。

二、使用 syscall 直接调用

使用上面的方法有很多好处,首先你无须知道更多的细节,如 chmod 系统调用号,你只需了解 glibc 提供的 API 的原型;其次,该方法具有更好的移植性,你可以很轻松将该程序移植到其他平台,或者将 glibc 库换成其它库,程序只需做少量改动。

但有点不足是,如果 glibc 没有封装某个内核提供的系统调用时,我就没办法通过上面的方法来调用该系统调用。如我自己通过编译内核增加了一个系统调用,这时 glibc 不可能有你新增系统调用的封装 API,此时我们可以利用 glibc 提供的syscall 函数直接调用。该函数定义在 unistd.h 头文件中。。。三、通过 int 指令陷入

如果我们知道系统调用的整个过程的话,应该就能知道用户态程序通过软中断指令int 0x80 来陷入内核态(在Intel Pentium II 又引入了sysenter指令),参数的传递是通过寄存器,eax 传递的是系统调用号,ebx、ecx、edx、esi和edi 来依次传递最多五个参数,当系统调用返回时,返回值存放在 eax 中。

升级内核:

1.这里我用的内核是linux-2.6.32.59 版本的,首先下载这个内核

2.下载完毕之后拷贝到Linux中进行解压,tar jxvf linux-2.6.32.59.tar

3.进入linux-2.6.32.59 目录把当前内核的配置文件拷贝到当前目录下cp /boot/config-2.6.18-238.e15 。/.config 因为我当前用的内核是linux-2.6.18版本的`

4.在配置视频所需要的驱动 make menuconfig 进入之后找到Device Drivers 按回车进入 找到MultiMedia Support先按空格键进行选中 再按回车键进入找到 Video For Linux 按回车键选中 再按空格键选中 Video capture adapters 将此选项选中之后按回车键进入找到V4L USB devices 按空格键选中再按回车键进入 找到USB ZC0301[P] ImageProcessor and Control Chip support 按空格键选中 再找到《M》GSPCA based webcamsà先按空格键选中再按回车键进入在最后一项的菜单下选中ZC3XX USB Camera Driver

5.以上配置好之后再次回到顶层菜单,找到General setup-à按回车键进入找到[]enable deprecated sysfs features which may confuse old usersp 按空格键选中

6.经过4 ,5 两步骤已经将视频的驱动配置好退出保存

7.下面进行编译 make 此步骤大概需要一个小时左右

8.再次进行 make modules_install

9.再次进行 make install

10.此时查看将摄像头插入USB 再次查看设备文件中是否已经有了 video0 用ls /dev/ 命令查看

11.如果有说明安装成功

下面是将摄像头的内容显示出来

1首先安装SDL库在此下载http://www.libsdl.org/release/SDL-1.2.14.tar.gz

2.进行解压tar zxvf SDL-1.2.15.tar

3.进入目录 cd SDL-1.2.15 再进入 test目录 cd test 在test 目录下配置 。/configure再进行make 则会有许多编译好的程序随便运行一个试试

4.在我上传的资料文件夹中找到servfox-R1_1_3 文件夹进入之后首先将Makefile.i386的名字改为 Makefile ,

5.编译 make

6. 在我上传的资料文件夹中找到spcaview-20061208 文件夹进入之后直接make

7.之后将摄像头插入到USB 接口首先运行servfox-R1_1_3 文件夹中的servfox。/servfox 如果提示出现错误则要把打印的错误语句在spcav4l.c中找到将错误信息删除知道没有错误出现,再次运行。/servfox -g –w 127.0.0.1:7070 –d /dev/video0

8. 再次运行spcaview 。/ spcaview –g –w 127.0.0.1:7070此时应该在你的虚拟机上就会显示摄像头拍出来的视频注意此时的项目支持网络

现在的linux内核中使用kmod来完成设备模块的自动加载,它的一般工作机制是:在第一次引用设备模块时,内核使用系统命令/sbin/modprobe加载这个设备模块。为了使这种机制正常工作,您首先需要使用depmod

-a建立表述模块之间依赖关系的文件modules.dep,然后在/etc/modules.conf中设置正确的设备别名,如果还需要设置设备对应的参数。举例来说,在设置网卡时网卡的驱动程序是ne2k-pci,网卡的设备别名是eth0,则在文件/etc/modules.conf中加入别名alias

eth0

ne2k-pci,就设置了ne2000兼容的pci网卡,这样当有程序要尝试访问网络时,内核会自动加载网卡驱动程序ne2k-pci。

其二是需要根据设备的类型,以及安装的linux系统版本(不同的linux发行版对于同一设备的配置脚本文件存在差异),设置设备对应的配置脚本...现在的linux内核中使用kmod来完成设备模块的自动加载,它的一般工作机制是:在第一次引用设备模块时,内核使用系统命令/sbin/modprobe加载这个设备模块。为了使这种机制正常工作,您首先需要使用depmod

-a建立表述模块之间依赖关系的文件modules.dep,然后在/etc/modules.conf中设置正确的设备别名,如果还需要设置设备对应的参数。举例来说,在设置网卡时网卡的驱动程序是ne2k-pci,网卡的设备别名是eth0,则在文件/etc/modules.conf中加入别名alias

eth0

ne2k-pci,就设置了ne2000兼容的pci网卡,这样当有程序要尝试访问网络时,内核会自动加载网卡驱动程序ne2k-pci。

其二是需要根据设备的类型,以及安装的linux系统版本(不同的linux发行版对于同一设备的配置脚本文件存在差异),设置设备对应的配置脚本文件。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8549432.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存