如何在kernel空间监听串口?

sukaru 2011-10-11 04:06:01
我要在kernel内监听串口。我尝试如下的代码 结果返回失败

mm_segment_t oldfs;
oldfs = get_fs();
set_fs(KERNEL_DS);
FD_ZERO(&readset);
FD_SET(fd, &readset);
ret = sys_select(pbl.m_hPBLComPortFd+1, &readset, NULL, NULL, NULL);/*这里返回-9 -EBADF*/
set_fs(oldfs);


返回-9是因为在do_select函数里面执行max_select_fd的时候出错了。

int do_select(int n, fd_set_bits *fds, struct timespec *end_time)
{
ktime_t expire, *to = NULL;
struct poll_wqueues table;
poll_table *wait;
int retval, i, timed_out = 0;
unsigned long slack = 0;

rcu_read_lock();
retval = max_select_fd(n, fds); /*这里返回-9 -EBADF*/
rcu_read_unlock();
/*
....
...
*/
}


我调试之后发现出错的地方是下面标出来的地方。

static int max_select_fd(unsigned long n, fd_set_bits *fds)
{
unsigned long *open_fds;
unsigned long set;
int max;
struct fdtable *fdt;

/* handle last in-complete long-word first */
set = ~(~0UL << (n & (__NFDBITS-1)));
n /= __NFDBITS;
fdt = files_fdtable(current->files);
open_fds = fdt->open_fds->fds_bits+n;
max = 0;
if (set) {
set &= BITS(fds, n);
if (set) {
if (!(set & ~*open_fds))
goto get_max;
return -EBADF;/*这里返回的。*/
}
}
while (n) {
open_fds--;
n--;
set = BITS(fds, n);
if (!set)
continue;
if (set & ~*open_fds)
return -EBADF;
if (max)
continue;
get_max:
do {
max++;
set >>= 1;
} while (set);
max += n * __NFDBITS;
}

return max;
}


谁知道原因么?还是kernel space不能用sys_select函数?
...全文
69 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
sukaru 2011-10-11
  • 打赏
  • 举报
回复
没人回答么?

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧