linux kenrel 笔记

1,gcc –D__KERNEL__ -DMODULE –DLINUX –I /usr/local/src/linux2.4/include -c –o hello.o hello.c
cat /proc/devices
多出了“254 globalvar ”一行
mknod /dev/globalvar c 254 0
用户进程通过/dev/globalvar 这个路径就可以访问到这个全局变量虚拟备了


2,等待队列(wait queue)来实现阻塞操作
static wait_queue_head_t outq;
init_waitqueue_head(&outq);

内核read
 // 等待数据可获得
  if (wait_event_interrupt ible(outq, flag != 0))
  {
    return  - ERESTARTSYS;
  }
内核write
// 通知数据可获得
  wake_up_interruptible(&outq);

应用程序
read(fd, &num, sizeof(int)); // 程序将阻塞在此语句,除非针对 globalvar 的输入

3, poll 和select 用于查询设备的状态,以便用户程序获知是否能对设备进行非阻塞的访问


4, 信号驱动(SIGIO)的异步I/O
结合阻塞与非阻塞访问、poll 函数可以较好地解决设备的读写,但是如果有了异步通知就更方便了。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”地概念,signal(SIGIO, input_handler)


5,  申请与释放IRQ 的API request_irq()free_irq()
Linux 中断分为两个半部:上半部功能是“登记中断”,是不可中断的
下半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断
实现下半部的机制主要有 tasklet 和工作队列
void my_tasklet_func(unsigned long); //定义一个处理函数:
DECLARE_TASKLET(my_tasklet,my_tasklet_func,data); // 定义一个tasklet 结构my_tasklet,与 my_tasklet_func(data) 函数相关
tasklet_schedule(&my_tasklet);

6,  kmalloc和get_free_page 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系:virt_to_phys()可以实现内核虚拟地址转化为物理地址

vmalloc申请的内存则位于 vmalloc_start~vmalloc_end之间,与物理地址没有简单的转换关系

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值