‘壹’ 在linux中产生一个系统调用以及怎样通过往Linux内核中增加一个新函数从而在该内核
若要在kernel里面新增加一个自己的syscall,大致需要这么几个步骤:
a,新增自己syscall的代码,并修改相应makefile;
b,修改相应头文件,分配自己的系统调用号;
c,系统调用通过中断加查表的方式实现,所以需要在系统调用表里面增加相关的项目,这需要修改相关的汇编源文件;
d,重新编译内核,并写测试程序测试新增的syscall;
注意几点:
1,上述步骤所要修改的文件/位置等对不同处理器架构来说,不尽相同;
2,对于应用层的测试代码来说,在2.6.20版本之前,可以使用相应的_syscallN宏;
但是2.6.20版本后,这些宏已经被从kernel中去掉了,你需要使用应用层的syscall函数
来测试。
你可以在自己的syscall实现文件中加上EXPORT_SYMBOL/EXPORT_SYMBOL_GPL
等宏来导出你的全局变量或者函数,导出后,另外的模块或者其他内核代码就可以使用
这些变量和函数。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
杭州巨立安(JulianTec)是杭州市场上
唯一由资深研发工程师所创办的机构。所以:
就专业程度和实在程度而言,杭州巨立安(JulianTec)
是您在arm架构下学习嵌入式Linux研发的上佳指导!
‘贰’ linux系统中,有哪些系统调用的函数
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的春蠢仔是档猜硬件。而库函数调用则面向的是应用开发的,相当于扒汪应用程序的api...
‘叁’ 如何实现一个新的linux系统调用
若要在 kernel 里面新增加一个自己的 sys call,大致需要这么几个步骤: a,新增自己 sys call 的代码,并修改相应 makefile; b,修改相应头文件,分配自己的系统调用号; c,系统调用通过中断加查表的方式实现,
‘肆’ linux疑问:route 命令查看 Linux 内核路由表 UG是何意
1、下载一个Linux内核源代码文件,将它保存到虚拟机上新安装的系统中去。并解压到/usr/src目录。
‘伍’ 使用mmap(linux系统调用)追加文件内容
如果你想体验Linux系统,我觉得最好的办法是安装了Linux操作系统,再好的园林绿化,仿真工具不能让你真正体验到了Linux的真正威力。一般可以安装Vista系统的配置非常高,可以安装虚拟机软件的Windows平台,虚拟机内安装了Linux系统。在这种情况下,有一个完整的Linux系统(带独立的桌面环境,文件系统,内存空间等,和一台电脑没有区别),而要像在Windows下运行的Windows应用程序,不会将您的Windows产生任何危害。
常见的虚拟机软件Vmware的,现在最新的版本是6.0,很不错,推荐,以及微软的VirtualPC,功能也很不错,但我还没有用完。
‘陆’ linux下系统调用函数read()
open系统调用
open函数的三个参数:
(1)path是已经存在的文件的路径;
(2)oflags参数:若值为 O_RDONLY ,就以只读方式打开文件;
若值为 O_WDONLY,就以只写方式打开文件;
若值为 O_RDWR,就以读写方式打开文件;
(3)参数mode:文件的权限,对于一个已经存在的文件,参数mode是没有用的,通常将其省略,因此这种情况下open调用只需两个参数。
创建新文件:
前面已经说到,当文件不存在时,open会创建一个新文件(仅能是普通文件),我们只需要用 or操作向open的 oflags参数中加入标志O_CREAT即可。这样可以创建一个新的只读文件,但是这没有任何意义,因为所创建的新文件没有任何可读内容。因此一般需要 O_CREAT与 O_WRONLY或 O_RDWR一起使用,此时就需要mode参数了。
例如:
int fd = open("/home/LY/newfile",O_RDWR | O_CREAT,MODE_FILE)
参数mode仅在创建新文件时有效,对于一个已经存在的文件,它没有任何作用。
关于open的flags参数:
除了以上介绍的 open标志外,open还有许多标志,具体的如下表所示:
标志
解释
O_RDONLY
只读方式打开
O_WRONLY
只写方式打开
O_RDWR
读写方式打开
O_APPEND
每次写都追加到文件的尾端
O_CREAT
若文件不存在则创建文件
O_DSYNC
设置同步I/O方式
O_EXCL
如果文件已存在,则出错;必须与O_CREAT一起使用
O_NOCTTY
不将此设备作为控制终端
O_NONBLOCK
不等待命名管道或特殊文件准备好
O_RSYNC
设置同步I/O方式
O_SYNC
设置同步I/O方式
O_TRUNC
将其长度截短为0
write系统调用
write函数的三个参数:
(1)fildes: 文件描述符
(2)buf:指定写入数据的数据缓冲区
(3)nbytes:指定写入的字节数
函数返回值:
成功:已写的字节数
-1 :出错
0:未写入任何数据
例子:
运行结果:
read系统调用
read函数的三个参数:
(1)fildes:文件描述符
(2)buf:指定读入数据的数据缓冲区
(3)nbytes:指定读入的字节数
函数返回值:
成功:已读的字节数
0:未读入任何数据
-1:出错
例子:
运行结果:
close系统调用
通过对 close进行分析,我们会发现close并没有做什么实质工作,它没有刷新任何内核缓冲区,而仅仅是使文件描述符可以重用。