使用syscall调用内核提供的接口
时间:2009-03-27 来源:废墟
问题:在使用mknod的时候设备号不能够超过255的限制。
但是在其他系统上可以创建超过255的限制,怀疑是mknod的限制的
使用strace 跟踪
#strace -f mknod 11111 c 255 256
output:
mknod("11111", S_IFCHR|0666, makedev(255, 0)) = 0
确实是限制了,怀疑是c库的问题。
决定使用kernel提供的调用来实现
查看kernel源码 include/linux/syscalls.h能够发现sys开头函数这些函数就是
kernel提供的调用接口,可以看看有可能是意想不到的惊喜哟。我们怎么使用呢 ?
可以使用syscall这个调用来实现。
比如在这里验证可以创建大于255的程序例子
__NR_mknod会被替用为一个int型的值,这个值就是指向kernel调用的编号。
其他的值可以直接参考 /usr/include/asm/unistd.h.
这种调用系统调用的方法可能与老的调用方式有点出入。
但是在其他系统上可以创建超过255的限制,怀疑是mknod的限制的
使用strace 跟踪
#strace -f mknod 11111 c 255 256
output:
mknod("11111", S_IFCHR|0666, makedev(255, 0)) = 0
确实是限制了,怀疑是c库的问题。
决定使用kernel提供的调用来实现
查看kernel源码 include/linux/syscalls.h能够发现sys开头函数这些函数就是
kernel提供的调用接口,可以看看有可能是意想不到的惊喜哟。我们怎么使用呢 ?
可以使用syscall这个调用来实现。
比如在这里验证可以创建大于255的程序例子
#include <linux/unistd.h> |
__NR_mknod会被替用为一个int型的值,这个值就是指向kernel调用的编号。
其他的值可以直接参考 /usr/include/asm/unistd.h.
这种调用系统调用的方法可能与老的调用方式有点出入。
相关阅读 更多 +