自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 测试排版

序言#include int main(int argc, char* argv[]){ printf("Hello CSDN/n");} 这是正文

2010-01-01 22:20:00 734

原创 IPv4 header 分析

IPv4 数据报的 header 格式如下:下面解释一下每个字段的含义:VersionIP 协议的版本号,4个bit。目前只支持版本4和版本6。由于 IPv4 的 header 格式和 IPv6 的不一样,所以 Version 字段放在 header 的最前面,根据这个值就能知道怎么解释后面的字段。Header Length (IHL)IP header 的长度,包

2009-02-21 19:51:00 6360

原创 Fedora 内核编译指南

从 src RPM 包编译 Fedora 内核,适用于 Fedora 8 及以后版本参考 http://fedoraproject.org/wiki/Docs/CustomKernel以下所有命令都是在非 root 用户下运行准备工作在开始之前,先确保系统已安装下列必要的包:yum-utilsrpmdevtools可通过下面的命令来安装:su -c yum install yum-utils r

2008-12-20 15:32:00 4966

原创 字符设备文件的打开

打开字符设备文件,还是通过 sys_open() 系统调用。在经过一连串的调用后,内核会走到 __dentry_open() 函数。在这个函数中,执行了以下代码片段:f->f_op = fops_get(inode->i_fop);open = f->f_op->open;error = open(inode, f);其中,f 是 struct file 型的指针,open 是一个函数指针。所以这

2008-11-27 21:20:00 1640

原创 字符设备的注册

内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:struct cdev {    struct kobject kobj;          // 每个 cdev 都是一个 kobject    struct module *owner;        // 指向实现驱动的模块    const struct file_operations *ops;    // 操纵这个字符

2008-11-25 22:16:00 979

原创 字符设备编号的注册分配

内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里。该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下:    static struct char_device_struct {        struct char_device_struct *next;    // 指向散列冲突链表中的下一个元素的指针        unsigned

2008-11-24 21:44:00 1381

原创 字符设备文件的创建

一个字符设备文件是通过用户程序 mknod 来创建,mknod 程序依靠同名系统调用 mknod 来完成。在内核的 sys_mknod() 函数中,当根据传入的参数判断出需要创建的节点是设备文件时,会调用 vfs_mknod() 来完成。根据所要创建的节点所在的不同的文件系统,vfs_mknod() 会通过 inode_operations 结构中的函数指针调用每种文件系统上相应的方法。对于 ex

2008-11-22 20:01:00 2878

原创 进程休眠的方法

休眠的步骤将一个进程置于休眠状态,一般步骤如下:0. 定义并初始化(如果还没有的话)一个等待队列头(wait_queue_head_t),这个等待队列头应该是能被要休眠的进程和负责唤醒的进程都能访问到。1. 对进程的每次休眠,定义并初始化一个等待队列(wait_queue_t)2. 把等待队列加入到相应的等待队列头中。3. 把进程状态置为 TASK_INTERRUPTIBLE 或 TASK_UNI

2008-11-09 11:05:00 3421

原创 内核定时器的使用

概要内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 和 kernel/timer.c 文件中。被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则:1) 没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。2) 不能执行休眠(或可能

2008-11-08 11:51:00 4069 2

原创 一个使用 seq_file 接口的 proc_fs 例子

#include #include #include #include static struct proc_dir_entry *pfile;static char *myfruits[5] = {"apple", "orange", "banana", "watermelon", "pear"};static void *my_seq_start(struct seq_file *s, lof

2008-11-02 10:05:00 2010 2

原创 proc_fs 使用说明

创建一个 proc 文件根据对 proc 文件的不同使用,内核提供了多种包装函数来创建一个 proc 文件。方法一:struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent)这是最直接,包装最少的创建方法。参数 name 是要创建的 proc 文件名。m

2008-11-02 09:51:00 11085 1

原创 模块参数使用示例

代码:#include #include     /* Optional, to include module_param() macros */#include     /* Optional, to include prink() prototype */#include         /* Optional, to include module_init() macros */#inclu

2008-10-26 14:53:00 3587

原创 最简单的内核模块编程 -- 一切从这里开始

代码:/* hello.c */#include #include     /* Optional, to include printk() prototype */#include         /* Optional, to include module_init() macros */static int __init hello_init(void){    printk("Hello,

2008-10-26 10:02:00 812

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除