linux kenrel 笔记

来源:互联网 发布:c语言打印字母图形 编辑:程序博客网 时间:2024/05/01 19:30

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之间,与物理地址没有简单的转换关系

原创粉丝点击