锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品亚洲片夜色在线,在线观看视频日韩,国产精品久久久久久久久搜平片http://m.shnenglu.com/aaxron/category/18045.html璁板綍淇鐨勫嵃璁? zh-cnMon, 24 Mar 2014 19:29:34 GMTMon, 24 Mar 2014 19:29:34 GMT60闊︽牴椹卞姩http://m.shnenglu.com/aaxron/archive/2014/03/21/206265.html澶╀笅澶╀笅Fri, 21 Mar 2014 09:33:00 GMThttp://m.shnenglu.com/aaxron/archive/2014/03/21/206265.htmlhttp://m.shnenglu.com/aaxron/comments/206265.htmlhttp://m.shnenglu.com/aaxron/archive/2014/03/21/206265.html#Feedback0http://m.shnenglu.com/aaxron/comments/commentRss/206265.htmlhttp://m.shnenglu.com/aaxron/services/trackbacks/206265.html#include <linux/types.h>
#include 
<linux/module.h>
#include 
<linux/init.h>
#include 
<linux/poll.h>
#include 
<linux/errno.h>
#include 
<linux/gpio.h>
#include 
<linux/interrupt.h>
#include 
<linux/miscdevice.h>
#include 
<linux/ioport.h>
#include 
<linux/device.h>
#include 
<asm/io.h>
#include 
<asm/irq.h>
#include 
<mach/irqs.h>
#include 
<mach/regs-gpio.h>

#include 
"../ioctl_new.h"

static spinlock_t    wiegand_lock;
static int            wiegand_in = 0;
static int            wiegand_in_cur = 0;
static int            wiegand_in_stime = 0;
static int            wiegand_in1_stime = 0;
static int            wiegand_in2_stime = 0;
static unsigned char wiegand_data[40];
static WIEGAND_TYPE    wiegand_mode;

inline 
void wiegand_delay(int microseconds)
{
    
int i;
    
while (microseconds--)
    {
        
for (i=0; i<65; i++) __asm("NOP");
    }
}

static int wiegand_gettickcount(void)
{
    
static int __start_time = 0//second
    struct timeval tv;

    do_gettimeofday(
&tv);

    
if (__start_time == 0)
        __start_time 
= tv.tv_sec;

    
return ((tv.tv_sec - __start_time) * 1000 + tv.tv_usec / 1000);
}

inline 
void wiegand_minus_interrupt(void)
{
    
if (wiegand_in != WGNSTAT_RECVFULL)
    {
        
if (wiegand_gettickcount() - wiegand_in_stime >= 100)
            wiegand_in_cur 
= 0;
        wiegand_in_stime 
= wiegand_gettickcount();
        wiegand_data[wiegand_in_cur
++= 0;
        
if (wiegand_in_cur >= 34)
            wiegand_in 
= WGNSTAT_RECVFULL;
        
else if (wiegand_in_cur >= 26)
            wiegand_in 
= WGNSTAT_RECV26;
    }
}

inline 
void wiegand_plus_interrupt(void)
{
    
if (wiegand_in != WGNSTAT_RECVFULL)
    {
        
if (wiegand_gettickcount() - wiegand_in_stime >= 100)
            wiegand_in_cur 
= 0;
        wiegand_in_stime 
= wiegand_gettickcount();
        wiegand_data[wiegand_in_cur
++= 1;
        
if (wiegand_in_cur >= 34)
            wiegand_in 
= WGNSTAT_RECVFULL;
        
else if (wiegand_in_cur >= 26)
            wiegand_in 
= WGNSTAT_RECV26;
    }
}

static irqreturn_t wiegand_minus1_interrupt(int irq, void *dev_id)
{
    spin_lock(
&wiegand_lock);
//    printk("wiegand_minus1_interrupt\n");
    if (wiegand_gettickcount() - wiegand_in2_stime > 200)
    {
        wiegand_minus_interrupt();
        wiegand_in1_stime 
= wiegand_in_stime;
    }
    spin_unlock(
&wiegand_lock);
    
return IRQ_HANDLED;
}

static irqreturn_t wiegand_plus1_interrupt(int irq, void *dev_id)
{
    spin_lock(
&wiegand_lock);
//    printk("wiegand_plus1_interrupt\n");
    if (wiegand_gettickcount() - wiegand_in2_stime > 200)
    {
        wiegand_plus_interrupt();
        wiegand_in1_stime 
= wiegand_in_stime;
    }
    spin_unlock(
&wiegand_lock);
    
return IRQ_HANDLED;
}


static int wiegand_open(struct inode * inode, struct file * filp);
static int wiegand_release(struct inode * inode,struct file * filp);
static ssize_t wiegand_read(struct file *flip, char *buf, size_t len, loff_t *pos);
static ssize_t wiegand_write(struct file *flip, const char *buf, size_t len, loff_t *pos);
static long wiegand_ioctl(struct file *file, unsigned int cmd, unsigned long arg);

static struct file_operations wiegand_fops = {
    owner:        THIS_MODULE,
    open:        wiegand_open,
    release:    wiegand_release,
    read:        wiegand_read,
    write:        wiegand_write,
    unlocked_ioctl:        wiegand_ioctl,
};

static struct miscdevice wiegand_dev = {
    WIEGAND_MINOR,
    WIEGAND_MODULE_NAME,
    
&wiegand_fops
};

static void config_wiegand_pins(void)
{
    s3c2410_gpio_cfgpin(WGNIN_0, WGNIN_0_CON);
    s3c2410_gpio_cfgpin(WGNIN_1, WGNIN_1_CON);
    s3c2410_gpio_cfgpin(WGNOUT0, WGNOUT0_CON);
    s3c2410_gpio_cfgpin(WGNOUT1, WGNOUT1_CON);
#if 0
    
if (request_irq(WGNIN_0_IRQ_NUM, &wiegand_minus1_interrupt, 
        IORESOURCE_IRQ 
| IRQF_TRIGGER_RISING, 
        WIEGAND_IRQ_MINUS, 
        
&wiegand_dev)         
        
|| request_irq(WGNIN_1_IRQ_NUM, &wiegand_plus1_interrupt,  
        IORESOURCE_IRQ 
| IRQF_TRIGGER_RISING, 
        WIEGAND_IRQ_PLUS, 
        
&wiegand_dev))
        
    {
        printk(
"WIEGAND request_irq Fail\n");
    }
#endif
}

static int wiegand_open(struct inode * inode, struct file * filp)
{
    config_wiegand_pins();
    
return 0;
}

static int wiegand_release(struct inode * inode,struct file * filp)
{
#if 0
    free_irq(WGNIN_0_IRQ_NUM, 
&wiegand_dev);
    free_irq(WGNIN_1_IRQ_NUM, 
&wiegand_dev);
#endif
    
return 0;
}

static ssize_t wiegand_read(struct file *flip, char *buf, size_t len, loff_t *pos)
{
    
int result;
    spin_lock(
&wiegand_lock);
    
if (wiegand_in == WGNSTAT_NONE || len > sizeof(wiegand_data) || (wiegand_gettickcount() - wiegand_in_stime > 1800))        //500
    {
        wiegand_in 
= WGNSTAT_NONE;
        spin_unlock(
&wiegand_lock);
        
return 0;
    }
    
if (len > wiegand_in_cur)
        len 
= wiegand_in_cur;
    result 
= copy_to_user(buf, wiegand_data, len);
    wiegand_in 
= WGNSTAT_NONE;
    wiegand_in_cur 
= 0;
    spin_unlock(
&wiegand_lock);
    
return len;
}

static ssize_t wiegand_write(struct file *flip, const char *buf, size_t len, loff_t *pos)
{
    
int i;
    
char data[40];

    
if (len > sizeof(data))
        
return 0;

    i 
= copy_from_user(data, buf, len);
    
for (i=0; i<len; i++)
    {
        
if (data[i] == 0)
        {
            WGNOUT0_1; wiegand_delay(wiegand_mode.dwTpw); WGNOUT0_0;
        }
        
else
        {
            WGNOUT1_1; wiegand_delay(wiegand_mode.dwTpw); WGNOUT1_0;
        }
        wiegand_delay(wiegand_mode.dwTpi);
    }

    
return len;
}

static long wiegand_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    
int result = 0;
    spin_lock(
&wiegand_lock);
    
switch(cmd)
    {
    
case WIEGAND_MODE_SET:
        result 
= copy_from_user(&wiegand_mode, (void*)arg, sizeof(WIEGAND_TYPE));
        
break;
    }
    spin_unlock(
&wiegand_lock);
    
return (result == sizeof(WIEGAND_TYPE) ? 0 : -1);
}



static int __init s3c2416_wiegand_init(void)
{
    
int ret = 0;
    
    ret 
= misc_register(&wiegand_dev);
    
if (ret)
    {
        printk(
"probuck s3c2416 WIEGAND Driver" WIEGAND_DRIVER_VERSION "Fail\n");
        
goto exit_sb3kt_wiegand_init;
    }
    spin_lock_init(
&wiegand_lock);

    printk(
"probuck s3c2416 WIEGAND Driver" WIEGAND_DRIVER_VERSION "\n");
    
exit_sb3kt_wiegand_init:
    
return ret;
}

static void __exit s3c2416_wiegand_cleanup(void)
{
    misc_deregister(
&wiegand_dev);
}

module_init(s3c2416_wiegand_init);
module_exit(s3c2416_wiegand_cleanup);
MODULE_LICENSE(
"GPL");

MODULE_DESCRIPTION(
"s3c2416 WIEGAND Driver");
MODULE_SUPPORTED_DEVICE(
"s3c2416 WIEGAND");



澶╀笅 2014-03-21 17:33 鍙戣〃璇勮
]]>
Linux鍐呮牳鐨勫悓姝ユ満鍒?2)淇″彿閲忥紙semaphore錛?/title><link>http://m.shnenglu.com/aaxron/archive/2013/04/12/199387.html</link><dc:creator>澶╀笅</dc:creator><author>澶╀笅</author><pubDate>Fri, 12 Apr 2013 10:22:00 GMT</pubDate><guid>http://m.shnenglu.com/aaxron/archive/2013/04/12/199387.html</guid><wfw:comment>http://m.shnenglu.com/aaxron/comments/199387.html</wfw:comment><comments>http://m.shnenglu.com/aaxron/archive/2013/04/12/199387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/aaxron/comments/commentRss/199387.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/aaxron/services/trackbacks/199387.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Linux鍐呮牳鐨勫悓姝ユ満鍒?2)淇″彿閲忥紙semaphore錛?br /><br />銆銆淇″彿閲忓湪鍒涘緩鏃墮渶瑕佽緗竴涓垵濮嬪鹼紝琛ㄧず鍚屾椂鍙互鏈夊嚑涓換鍔″彲浠ヨ闂淇″彿閲忎繚鎶ょ殑鍏變韓璧勬簮錛屽垵濮嬪間負1灝卞彉鎴愪簰鏂ラ攣錛圡utex錛夛紝鍗沖悓鏃跺彧鑳芥湁涓涓換鍔″彲浠ヨ闂俊鍙烽噺淇濇姢鐨勫叡浜祫婧愩?br /><br />銆銆涓涓換鍔¤鎯寵闂叡浜祫婧愶紝棣栧厛蹇呴』寰楀埌淇″彿閲忥紝鑾峰彇淇″彿閲忕殑鎿嶄綔灝嗘妸淇″彿閲忕殑鍊煎噺1錛岃嫢褰撳墠淇″彿閲忕殑鍊間負璐熸暟錛岃〃鏄庢棤娉曡幏寰椾俊鍙烽噺錛岃浠誨姟蹇呴』鎸傝搗鍦ㄨ淇″彿閲忕殑絳夊緟闃熷垪絳夊緟璇ヤ俊鍙烽噺鍙敤錛涜嫢褰撳墠淇″彿閲忕殑鍊間負闈炶礋鏁幫紝琛ㄧず鍙互鑾峰緱淇″彿閲忥紝鍥犺屽彲浠ョ珛鍒昏闂璇ヤ俊鍙烽噺淇濇姢鐨勫叡浜祫婧愩?br /><br />銆銆褰撲換鍔¤闂畬琚俊鍙烽噺淇濇姢鐨勫叡浜祫婧愬悗錛屽繀欏婚噴鏀句俊鍙烽噺錛岄噴鏀句俊鍙烽噺閫氳繃鎶婁俊鍙烽噺鐨勫煎姞1瀹炵幇錛屽鏋滀俊鍙烽噺鐨勫間負闈炴鏁幫紝琛ㄦ槑鏈変換鍔$瓑寰呭綋鍓嶄俊鍙烽噺錛屽洜姝ゅ畠涔熷敜閱掓墍鏈夌瓑寰呰淇″彿閲忕殑浠誨姟銆?br /><br />淇″彿閲忕殑API鏈夛細<br />DECLARE_MUTEX(name)<br />璇ュ畯澹版槑涓涓俊鍙烽噺name騫跺垵濮嬪寲瀹冪殑鍊間負1錛屽嵆澹版槑涓涓簰鏂ラ攣銆?br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">鍦↙inux2.6.26涓病鎵懼埌璇ュ畯</span><span style="color: #008000; "><br /></span>DECLARE_MUTEX_LOCKED(name)<br />璇ュ畯澹版槑涓涓簰鏂ラ攣name錛屼絾鎶婂畠鐨勫垵濮嬪艱緗負0錛屽嵆閿佸湪鍒涘緩鏃跺氨澶勫湪宸查攣鐘舵併傚洜姝ゅ浜庤繖縐嶉攣錛屼竴鑸槸鍏堥噴鏀懼悗鑾峰緱銆?br /><br /><span style="color: #0000FF; ">void</span> sema_init (<span style="color: #0000FF; ">struct</span> semaphore *sem, <span style="color: #0000FF; ">int</span> val);<br />璇ュ嚱鐢ㄤ簬鏁板垵濮嬪寲璁劇疆淇″彿閲忕殑鍒濆鹼紝瀹冭緗俊鍙烽噺sem鐨勫間負val銆?br /><br /><span style="color: #0000FF; ">void</span> init_MUTEX (<span style="color: #0000FF; ">struct</span> semaphore *sem);<br />璇ュ嚱鏁扮敤浜庡垵濮嬪寲涓涓簰鏂ラ攣錛屽嵆瀹冩妸淇″彿閲弒em鐨勫艱緗負1銆?br /><br /><span style="color: #0000FF; ">void</span> init_MUTEX_LOCKED (<span style="color: #0000FF; ">struct</span> semaphore *sem);<br />璇ュ嚱鏁頒篃鐢ㄤ簬鍒濆鍖栦竴涓簰鏂ラ攣錛屼絾瀹冩妸淇″彿閲弒em鐨勫艱緗負0錛屽嵆涓寮濮嬪氨澶勫湪宸查攣鐘舵併?br /><br /><span style="color: #0000FF; ">void</span> down(<span style="color: #0000FF; ">struct</span> semaphore * sem);<br />璇ュ嚱鏁扮敤浜庤幏寰椾俊鍙烽噺sem錛屽畠浼氬鑷寸潯鐪狅紝鍥犳涓嶈兘鍦ㄤ腑鏂笂涓嬫枃錛堝寘鎷琁RQ涓婁笅鏂囧拰softirq涓婁笅鏂囷級浣跨敤璇ュ嚱鏁般傝鍑芥暟灝嗘妸sem鐨勫煎噺1錛屽鏋滀俊鍙烽噺sem鐨勫奸潪璐燂紝灝辯洿鎺ヨ繑鍥烇紝鍚﹀垯璋冪敤鑰呭皢琚寕璧鳳紝鐩村埌鍒殑浠誨姟閲婃斁璇ヤ俊鍙烽噺鎵嶈兘緇х畫榪愯銆?br /><br /><span style="color: #0000FF; ">int</span> down_interruptible(<span style="color: #0000FF; ">struct</span> semaphore * sem);<br />璇ュ嚱鏁板姛鑳戒笌down綾諱技錛屼笉鍚屼箣澶勪負錛宒own涓嶄細琚俊鍙鳳紙signal錛夋墦鏂紝浣哾own_interruptible鑳借淇″彿鎵撴柇錛屽洜姝よ鍑芥暟鏈夎繑鍥炲兼潵鍖哄垎鏄甯歌繑鍥炶繕鏄淇″彿涓柇錛屽鏋滆繑鍥?錛岃〃紺鴻幏寰椾俊鍙烽噺姝e父榪斿洖錛屽鏋滆淇″彿鎵撴柇錛岃繑鍥?EINTR銆?br /><br /><span style="color: #0000FF; ">int</span> down_trylock(<span style="color: #0000FF; ">struct</span> semaphore * sem);<br />璇ュ嚱鏁拌瘯鐫鑾峰緱淇″彿閲弒em錛屽鏋滆兘澶熺珛鍒昏幏寰楋紝瀹冨氨鑾峰緱璇ヤ俊鍙烽噺騫惰繑鍥?錛屽惁鍒欙紝琛ㄧず涓嶈兘鑾峰緱淇″彿閲弒em錛岃繑鍥炲間負闈?鍊箋傚洜姝わ紝瀹冧笉浼氬鑷磋皟鐢ㄨ呯潯鐪狅紝鍙互鍦ㄤ腑鏂笂涓嬫枃浣跨敤銆?br /><br /><span style="color: #0000FF; ">void</span> up(<span style="color: #0000FF; ">struct</span> semaphore * sem);<br />璇ュ嚱鏁伴噴鏀句俊鍙烽噺sem錛屽嵆鎶妔em鐨勫煎姞1錛屽鏋渟em鐨勫間負闈炴鏁幫紝琛ㄦ槑鏈変換鍔$瓑寰呰淇″彿閲忥紝鍥犳鍞ら啋榪欎簺絳夊緟鑰呫?nbsp;<br /><br />澶存枃浠?<br />#include <linux/semaphore.h><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br /> * Copyright (c) 2008 Intel Corporation<br /> * Author: Matthew Wilcox <willy@linux.intel.com><br /> *<br /> * Distributed under the terms of the GNU GPL, version 2<br /> *<br /> * Please see kernel/semaphore.c for documentation of these functions<br /> </span><span style="color: #008000; ">*/</span><br />#ifndef __LINUX_SEMAPHORE_H<br /><span style="color: #0000FF; ">#define</span> __LINUX_SEMAPHORE_H<br /><br />#include <linux/list.h><br />#include <linux/spinlock.h><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "> Please don't access any members of this structure directly </span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">struct</span> semaphore {<br />    spinlock_t        <span style="color: #0000FF; ">lock</span>;<br />    unsigned <span style="color: #0000FF; ">int</span>        count;<br />    <span style="color: #0000FF; ">struct</span> list_head    wait_list;<br />};<br /><br /><span style="color: #0000FF; ">#define</span> __SEMAPHORE_INITIALIZER(name, n)                \<br />{                                    \<br />    .<span style="color: #0000FF; ">lock</span>        = __SPIN_LOCK_UNLOCKED((name).<span style="color: #0000FF; ">lock</span>),        \<br />    .count        = n,                        \<br />    .wait_list    = LIST_HEAD_INIT((name).wait_list),        \<br />}<br /><br /><span style="color: #0000FF; ">#define</span> __DECLARE_SEMAPHORE_GENERIC(name, count) \<br />    <span style="color: #0000FF; ">struct</span> semaphore name = __SEMAPHORE_INITIALIZER(name, count)<br /><br /><span style="color: #0000FF; ">#define</span> DECLARE_MUTEX(name)    __DECLARE_SEMAPHORE_GENERIC(name, 1)<br /><br /><span style="color: #0000FF; ">static</span> inline <span style="color: #0000FF; ">void</span> sema_init(<span style="color: #0000FF; ">struct</span> semaphore *sem, <span style="color: #0000FF; ">int</span> val)<br />{<br />    <span style="color: #0000FF; ">static</span> <span style="color: #0000FF; ">struct</span> lock_class_key __key;<br />    *sem = (<span style="color: #0000FF; ">struct</span> semaphore) __SEMAPHORE_INITIALIZER(*sem, val);<br />    lockdep_init_map(&sem-><span style="color: #0000FF; ">lock</span>.dep_map, "semaphore->lock", &__key, 0);<br />}<br /><br /><span style="color: #0000FF; ">#define</span> init_MUTEX(sem)        sema_init(sem, 1)<br /><span style="color: #0000FF; ">#define</span> init_MUTEX_LOCKED(sem)    sema_init(sem, 0)<br /><br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">void</span> down(<span style="color: #0000FF; ">struct</span> semaphore *sem);<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">int</span> __must_check down_interruptible(<span style="color: #0000FF; ">struct</span> semaphore *sem);<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">int</span> __must_check down_killable(<span style="color: #0000FF; ">struct</span> semaphore *sem);<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">int</span> __must_check down_trylock(<span style="color: #0000FF; ">struct</span> semaphore *sem);<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">int</span> __must_check down_timeout(<span style="color: #0000FF; ">struct</span> semaphore *sem, <span style="color: #0000FF; ">long</span> jiffies);<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">void</span> up(<span style="color: #0000FF; ">struct</span> semaphore *sem);<br /><br /><span style="color: #0000FF; ">#endif</span> /* __LINUX_SEMAPHORE_H */</div><img src ="http://m.shnenglu.com/aaxron/aggbug/199387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/aaxron/" target="_blank">澶╀笅</a> 2013-04-12 18:22 <a href="http://m.shnenglu.com/aaxron/archive/2013/04/12/199387.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Linux鍐呮牳鐨勫悓姝ユ満鍒?1)鑷棆閿侊紙spinlock錛?/title><link>http://m.shnenglu.com/aaxron/archive/2013/04/12/199386.html</link><dc:creator>澶╀笅</dc:creator><author>澶╀笅</author><pubDate>Fri, 12 Apr 2013 10:21:00 GMT</pubDate><guid>http://m.shnenglu.com/aaxron/archive/2013/04/12/199386.html</guid><wfw:comment>http://m.shnenglu.com/aaxron/comments/199386.html</wfw:comment><comments>http://m.shnenglu.com/aaxron/archive/2013/04/12/199386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/aaxron/comments/commentRss/199386.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/aaxron/services/trackbacks/199386.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Linux鍐呮牳鐨勫悓姝ユ満鍒?1)銆佽嚜鏃嬮攣錛坰pinlock錛?br /><br />銆銆鑷棆閿佷笌浜掓枼閿佹湁鐐圭被浼鹼紝鍙槸鑷棆閿佷笉浼氬紩璧瘋皟鐢ㄨ呯潯鐪狅紝濡傛灉鑷棆閿佸凡緇忚鍒殑鎵ц鍗曞厓淇濇寔錛岃皟鐢ㄨ呭氨涓鐩村驚鐜湪閭i噷鐪嬫槸鍚﹁鑷棆閿佺殑淇濇寔鑰呭凡緇忛噴鏀句簡閿侊紝"鑷棆"涓璇嶅氨鏄洜姝よ屽緱鍚嶃?br /><br />銆銆鐢變簬鑷棆閿佷嬌鐢ㄨ呬竴鑸繚鎸侀攣鏃墮棿闈炲父鐭紝鍥犳閫夋嫨鑷棆鑰屼笉鏄潯鐪犳槸闈炲父蹇呰鐨勶紝鑷棆閿佺殑鏁堢巼榪滈珮浜庝簰鏂ラ攣銆?br /><br />銆銆淇″彿閲忓拰璇誨啓淇″彿閲忛傚悎浜庝繚鎸佹椂闂磋緝闀跨殑鎯呭喌錛屽畠浠細瀵艱嚧璋冪敤鑰呯潯鐪狅紝鍥犳鍙兘鍦ㄨ繘紼嬩笂涓嬫枃浣跨敤錛坃trylock鐨勫彉縐嶈兘澶熷湪涓柇涓婁笅鏂囦嬌鐢級錛岃岃嚜鏃嬮攣閫傚悎浜庝繚鎸佹椂闂撮潪甯哥煭鐨勬儏鍐碉紝瀹冨彲浠ュ湪浠諱綍涓婁笅鏂囦嬌鐢ㄣ?br /><br />銆銆濡傛灉琚繚鎶ょ殑鍏變韓璧勬簮鍙湪榪涚▼涓婁笅鏂囪闂紝浣跨敤淇″彿閲忎繚鎶よ鍏變韓璧勬簮闈炲父鍚堥傦紝濡傛灉瀵瑰叡宸瘋祫婧愮殑璁塊棶鏃墮棿闈炲父鐭紝鑷棆閿佷篃鍙互銆備絾鏄鏋滆淇濇姢鐨勫叡浜祫婧愰渶瑕佸湪涓柇涓婁笅鏂囪闂紙鍖呮嫭搴曞崐閮ㄥ嵆涓柇澶勭悊鍙ユ焺鍜岄《鍗婇儴鍗寵蔣涓柇錛夛紝灝卞繀欏諱嬌鐢ㄨ嚜鏃嬮攣銆?br /><br />銆銆鑷棆閿佷繚鎸佹湡闂存槸鎶㈠崰澶辨晥鐨勶紝鑰屼俊鍙烽噺鍜岃鍐欎俊鍙烽噺淇濇寔鏈熼棿鏄彲浠ヨ鎶㈠崰鐨勩傝嚜鏃嬮攣鍙湁鍦ㄥ唴鏍稿彲鎶㈠崰鎴朣MP鐨勬儏鍐典笅鎵嶇湡姝i渶瑕侊紝鍦ㄥ崟CPU涓斾笉鍙姠鍗犵殑鍐呮牳涓嬶紝鑷棆閿佺殑鎵鏈夋搷浣滈兘鏄┖鎿嶄綔銆?br /><br />銆銆璺熶簰鏂ラ攣涓鏍鳳紝涓涓墽琛屽崟鍏冭鎯寵闂鑷棆閿佷繚鎶ょ殑鍏變韓璧勬簮錛屽繀欏誨厛寰楀埌閿侊紝鍦ㄨ闂畬鍏變韓璧勬簮鍚庯紝蹇呴』閲婃斁閿併傚鏋滃湪鑾峰彇鑷棆閿佹椂錛屾病鏈変換浣曟墽琛屽崟鍏冧繚鎸佽閿侊紝閭d箞灝嗙珛鍗沖緱鍒伴攣錛涘鏋滃湪鑾峰彇鑷棆閿佹椂閿佸凡緇忔湁淇濇寔鑰咃紝閭d箞鑾峰彇閿佹搷浣滃皢鑷棆鍦ㄩ偅閲岋紝鐩村埌璇ヨ嚜鏃嬮攣鐨勪繚鎸佽呴噴鏀句簡閿併?br /><br />銆銆鏃犺鏄簰鏂ラ攣錛岃繕鏄嚜鏃嬮攣錛屽湪浠諱綍鏃跺埢錛屾渶澶氬彧鑳芥湁涓涓繚鎸佽咃紝涔熷氨璇達紝鍦ㄤ換浣曟椂鍒繪渶澶氬彧鑳芥湁涓涓墽琛屽崟鍏冭幏寰楅攣銆?br /><br />鑷棆閿佺殑API鏈夛細<br /><br />spin_lock_init(x)<br />璇ュ畯鐢ㄤ簬鍒濆鍖栬嚜鏃嬮攣x銆傝嚜鏃嬮攣鍦ㄧ湡姝d嬌鐢ㄥ墠蹇呴』鍏堝垵濮嬪寲銆傝瀹忕敤浜庡姩鎬佸垵濮嬪寲銆?br />    <br />DEFINE_SPINLOCK(x)<br />璇ュ畯澹版槑涓涓嚜鏃嬮攣x騫跺垵濮嬪寲瀹冦傝瀹忓湪2.6.11涓涓嬈¤瀹氫箟錛屽湪鍏堝墠鐨勫唴鏍鎬腑騫舵病鏈夎瀹忋?br />    <br />SPIN_LOCK_UNLOCKED<br />璇ュ畯鐢ㄤ簬闈欐佸垵濮嬪寲涓涓嚜鏃嬮攣銆?br /><br />DEFINE_SPINLOCK(x)絳夊悓浜巗pinlock_t x = SPIN_LOCK_UNLOCKED<br />    <br />spin_is_locked(x)<br />璇ュ畯鐢ㄤ簬鍒ゆ柇鑷棆閿亁鏄惁宸茬粡琚煇鎵ц鍗曞厓淇濇寔錛堝嵆琚攣錛夛紝濡傛灉鏄紝榪斿洖鐪燂紝鍚﹀垯榪斿洖鍋囥?br />    <br />spin_unlock_wait(x)<br />璇ュ畯鐢ㄤ簬絳夊緟鑷棆閿亁鍙樺緱娌℃湁琚換浣曟墽琛屽崟鍏冧繚鎸侊紝濡傛灉娌℃湁浠諱綍鎵ц鍗曞厓淇濇寔璇ヨ嚜鏃嬮攣錛岃瀹忕珛鍗寵繑鍥烇紝鍚﹀垯灝嗗驚鐜湪閭i噷錛岀洿鍒拌鑷棆閿佽淇濇寔鑰呴噴鏀俱?br />    <br />spin_trylock(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯灝藉姏鑾峰緱鑷棆閿乴ock錛屽鏋滆兘绔嬪嵆鑾峰緱閿侊紝瀹冭幏寰楅攣騫惰繑鍥炵湡錛屽惁鍒欎笉鑳界珛鍗寵幏寰楅攣錛岀珛鍗寵繑鍥炲亣銆傚畠涓嶄細鑷棆絳夊緟lock琚噴鏀俱?br />    <br />spin_lock(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯鐢ㄤ簬鑾峰緱鑷棆閿乴ock錛屽鏋滆兘澶熺珛鍗寵幏寰楅攣錛屽畠灝遍┈涓婅繑鍥烇紝鍚﹀垯錛屽畠灝嗚嚜鏃嬪湪閭i噷錛岀洿鍒拌鑷棆閿佺殑淇濇寔鑰呴噴鏀撅紝榪欐椂錛屽畠鑾峰緱閿佸茍榪斿洖銆傛諱箣錛屽彧鏈夊畠鑾峰緱閿佹墠榪斿洖銆?br />    <br />spin_lock_irqsave(<span style="color: #0000FF; ">lock</span>, flags)<br />璇ュ畯鑾峰緱鑷棆閿佺殑鍚屾椂鎶婃爣蹇楀瘎瀛樺櫒鐨勫間繚瀛樺埌鍙橀噺flags涓茍澶辨晥鏈湴涓柇銆?br />    <br />spin_lock_irq(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯綾諱技浜巗pin_lock_irqsave錛屽彧鏄瀹忎笉淇濆瓨鏍囧織瀵勫瓨鍣ㄧ殑鍊箋?br />    <br />spin_lock_bh(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯鍦ㄥ緱鍒拌嚜鏃嬮攣鐨勫悓鏃跺け鏁堟湰鍦拌蔣涓柇銆?br />    <br />spin_unlock(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯閲婃斁鑷棆閿乴ock錛屽畠涓巗pin_trylock鎴杝pin_lock閰嶅浣跨敤銆傚鏋渟pin_trylock榪斿洖鍋囷紝琛ㄦ槑娌℃湁鑾峰緱鑷棆閿侊紝鍥犳涓嶅繀浣跨敤spin_unlock閲婃斁銆?br />    <br />spin_unlock_irqrestore(<span style="color: #0000FF; ">lock</span>, flags)<br />璇ュ畯閲婃斁鑷棆閿乴ock鐨勫悓鏃訛紝涔熸仮澶嶆爣蹇楀瘎瀛樺櫒鐨勫間負鍙橀噺flags淇濆瓨鐨勫箋傚畠涓巗pin_lock_irqsave閰嶅浣跨敤銆?br />    <br />spin_unlock_irq(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯閲婃斁鑷棆閿乴ock鐨勫悓鏃訛紝涔熶嬌鑳芥湰鍦頒腑鏂傚畠涓巗pin_lock_irq閰嶅搴旂敤銆?br />    <br />spin_unlock_bh(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯閲婃斁鑷棆閿乴ock鐨勫悓鏃訛紝涔熶嬌鑳芥湰鍦扮殑杞腑鏂傚畠涓巗pin_lock_bh閰嶅浣跨敤銆?br />    <br />spin_trylock_irqsave(<span style="color: #0000FF; ">lock</span>, flags)<br />璇ュ畯濡傛灉鑾峰緱鑷棆閿乴ock錛屽畠涔熷皢淇濆瓨鏍囧織瀵勫瓨鍣ㄧ殑鍊煎埌鍙橀噺flags涓紝騫朵笖澶辨晥鏈湴涓柇錛屽鏋滄病鏈夎幏寰楅攣錛屽畠浠涔堜篃涓嶅仛銆?br />銆銆鍥犳濡傛灉鑳藉绔嬪嵆鑾峰緱閿侊紝瀹冪瓑鍚屼簬spin_lock_irqsave錛屽鏋滀笉鑳借幏寰楅攣錛屽畠絳夊悓浜巗pin_trylock銆傚鏋滆瀹忚幏寰楄嚜鏃嬮攣lock錛岄偅闇瑕佷嬌鐢╯pin_unlock_irqrestore鏉ラ噴鏀俱?br /><br />spin_trylock_irq(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯綾諱技浜巗pin_trylock_irqsave錛屽彧鏄瀹忎笉淇濆瓨鏍囧織瀵勫瓨鍣ㄣ傚鏋滆瀹忚幏寰楄嚜鏃嬮攣lock錛岄渶瑕佷嬌鐢╯pin_unlock_irq鏉ラ噴鏀俱?br />    <br />spin_trylock_bh(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯濡傛灉鑾峰緱浜嗚嚜鏃嬮攣錛屽畠涔熷皢澶辨晥鏈湴杞腑鏂傚鏋滃緱涓嶅埌閿侊紝瀹冧粈涔堜篃涓嶅仛銆傚洜姝わ紝濡傛灉寰楀埌浜嗛攣錛屽畠絳夊悓浜巗pin_lock_bh錛屽鏋滃緱涓嶅埌閿侊紝瀹冪瓑鍚屼簬spin_trylock銆傚鏋滆瀹忓緱鍒頒簡鑷棆閿侊紝闇瑕佷嬌鐢╯pin_unlock_bh鏉ラ噴鏀俱?br /><br />spin_can_lock(<span style="color: #0000FF; ">lock</span>)<br />璇ュ畯鐢ㄤ簬鍒ゆ柇鑷棆閿乴ock鏄惁鑳藉琚攣錛屽畠瀹為檯鏄痵pin_is_locked鍙栧弽銆傚鏋渓ock娌℃湁琚攣錛屽畠榪斿洖鐪燂紝鍚﹀垯錛岃繑鍥炲亣銆傝瀹忓湪2.6.11涓涓嬈¤瀹氫箟錛屽湪鍏堝墠鐨勫唴鏍鎬腑騫舵病鏈夎瀹忋?nbsp;<br /><br />銆銆鑾峰緱鑷棆閿佸拰閲婃斁鑷棆閿佹湁濂藉嚑涓増鏈紝鍥犳璁╄鑰呯煡閬撳湪浠涔堟牱鐨勬儏鍐典笅浣跨敤浠涔堢増鏈殑鑾峰緱鍜岄噴鏀鵑攣鐨勫畯鏄潪甯稿繀瑕佺殑銆?nbsp;<br /><br />銆銆濡傛灉琚繚鎶ょ殑鍏變韓璧勬簮鍙湪榪涚▼涓婁笅鏂囪闂拰杞腑鏂笂涓嬫枃璁塊棶錛岄偅涔堝綋鍦ㄨ繘紼嬩笂涓嬫枃璁塊棶鍏變韓璧勬簮鏃訛紝鍙兘琚蔣涓柇鎵撴柇錛屼粠鑰屽彲鑳借繘鍏ヨ蔣涓柇涓婁笅鏂囨潵瀵硅淇濇姢鐨勫叡浜祫婧愯闂紝鍥犳瀵逛簬榪欑鎯呭喌錛屽鍏變韓璧勬簮鐨勮闂繀欏諱嬌鐢╯pin_lock_bh鍜宻pin_unlock_bh鏉ヤ繚鎶ゃ?nbsp;<br /><br />銆銆褰撶劧浣跨敤spin_lock_irq鍜宻pin_unlock_irq浠ュ強spin_lock_irqsave鍜宻pin_unlock_irqrestore涔熷彲浠ワ紝瀹冧滑澶辨晥浜嗘湰鍦扮‖涓柇錛屽け鏁堢‖涓柇闅愬紡鍦頒篃澶辨晥浜嗚蔣涓柇銆備絾鏄嬌鐢╯pin_lock_bh鍜宻pin_unlock_bh鏄渶鎭板綋鐨勶紝瀹冩瘮鍏朵粬涓や釜蹇?nbsp;<br /><br />銆銆濡傛灉琚繚鎶ょ殑鍏變韓璧勬簮鍙湪榪涚▼涓婁笅鏂囧拰tasklet鎴杢imer涓婁笅鏂囪闂紝閭d箞搴旇浣跨敤涓庝笂闈㈡儏鍐電浉鍚岀殑鑾峰緱鍜岄噴鏀鵑攣鐨勫畯錛屽洜涓簍asklet鍜宼imer鏄敤杞腑鏂疄鐜扮殑銆?nbsp;<br /><br />銆銆濡傛灉琚繚鎶ょ殑鍏變韓璧勬簮鍙湪涓涓猼asklet鎴杢imer涓婁笅鏂囪闂紝閭d箞涓嶉渶瑕佷換浣曡嚜鏃嬮攣淇濇姢錛屽洜涓哄悓涓涓猼asklet鎴杢imer鍙兘鍦ㄤ竴涓狢PU涓婅繍琛岋紝鍗充嬌鏄湪SMP鐜涓嬩篃鏄姝ゃ傚疄闄呬笂tasklet鍦ㄨ皟鐢╰asklet_schedule鏍囪鍏墮渶瑕佽璋冨害鏃跺凡緇忔妸璇asklet緇戝畾鍒板綋鍓岰PU錛屽洜姝ゅ悓涓涓猼asklet鍐充笉鍙兘鍚屾椂鍦ㄥ叾浠朇PU涓婅繍琛屻?nbsp;<br /><br />銆銆timer涔熸槸鍦ㄥ叾琚嬌鐢╝dd_timer娣誨姞鍒皌imer闃熷垪涓椂宸茬粡琚府瀹氬埌褰撳墠CPU錛屾墍浠ュ悓涓涓猼imer緇濅笉鍙兘榪愯鍦ㄥ叾浠朇PU涓娿傚綋鐒跺悓涓涓猼asklet鏈変袱涓疄渚嬪悓鏃惰繍琛屽湪鍚屼竴涓狢PU灝辨洿涓嶅彲鑳戒簡銆?nbsp;<br /><br />銆銆濡傛灉琚繚鎶ょ殑鍏變韓璧勬簮鍙湪涓や釜鎴栧涓猼asklet鎴杢imer涓婁笅鏂囪闂紝閭d箞瀵瑰叡浜祫婧愮殑璁塊棶浠呴渶瑕佺敤spin_lock鍜宻pin_unlock鏉ヤ繚鎶わ紝涓嶅繀浣跨敤_bh鐗堟湰錛屽洜涓哄綋tasklet鎴杢imer榪愯鏃訛紝涓嶅彲鑳芥湁鍏朵粬tasklet鎴杢imer鍦ㄥ綋鍓岰PU涓婅繍琛屻?nbsp;<br /><br />銆銆濡傛灉琚繚鎶ょ殑鍏變韓璧勬簮鍙湪涓涓蔣涓柇錛坱asklet鍜宼imer闄ゅ錛変笂涓嬫枃璁塊棶錛岄偅涔堣繖涓叡浜祫婧愰渶瑕佺敤spin_lock鍜宻pin_unlock鏉ヤ繚鎶わ紝鍥犱負鍚屾牱鐨勮蔣涓柇鍙互鍚屾椂鍦ㄤ笉鍚岀殑CPU涓婅繍琛屻?nbsp;<br /><br />銆銆濡傛灉琚繚鎶ょ殑鍏變韓璧勬簮鍦ㄤ袱涓垨澶氫釜杞腑鏂笂涓嬫枃璁塊棶錛岄偅涔堣繖涓叡浜祫婧愬綋鐒舵洿闇瑕佺敤spin_lock鍜宻pin_unlock鏉ヤ繚鎶わ紝涓嶅悓鐨勮蔣涓柇鑳藉鍚屾椂鍦ㄤ笉鍚岀殑CPU涓婅繍琛屻?nbsp;<br /><br />銆銆濡傛灉琚繚鎶ょ殑鍏變韓璧勬簮鍦ㄨ蔣涓柇錛堝寘鎷瑃asklet鍜宼imer錛夋垨榪涚▼涓婁笅鏂囧拰紜腑鏂笂涓嬫枃璁塊棶錛岄偅涔堝湪杞腑鏂垨榪涚▼涓婁笅鏂囪闂湡闂達紝鍙兘琚‖涓柇鎵撴柇錛屼粠鑰岃繘鍏ョ‖涓柇涓婁笅鏂囧鍏變韓璧勬簮榪涜璁塊棶錛屽洜姝わ紝鍦ㄨ繘紼嬫垨杞腑鏂笂涓嬫枃闇瑕佷嬌鐢╯pin_lock_irq鍜宻pin_unlock_irq鏉ヤ繚鎶ゅ鍏變韓璧勬簮鐨勮闂?nbsp;<br /><br />銆銆鑰屽湪涓柇澶勭悊鍙ユ焺涓嬌鐢ㄤ粈涔堢増鏈紝闇渚濇儏鍐佃屽畾錛屽鏋滃彧鏈変竴涓腑鏂鐞嗗彞鏌勮闂鍏變韓璧勬簮錛岄偅涔堝湪涓柇澶勭悊鍙ユ焺涓粎闇瑕乻pin_lock鍜宻pin_unlock鏉ヤ繚鎶ゅ鍏變韓璧勬簮鐨勮闂氨鍙互浜嗐?nbsp;<br /><br />銆銆鍥犱負鍦ㄦ墽琛屼腑鏂鐞嗗彞鏌勬湡闂達紝涓嶅彲鑳借鍚屼竴CPU涓婄殑杞腑鏂垨榪涚▼鎵撴柇銆備絾鏄鏋滄湁涓嶅悓鐨勪腑鏂鐞嗗彞鏌勮闂鍏變韓璧勬簮錛岄偅涔堥渶瑕佸湪涓柇澶勭悊鍙ユ焺涓嬌鐢╯pin_lock_irq鍜宻pin_unlock_irq鏉ヤ繚鎶ゅ鍏變韓璧勬簮鐨勮闂?nbsp;<br /><br />銆銆鍦ㄤ嬌鐢╯pin_lock_irq鍜宻pin_unlock_irq鐨勬儏鍐典笅錛屽畬鍏ㄥ彲浠ョ敤spin_lock_irqsave鍜宻pin_unlock_irqrestore鍙栦唬錛岄偅鍏蜂綋搴旇浣跨敤鍝竴涓篃闇瑕佷緷鎯呭喌鑰屽畾錛屽鏋滃彲浠ョ‘淇″湪瀵瑰叡浜祫婧愯闂墠涓柇鏄嬌鑳界殑錛岄偅涔堜嬌鐢╯pin_lock_irq鏇村ソ涓浜涖?nbsp;<br /><br />銆銆鍥犱負瀹冩瘮spin_lock_irqsave瑕佸揩涓浜涳紝浣嗘槸濡傛灉浣犱笉鑳界‘瀹氭槸鍚︿腑鏂嬌鑳斤紝閭d箞浣跨敤spin_lock_irqsave鍜宻pin_unlock_irqrestore鏇村ソ錛屽洜涓哄畠灝嗘仮澶嶈闂叡浜祫婧愬墠鐨勪腑鏂爣蹇楄屼笉鏄洿鎺ヤ嬌鑳戒腑鏂?nbsp;<br /><br />銆銆褰撶劧錛屾湁浜涙儏鍐典笅闇瑕佸湪璁塊棶鍏變韓璧勬簮鏃跺繀欏諱腑鏂け鏁堬紝鑰岃闂畬鍚庡繀欏諱腑鏂嬌鑳斤紝榪欐牱鐨勬儏褰嬌鐢╯pin_lock_irq鍜宻pin_unlock_irq鏈濂姐?nbsp;<br /><br />銆銆闇瑕佺壒鍒彁閱掕鑰咃紝spin_lock鐢ㄤ簬闃繪鍦ㄤ笉鍚孋PU涓婄殑鎵ц鍗曞厓瀵瑰叡浜祫婧愮殑鍚屾椂璁塊棶浠ュ強涓嶅悓榪涚▼涓婁笅鏂囦簰鐩告姠鍗犲鑷寸殑瀵瑰叡浜祫婧愮殑闈炲悓姝ヨ闂紝鑰屼腑鏂け鏁堝拰杞腑鏂け鏁堝嵈鏄負浜嗛樆姝㈠湪鍚屼竴CPU涓婅蔣涓柇鎴栦腑鏂鍏變韓璧勬簮鐨勯潪鍚屾璁塊棶銆?nbsp;   <br />銆銆<br /><br />#include <linux/spinlock.h><br /><br />澶存枃浠?<br />#include<linux/spinlock_types.h><br /><br />#ifndef __LINUX_SPINLOCK_TYPES_H<br /><span style="color: #0000FF; ">#define</span> __LINUX_SPINLOCK_TYPES_H<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br /> * include/linux/spinlock_types.h - generic spinlock type definitions<br /> *                                  and initializers<br /> *<br /> * portions Copyright 2005, Red Hat, Inc., Ingo Molnar<br /> * Released under the General Public License (GPL).<br /> </span><span style="color: #008000; ">*/</span><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">瀵圭О澶氬鐞嗗櫒</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">#if</span> defined(CONFIG_SMP)<br />    #include <asm/spinlock_types.h><br /><span style="color: #0000FF; ">#else</span><br />    #include <linux/spinlock_types_up.h><br /><span style="color: #0000FF; ">#endif</span><br /><br />#include <linux/lockdep.h><br /><br />typedef <span style="color: #0000FF; ">struct</span> {<br />    raw_spinlock_t raw_lock;<br />#ifdef CONFIG_GENERIC_LOCKBREAK<br />    unsigned <span style="color: #0000FF; ">int</span> break_lock;<br /><span style="color: #0000FF; ">#endif</span><br />} spinlock_t;<br /><br /><span style="color: #0000FF; ">#define</span> SPINLOCK_MAGIC        0xdead4ead<br /><br />typedef <span style="color: #0000FF; ">struct</span> {<br />    raw_rwlock_t raw_lock;<br />#ifdef CONFIG_GENERIC_LOCKBREAK<br />    unsigned <span style="color: #0000FF; ">int</span> break_lock;<br /><span style="color: #0000FF; ">#endif</span><br />} rwlock_t;<br /><br /><span style="color: #0000FF; ">#define</span> RWLOCK_MAGIC        0xdeaf1eed<br /><br /><span style="color: #0000FF; ">#define</span> SPINLOCK_OWNER_INIT    ((void *)-1L)<br /><br /># define __SPIN_LOCK_UNLOCKED(lockname) \<br />    (spinlock_t)    {    .raw_lock = __RAW_SPIN_LOCK_UNLOCKED,    \<br />                SPIN_DEP_MAP_INIT(lockname) }<br /><span style="color: #0000FF; ">#define</span> __RW_LOCK_UNLOCKED(lockname) \<br />    (rwlock_t)    {    .raw_lock = __RAW_RW_LOCK_UNLOCKED,    \<br />                RW_DEP_MAP_INIT(lockname) }<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br /> * SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED defeat lockdep state tracking and<br /> * are hence deprecated.<br /> * Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or<br /> * __SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate.<br /> </span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span> SPIN_LOCK_UNLOCKED    __SPIN_LOCK_UNLOCKED(old_style_spin_init)<br /><span style="color: #0000FF; ">#define</span> RW_LOCK_UNLOCKED    __RW_LOCK_UNLOCKED(old_style_rw_init)<br /><br /><span style="color: #0000FF; ">#define</span> DEFINE_SPINLOCK(x)    spinlock_t x = __SPIN_LOCK_UNLOCKED(x)<br /><span style="color: #0000FF; ">#define</span> DEFINE_RWLOCK(x)    rwlock_t x = __RW_LOCK_UNLOCKED(x)<br /><br /><span style="color: #0000FF; ">#endif</span> /* __LINUX_SPINLOCK_TYPES_H */<br />銆銆</div><img src ="http://m.shnenglu.com/aaxron/aggbug/199386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/aaxron/" target="_blank">澶╀笅</a> 2013-04-12 18:21 <a href="http://m.shnenglu.com/aaxron/archive/2013/04/12/199386.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>[鍘焆linux涓柇澶勭悊(2)涓嬪崐閮ㄦ満鍒?tasklethttp://m.shnenglu.com/aaxron/archive/2013/04/10/199306.html澶╀笅澶╀笅Wed, 10 Apr 2013 07:29:00 GMThttp://m.shnenglu.com/aaxron/archive/2013/04/10/199306.htmlhttp://m.shnenglu.com/aaxron/comments/199306.htmlhttp://m.shnenglu.com/aaxron/archive/2013/04/10/199306.html#Feedback0http://m.shnenglu.com/aaxron/comments/commentRss/199306.htmlhttp://m.shnenglu.com/aaxron/services/trackbacks/199306.html[鍘焆linux涓柇澶勭悊(2)涓嬪崐閮ㄦ満鍒?tasklet
1.softirq 
閫傜敤浜庢ц兘鏁忔劅鐨勫瓙緋葷粺

2.tasklet
寤虹珛鍦╯oftirq涔嬩笂,浣跨敤鏇寸畝鍗?br />softirq鐨勪笉鍚屽疄渚嬪彲榪愯鍦ㄤ笉鍚岀殑澶勭悊鍣ㄤ笂,鑰宼asklet鍒欎笉鍏佽
蹇呴』浣跨敤define DECLARE_TASKLET 澹版槑tasklet
#define DECLARE_TASKLET(name, func, data) \
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }

void short_do_tasklet(unsigned long);
DECLARE_TASKLET(short_do_tasklet,short_tasklet,0);

3. 宸ヤ綔闃熷垪(work queue)
struct work_struct my_work;      //瀹氫箟涓涓伐浣滈槦鍒?/span>
void my_work_func(unsigned long); //瀹氫箟涓涓鐞嗗嚱鏁?/span>



澶存枃浠?br />#include <linux/interrupt.h>
/* Tasklets --- multithreaded analogue of BHs.

Main feature differing them of generic softirqs: tasklet
is running only on one CPU simultaneously.

Main feature differing them of BHs: different tasklets
may be run simultaneously on different CPUs.

Properties:
* If tasklet_schedule() is called, then tasklet is guaranteed
to be executed on some cpu at least once after this.
* If the tasklet is already scheduled, but its excecution is still not
started, it will be executed only once.
* If this tasklet is already running on another CPU (or schedule is called
from tasklet itself), it is rescheduled for later.
* Tasklet is strictly serialized wrt itself, but not
wrt another tasklets. If client needs some intertask synchronization,
he makes it with spinlocks.
*/

struct tasklet_struct
{
    struct tasklet_struct *next;
    unsigned long state;
    atomic_t count;
    void (*func)(unsigned long);
    unsigned long data;
};

#define DECLARE_TASKLET(name, func, data) \
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }


浣跨敤紺轟緥:
static atomic_t fpstatues;
static atomic_t has_image = {0};

static void gc0303_vsync_do_tasklet(ulong data)
{
    ulong curr = gettickcount();
    debug("curr:%lu",curr);

    if (atomic_read(&fpstatues)==0)
    {
        s3c2410_dma_ctrl(DMACH_XD0, S3C2410_DMAOP_FLUSH);
        gc0303_dma_buf.dma_addr = img_phys;
        gc0303_dma_buf.size = bmp_w*bmp_h;
        s3c2410_dma_enqueue(DMACH_XD0, 
            (void *)&gc0303_dma_buf, 
            gc0303_dma_buf.dma_addr, 
            gc0303_dma_buf.size);
        atomic_set(&fpstatues,1);
    }
}

DECLARE_TASKLET(gc0303_vsync_tasklet,gc0303_vsync_do_tasklet,0);

static irqreturn_t gc0303_vsync_handler(int irq,void* dev_id)
{
    if (atomic_read(&fpstatues)==1)
    {
        s3c2410_dma_ctrl(DMACH_XD0, S3C2410_DMAOP_START);
    }
    //璋冨害gc0303_vsync_tasklet
    tasklet_schedule(&gc0303_vsync_tasklet);
    return IRQ_HANDLED;
}






tasklet鏄綔涓轟腑鏂笅鍗婇儴鐨勪竴涓緢濂界殑閫夋嫨錛屽畠鍦ㄦц兘鍜屾槗鐢ㄦт箣闂存湁鐫寰堝ソ鐨勫鉤琛°傝緝涔嬩簬softirq錛宼asklet涓嶉渶瑕佽冭檻SMP涓嬬殑騫惰闂錛岃屽張姣攚orkqueues鏈夌潃鏇村ソ鐨勬ц兘銆?br />tasklet閫氬父浣滀負紜腑鏂殑涓嬪崐閮ㄦ潵浣跨敤錛屽湪紜腑鏂腑璋冪敤tasklet_schedule(t)銆傛瘡嬈$‖涓柇閮戒細瑙﹀彂涓嬈asklet_schedule(t)錛屼絾鏄瘡嬈′腑鏂畠鍙細鍚戝叾涓殑涓涓狢PU娉ㄥ唽錛岃屼笉鏄墍鏈夌殑CPU銆傚畬鎴愭敞鍐屽悗鐨則asklet鐢眛asklet_action()鏉ユ墽琛岋紝鍦⊿MP鐜涓嬶紝瀹冧繚璇佸悓涓鏃跺埢錛屽悓涓涓猼asklet鍙湁涓涓壇鏈湪榪愯錛岃繖鏍峰氨閬垮厤浜嗕嬌鐢╯oftirq鎵瑕佽冭檻鐨勪簰鏂ョ殑闂銆傚啀鑰咃紝tasklet鍦ㄦ墽琛宼asklet->func()鍓嶏紝鍐嶄竴嬈″厑璁竧asklet鍙皟搴︼紙娉ㄥ唽錛夛紝浣嗘槸鍦ㄨtasklet宸叉湁涓涓壇鏈湪鍏朵粬CPU涓婅繍琛岀殑鎯呭喌涓嬶紝瀹冨彧鑳介鍚庢墽琛屻傛諱箣錛屽悓涓涓‖涓柇寮曡搗鐨勪竴涓猼asklet_schedule()鍔ㄤ綔鍙細浣夸竴涓猼asklet琚敞鍐岋紝鑰屼笉鍚屼腑鏂紩璧風殑tasklet鍒欏彲鑳藉湪涓嶅悓鐨勬椂鍒昏娉ㄥ唽鑰屽嬈¤鎵ц銆?br />
tasklet鐨勪簰鏂ャ傜敱浜庡悓涓涓猼asklet涓嶈兘鏈夊涓壇鏈悓鏃惰繍琛岋紝鎵浠ヤ笉闇瑕佸湪澶欳PU涔嬮棿浜掓枼銆傚湪tasklet榪愯鐨勮繃紼嬩腑錛屽畠浼氳紜腑鏂墦鏂紙榪欎篃鏄蔣涓柇鐨勪紭鐐癸級錛屾墍浠ュ鏋渢asklet鍜屽叾浠栦腑鏂箣闂寸殑浜掓枼鏈夊彲鑳藉瓨鍦ㄣ?br />涓柇鏈嶅姟紼嬪簭涓鑸兘鏄湪涓柇璇鋒眰鍏抽棴鐨勬潯浠朵笅鎵ц鐨?浠ラ伩鍏嶅祵濂楄屼嬌涓柇鎺у埗澶嶆潅鍖栥備絾鏄紝涓柇鏄竴涓殢鏈轟簨浠訛紝瀹冮殢鏃朵細鍒版潵錛屽鏋滃叧涓柇鐨勬椂闂村お闀匡紝CPU灝變笉鑳藉強鏃跺搷搴斿叾浠栫殑涓柇璇鋒眰錛屼粠鑰岄犳垚涓柇鐨勪涪澶便傚洜姝わ紝Linux鍐呮牳鐨勭洰鏍囧氨鏄敖鍙兘蹇殑澶勭悊瀹屼腑鏂姹傦紝灝藉叾鎵鑳芥妸鏇村鐨勫鐞嗗悜鍚庢帹榪熴備緥濡傦紝鍋囪涓涓暟鎹潡宸茬粡杈懼埌浜嗙綉綰匡紝褰撲腑鏂帶鍒跺櫒鎺ュ彈鍒拌繖涓腑鏂姹備俊鍙鋒椂錛孡inux鍐呮牳鍙槸綆鍗曞湴鏍囧織鏁版嵁鍒版潵浜嗭紝鐒跺悗璁╁鐞嗗櫒鎭㈠鍒板畠浠ュ墠榪愯鐨勭姸鎬侊紝鍏朵綑鐨勫鐞嗙◢鍚庡啀榪涜錛堝鎶婃暟鎹Щ鍏ヤ竴涓紦鍐插尯錛屾帴鍙楁暟鎹殑榪涚▼灝卞彲浠ュ湪緙撳啿鍖烘壘鍒版暟鎹級銆傚洜姝わ紝鍐呮牳鎶婁腑鏂鐞嗗垎涓轟袱閮ㄥ垎錛氫笂鍗婇儴錛坱ophalf錛夊拰涓嬪崐閮紙bottomhalf錛夛紝涓婂崐閮紙灝辨槸涓柇鏈嶅姟紼嬪簭錛夊唴鏍哥珛鍗蟲墽琛岋紝鑰屼笅鍗婇儴錛堝氨鏄竴浜涘唴鏍稿嚱鏁幫級鐣欑潃紼嶅悗澶勭悊錛?br />
棣栧厛錛屼竴涓揩閫熺殑“涓婂崐閮?#8221;鏉ュ鐞嗙‖浠跺彂鍑虹殑璇鋒眰錛屽畠蹇呴』鍦ㄤ竴涓柊鐨勪腑鏂駭鐢熶箣鍓嶇粓姝€傞氬父錛岄櫎浜嗗湪璁懼鍜屼竴浜涘唴瀛樼紦鍐插尯錛堝鏋滀綘鐨勮澶囩敤鍒頒簡DMA錛屽氨涓嶆榪欎簺錛変箣闂寸Щ鍔ㄦ垨浼犻佹暟鎹紝紜畾紜歡鏄惁澶勪簬鍋ュ叏鐨勭姸鎬佷箣澶栵紝榪欎竴閮ㄥ垎鍋氱殑宸ヤ綔寰堝皯銆?br />
涓嬪崐閮ㄨ繍琛屾椂鏄厑璁鎬腑鏂姹傜殑錛岃屼笂鍗婇儴榪愯鏃舵槸鍏充腑鏂殑錛岃繖鏄簩鑰呬箣闂寸殑涓昏鍖哄埆銆?br />
浣嗘槸錛屽唴鏍稿埌搴曚粈鏃跺欐墽琛屼笅鍗婇儴錛屼互浣曠鏂瑰紡緇勭粐涓嬪崐閮紵榪欏氨鏄垜浠璁ㄨ鐨勪笅鍗婇儴瀹炵幇鏈哄埗錛岃繖縐嶆満鍒跺湪鍐呮牳鐨勬紨鍙樿繃紼嬩腑涓嶆柇寰楀埌鏀硅繘錛屽湪浠ュ墠鐨勫唴鏍鎬腑錛岃繖涓満鍒跺彨鍋歜ottomhalf(綆縐癰h)錛屽湪2.4浠ュ悗鐨勭増鏈腑鏈変簡鏂扮殑鍙戝睍鍜屾敼榪涳紝鏀硅繘鐨勭洰鏍囦嬌涓嬪崐閮ㄥ彲浠ュ湪澶氬鐞嗘満涓婂茍琛屾墽琛岋紝騫舵湁鍔╀簬椹卞姩紼嬪簭鐨勫紑鍙戣呰繘琛岄┍鍔ㄧ▼搴忕殑寮鍙戙備笅闈富瑕佷粙緇嶅父鐢ㄧ殑灝忎換鍔?Tasklet)鏈哄埗鍙?.6鍐呮牳涓殑宸ヤ綔闃熷垪鏈哄埗銆?br />
榪欓噷鐨勫皬浠誨姟鏄寚瀵硅鎺ㄨ繜鎵ц鐨勫嚱鏁拌繘琛岀粍緇囩殑涓縐嶆満鍒躲傚叾鏁版嵁緇撴瀯涓簍asklet_struct錛屾瘡涓粨鏋勪唬琛ㄤ竴涓嫭绔嬬殑灝忎換鍔★紝鍏跺畾涔夊涓嬶細
structtasklet_struct {
    structtasklet_struct *next;         /*鎸囧悜閾捐〃涓殑涓嬩竴涓粨鏋?/span>*/
    unsignedlong state;                 /* 灝忎換鍔$殑鐘舵?/span>*/
    atomic_t count;                        /* 寮曠敤璁℃暟鍣?/span>*/
    void(*func) (unsigned long);        /* 瑕佽皟鐢ㄧ殑鍑芥暟*/
    unsignedlong data;                  /* 浼犻掔粰鍑芥暟鐨勫弬鏁?/span>*/
}錛?br />緇撴瀯涓殑func鍩熷氨鏄笅鍗婇儴涓鎺ㄨ繜鎵ц鐨勫嚱鏁幫紝data鏄畠鍞竴鐨勫弬鏁般?br />state鍩熺殑鍙栧間負TASKLET_STATE_SCHED鎴朤ASKLET_STATE_RUN銆俆ASKLET_STATE_SCHED琛ㄧず灝忎換鍔″凡琚皟搴︼紝姝e噯澶囨姇鍏ヨ繍琛岋紝TASKLET_STATE_RUN琛ㄧず灝忎換鍔℃鍦ㄨ繍琛屻俆ASKLET_STATE_RUN鍙湁鍦ㄥ澶勭悊鍣ㄧ郴緇熶笂鎵嶄嬌鐢紝鍗曞鐞嗗櫒緋葷粺浠涔堟椂鍊欓兘娓呮涓涓皬浠誨姟鏄笉鏄鍦ㄨ繍琛岋紙瀹冭涔堝氨鏄綋鍓嶆鍦ㄦ墽琛岀殑浠g爜錛岃涔堜笉鏄級銆?br />count 鍩熸槸灝忎換鍔$殑寮曠敤璁℃暟鍣ㄣ傚鏋滃畠涓嶄負0錛屽垯灝忎換鍔¤紱佹錛屼笉鍏佽鎵ц錛涘彧鏈夊綋瀹冧負闆訛紝灝忎換鍔℃墠琚縺媧伙紝騫朵笖鍦ㄨ璁劇疆涓烘寕璧鋒椂錛屽皬浠誨姟鎵嶈兘澶熸墽琛屻?br />1. 澹版槑鍜屼嬌鐢ㄥ皬浠誨姟澶у鏁版儏鍐典笅錛屼負浜嗘帶鍒朵竴涓甯哥殑紜歡璁懼錛屽皬浠誨姟鏈哄埗鏄疄鐜頒笅鍗婇儴鐨勬渶浣抽夋嫨銆傚皬浠誨姟鍙互鍔ㄦ佸垱寤猴紝浣跨敤鏂逛究錛屾墽琛岃搗鏉ヤ篃姣旇緝蹇?br />鎴戜滑鏃㈠彲浠ラ潤鎬佸湴鍒涘緩灝忎換鍔★紝涔熷彲浠ュ姩鎬佸湴鍒涘緩瀹冦傞夋嫨閭g鏂瑰紡鍙栧喅浜庡埌搴曟槸鎯寵瀵瑰皬浠誨姟榪涜鐩存帴寮曠敤榪樻槸涓涓棿鎺ュ紩鐢ㄣ傚鏋滃噯澶囬潤鎬佸湴鍒涘緩涓涓皬浠誨姟錛堜篃灝辨槸瀵瑰畠鐩存帴寮曠敤錛夛紝浣跨敤涓嬮潰涓や釜瀹忎腑鐨勪竴涓細
DECLARE_TASKLET(name,func, data)
DECLARE_TASKLET_DISABLED(name,func, data)
榪欎袱涓畯閮借兘鏍規嵁緇欏畾鐨勫悕瀛楅潤鎬佸湴鍒涘緩涓涓猼asklet_struct緇撴瀯銆傚綋璇ュ皬浠誨姟琚皟搴︿互鍚庯紝緇欏畾鐨勫嚱鏁癴unc浼氳鎵ц錛屽畠鐨勫弬鏁扮敱data緇欏嚭銆傝繖涓や釜瀹忎箣闂寸殑鍖哄埆鍦ㄤ簬寮曠敤璁℃暟鍣ㄧ殑鍒濆鍊艱緗笉鍚屻傜涓涓畯鎶婂垱寤虹殑灝忎換鍔$殑寮曠敤璁℃暟鍣ㄨ緗負0錛屽洜姝わ紝璇ュ皬浠誨姟澶勪簬嬋媧葷姸鎬併傚彟涓涓妸寮曠敤璁℃暟鍣ㄨ緗負1錛屾墍浠ヨ灝忎換鍔″浜庣姝㈢姸鎬併備緥濡傦細
DECLARE_TASKLET(my_tasklet,my_tasklet_handler, dev);
榪欒浠g爜鍏跺疄絳変環浜?br />struct tasklet_struct my_tasklet = { NULL, 0, ATOMIC_INIT(0),tasklet_handler,dev};
榪欐牱灝卞垱寤轟簡涓涓悕涓簃y_tasklet鐨勫皬浠誨姟錛屽叾澶勭悊紼嬪簭涓簍asklet_handler錛屽茍涓斿凡琚縺媧匯傚綋澶勭悊紼嬪簭琚皟鐢ㄧ殑鏃跺欙紝dev灝變細琚紶閫掔粰瀹冦?br />2.  緙栧啓鑷繁鐨勫皬浠誨姟澶勭悊紼嬪簭灝忎換鍔″鐞嗙▼搴忓繀欏葷鍚堝涓嬬殑鍑芥暟綾誨瀷錛?br />void tasklet_handler(unsigned long data)
鐢變簬灝忎換鍔′笉鑳界潯鐪狅紝鍥犳涓嶈兘鍦ㄥ皬浠誨姟涓嬌鐢ㄤ俊鍙烽噺鎴栬呭叾瀹冧駭鐢熼樆濉炵殑鍑芥暟銆備絾鏄皬浠誨姟榪愯鏃跺彲浠ュ搷搴斾腑鏂?br />3. 璋冨害鑷繁鐨勫皬浠誨姟閫氳繃璋冪敤tasklet_schedule()鍑芥暟騫朵紶閫掔粰瀹冪浉搴旂殑tasklt_struct鎸囬拡錛岃灝忎換鍔″氨浼氳璋冨害浠ヤ究閫傚綋鐨勬椂鍊欐墽琛岋細
tasklet_schedule(&my_tasklet);        /*鎶妋y_tasklet鏍囪涓烘寕璧?nbsp;*/
鍦ㄥ皬浠誨姟琚皟搴︿互鍚庯紝鍙鏈夋満浼氬畠灝變細灝藉彲鑳芥棭鐨勮繍琛屻傚湪瀹冭繕娌℃湁寰楀埌榪愯鏈轟細涔嬪墠錛屽鏋滀竴涓浉鍚岀殑灝忎換鍔″張琚皟搴︿簡錛岄偅涔堝畠浠嶇劧鍙細榪愯涓嬈°?br />鍙互璋冪敤tasklet_disable()鍑芥暟鏉ョ姝㈡煇涓寚瀹氱殑灝忎換鍔°傚鏋滆灝忎換鍔″綋鍓嶆鍦ㄦ墽琛岋紝榪欎釜鍑芥暟浼氱瓑鍒板畠鎵ц瀹屾瘯鍐嶈繑鍥炪傝皟鐢╰asklet_enable()鍑芥暟鍙互嬋媧諱竴涓皬浠誨姟錛屽鏋滃笇鏈涙妸浠ECLARE_TASKLET_DISABLED錛堬級鍒涘緩鐨勫皬浠誨姟嬋媧伙紝涔熷緱璋冪敤榪欎釜鍑芥暟錛屽錛?br />tasklet_disable(&my_tasklet);        /*灝忎換鍔$幇鍦ㄨ紱佹,榪欎釜灝忎換鍔′笉鑳借繍琛?/span>*/
tasklet_enable(&my_tasklet);        /*  灝忎換鍔$幇鍦ㄨ嬋媧?/span>*/
涔熷彲浠ヨ皟鐢╰asklet_kill()鍑芥暟浠庢寕璧風殑闃熷垪涓幓鎺変竴涓皬浠誨姟銆傝鍑芥暟鐨勫弬鏁版槸涓涓寚鍚戞煇涓皬浠誨姟鐨則asklet_struct鐨勯暱鎸囬拡銆傚湪灝忎換鍔¢噸鏂拌皟搴﹀畠鑷韓鐨勬椂鍊欙紝浠庢寕璧風殑闃熷垪涓Щ鍘誨凡璋冨害鐨勫皬浠誨姟浼氬緢鏈夌敤銆傝繖涓嚱鏁伴鍏堢瓑寰呰灝忎換鍔℃墽琛屽畬姣曪紝鐒跺悗鍐嶅皢瀹冪Щ鍘匯?br />4.tasklet鐨勭畝鍗曠敤娉?br />涓嬮潰鏄痶asklet鐨勪竴涓畝鍗曞簲鐢?浠ユā鍧楃殑褰㈡垚鍔犺澆銆?br />
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>

static struct tasklet_struct my_tasklet;

static void tasklet_handler (unsigned long d ata)
{
    printk("tasklet_handler is running.\n");
}

static int __init test_init(void)
{
    tasklet_init(&my_tasklet,tasklet_handler,0);
    tasklet_schedule(&my_tasklet);
    return0;
}

static  void __exit test_exit(void)
{
    tasklet_kill(&tasklet);
    printk("test_exit is running.\n");
}
MODULE_LICENSE("GPL");
module_init(test_init);
module_exit(test_exit);

浠庤繖涓緥瀛愬彲浠ョ湅鍑猴紝鎵璋撶殑灝忎換鍔℃満鍒舵槸涓轟笅鍗婇儴鍑芥暟鐨勬墽琛屾彁渚涗簡涓縐嶆墽琛屾満鍒訛紝涔熷氨鏄錛屾帹榪熷鐞嗙殑浜嬫儏鏄敱tasklet_handler瀹炵幇錛屼綍鏃舵墽琛岋紝緇忕敱灝忎換鍔℃満鍒跺皝瑁呭悗浜ょ粰鍐呮牳鍘誨鐞嗐?/div>

澶╀笅 2013-04-10 15:29 鍙戣〃璇勮
]]>
[鍘焆linux涓柇澶勭悊(1)涓婂崐閮ㄦ満鍒?/title><link>http://m.shnenglu.com/aaxron/archive/2013/04/03/199066.html</link><dc:creator>澶╀笅</dc:creator><author>澶╀笅</author><pubDate>Wed, 03 Apr 2013 03:54:00 GMT</pubDate><guid>http://m.shnenglu.com/aaxron/archive/2013/04/03/199066.html</guid><wfw:comment>http://m.shnenglu.com/aaxron/comments/199066.html</wfw:comment><comments>http://m.shnenglu.com/aaxron/archive/2013/04/03/199066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/aaxron/comments/commentRss/199066.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/aaxron/services/trackbacks/199066.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->linux涓柇澶勭悊(1)涓婂崐閮ㄦ満鍒?br />搴旂敤紼嬪簭閫氳繃/dev/鐩綍涓殑璁懼緇撶偣鎿嶄綔璁懼,閫氳繃/sys鐩綍涓殑鏀墮泦璁懼淇℃伅.<br />鏌ョ湅涓柇:<br />cat /proc/interrupts<br /><br />鏌ョ湅涓柇緇熻:<br />cat /proc/stat<br /><br />1銆佸ご鏂囦歡 <br />#include <linux/interrupt.h><br />#include <asm/arch/irqs.h><br />2銆佺敵鏄庝腑鏂鐞嗙▼搴?nbsp;<br /><span style="color: #0000FF; ">static</span> spinlock_t    wiegand_lock;  <span style="color: #008000; ">//</span><span style="color: #008000; "> 浣跨敤涔嬪墠蹇呴』鍒濆鍖?spin_lock_init(&wiegand_lock);</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">static</span> irqreturn_t wiegand_minus1_interrupt(<span style="color: #0000FF; ">int</span> irq, <span style="color: #0000FF; ">void</span> *dev_id)<br />{<br />    spin_lock(&wiegand_lock);<br />    <span style="color: #008000; ">//</span><span style="color: #008000; ">do something <br />    </span><span style="color: #008000; ">//</span><span style="color: #008000; ">wiegand_minus_interrupt();</span><span style="color: #008000; "><br /></span>    spin_unlock(&wiegand_lock);<br />    <span style="color: #0000FF; ">return</span> IRQ_HANDLED;<br />}<br /><br />3.娉ㄥ唽涓柇 request_irq()<br />2.6 鍐呮牳 鍑芥暟鍘熷瀷濡備笅錛?br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">int</span> __must_check request_irq(unsigned <span style="color: #0000FF; ">int</span> irq, irq_handler_t handler, unsigned <span style="color: #0000FF; ">long</span> flags, <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">char</span> *name, <span style="color: #0000FF; ">void</span> *dev_id); <br />絎?涓弬鏁?涓柇鍙?鏄鐢寵鐨勪腑鏂彿<br />絎?涓弬鏁?涓柇澶勭悊鍑芥暟     <br /><br />絎?涓弬鏁?涓柇瑙﹀彂鏍囧織<br />    IRQF_DISABLED         蹇腑鏂?紱佹鍏朵粬涓柇)<br />    IRQF_TRIGGER_RISING    璁懼鍦ㄤ腑鏂嚎涓婁駭鐢熶竴涓笂鍗囨部鏃?鍙戝嚭涓柇.(璇存槑鍦ㄤ腑鏂箣鍓?璁懼涓鐩村皢涓柇綰夸繚鎸佸湪涓涓數騫充笂)<br />    IRQF_TRIGGER_FALLING    涓嬮檷娌胯Е鍙?br />    IRQF_TRIGGER_HIGH    楂樼數騫寵Е鍙戜腑鏂?br />    IRQF_TRIGGER_LOW    浣庣數騫寵Е鍙戜腑鏂?br />    IRQF_TRIGGER_RANDOM    涓虹郴緇熼殢鏈哄彂鐢熷櫒鎻愪緵鏀寔<br />    IRQF_TRIGGER_SHARED    (琛ㄧず鍏變韓鐩稿悓鐨勪腑鏂彿,澶氫釜璁懼鍏變韓)<br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br /> * linux/interrupt.h<br /> * These correspond to the IORESOURCE_IRQ_* defines in<br /> * linux/ioport.h to select the interrupt line behaviour.  When<br /> * requesting an interrupt without specifying a IRQF_TRIGGER, the<br /> * setting should be assumed to be "as already configured", which<br /> * may be as per machine or firmware initialisation.<br /> </span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span> IRQF_TRIGGER_NONE    0x00000000<br /><span style="color: #0000FF; ">#define</span> IRQF_TRIGGER_RISING    0x00000001<br /><span style="color: #0000FF; ">#define</span> IRQF_TRIGGER_FALLING    0x00000002<br /><span style="color: #0000FF; ">#define</span> IRQF_TRIGGER_HIGH    0x00000004<br /><span style="color: #0000FF; ">#define</span> IRQF_TRIGGER_LOW    0x00000008<br /><span style="color: #0000FF; ">#define</span> IRQF_TRIGGER_MASK    (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \<br />                 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)<br /><span style="color: #0000FF; ">#define</span> IRQF_TRIGGER_PROBE    0x00000010<br /><br />typedef irqreturn_t (*irq_handler_t)(<span style="color: #0000FF; ">int</span>, <span style="color: #0000FF; ">void</span> *);<br /><br />絎?涓弬鏁?涓柇鐨勬爣璇?涓柇鐨勬爣璇嗕笌/proc/interrupts瀵瑰簲<br />絎?涓弬鏁?浼犲叆涓柇澶勭悊紼嬪簭鐨勫弬鏁幫紝鍙互涓篘ULL錛屽湪娉ㄥ唽鍏變韓涓柇鏃訛紝姝ゅ弬鏁頒笉鑳戒負NULL錛屼綔涓哄叡浜腑鏂椂鐨勪腑鏂尯鍒弬鏁般?br /><br />榪斿洖鍊?濡傛灉涓柇澶勭悊鎴愬姛,榪斿洖IREQ_HANDLED,鍚﹀垯,榪斿洖IRQ_NONE<br /><span style="color: #008000; ">/*</span><span style="color: #008000; "> irqreturn.h </span><span style="color: #008000; ">*/</span><br />typedef <span style="color: #0000FF; ">int</span> irqreturn_t;<br /><span style="color: #0000FF; ">#define</span> IRQ_NONE    (0)<br /><span style="color: #0000FF; ">#define</span> IRQ_HANDLED    (1)<br /><span style="color: #0000FF; ">#define</span> IRQ_RETVAL(x)    ((x) != 0)<br /><br />涓柇涓婁笅鏂?br /><br />涓柇涓婁笅鏂囨敞鎰忎簨欏?<br />1)涓柇涓婁笅鏂囦唬鐮佺粷涓嶅彲浠ュ仠姝㈣繍琛屻備笉鑳藉仛浠諱綍鍙兘鍙戠敓浼戠湢鐨勬搷浣?鍦ㄤ粠涓柇澶勭悊鍑芥暟涓皟鐢ㄤ竴涓唴鏍窤PI涔嬪墠,搴旇浠旂粏鍒嗘墜瀹?浠ョ‘淇濆叾鍐呴儴涓嶄細瑙﹀彂闃誨絳夊緟!<br /><br />2)涓轟簡鍦ㄤ腑鏂鐞嗗嚱鏁頒腑淇濇姢涓寸晫鍖?涓嶈兘浣跨敤浜掓枼浣?鍥犱負瀹冧滑涔熻瀵艱嚧鐫$湢,搴旇浣跨敤鑷棆閿佷唬鏇夸簰鏂ヤ綋.<br /><br />3)涓柇澶勭悊鍑芥暟涓嶈兘涓庣敤鎴風┖闂寸洿鎺ヤ氦浜掓暟鎹?<br />璋冨害鍣ㄥ伐浣滀簬榪涚▼涔嬮棿,濡傛灉涓柇澶勭悊鍑芥暟鐫$湢騫惰璋冨害鍑哄幓.鏃犳硶璋冨害鍥炴潵!<br /><br />4)涓柇澶勭悊鍑芥暟涓鏂歸潰闇瑕佸揩閫熷湴涓哄叾浠栬繘紼嬭鍑哄鐞嗗櫒,鍙︿竴鏂歸潰鍙堥渶瑕佸畬鎴愬畠鐨勫伐浣?涓轟簡瑙勯伩榪欑鍐茬獊,涓柇澶勭悊鍑芥暟閫氬父灝嗗伐浣滃垎鎴愪袱涓儴鍒?欏跺崐閮ㄨ涓涓爣蹇椾互瀹gО瀹冨凡緇忔湇鍔′簡璇ヤ腑鏂?鑰岄噸澶х殑宸ヤ綔璐熻澆閮借涓㈢粰浜嗗簳鍗婇儴,搴曞崐閮ㄧ殑鎵ц琚歡鍚?鍦ㄥ叾鎵ц鐜涓?鎵鏈夌殑涓柇閮芥槸浣胯兘鐨?<br /><br />4.閲婃斁涓柇<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">void</span> free_irq(<span style="color: #0000FF; ">int</span> irq,<span style="color: #0000FF; ">void</span> *dev_id)<br /><br />5銆佸惎鍔ㄧ敤紱佺敤涓柇<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">void</span> disable_irq_nosync(unsigned <span style="color: #0000FF; ">int</span> irq);<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">void</span> disable_irq(unsigned <span style="color: #0000FF; ">int</span> irq);<br /><span style="color: #0000FF; ">extern</span> <span style="color: #0000FF; ">void</span> enable_irq(unsigned <span style="color: #0000FF; ">int</span> irq);</div><img src ="http://m.shnenglu.com/aaxron/aggbug/199066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/aaxron/" target="_blank">澶╀笅</a> 2013-04-03 11:54 <a href="http://m.shnenglu.com/aaxron/archive/2013/04/03/199066.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>椹卞姩瀛︿範絎旇(1)http://m.shnenglu.com/aaxron/archive/2012/12/04/195955.html澶╀笅澶╀笅Tue, 04 Dec 2012 00:59:00 GMThttp://m.shnenglu.com/aaxron/archive/2012/12/04/195955.htmlhttp://m.shnenglu.com/aaxron/comments/195955.htmlhttp://m.shnenglu.com/aaxron/archive/2012/12/04/195955.html#Feedback0http://m.shnenglu.com/aaxron/comments/commentRss/195955.htmlhttp://m.shnenglu.com/aaxron/services/trackbacks/195955.html
鍐呮牳絎﹀彿鍒楄〃:

cat 
/proc/kallsyms
cat 
/proc/iomem

瀵煎嚭鍐呮牳絎﹀彿:
EXPORT_SYMBOL(sym)
1銆佺己鐪佹儏鍐典笅錛孡inux2.6鍐呮牳涓粯璁や笉瀵煎嚭鎵鏈夌殑絎﹀彿,鍗沖湪2.6鐨勫唴鏍鎬腑娌℃湁榪欎釜瀹廍XPORT_NO_SYMBOLS
2銆佸鏋滄兂瑕佽嚜宸辨寚瀹氬鍑哄摢浜涘彉閲忔垨鍑芥暟錛屽厛鍦∕akefile涓嬌鐢?/span>-DEXPORT_SYMTAB錛岀劧鍚庡湪婧愭枃浠朵腑浣跨敤EXPORT_SYMBOL(xxx);瀵煎嚭涔?br />
echo 
8 > /proc/sys/kernel/printk

鏌ョ湅涓柇:
cat 
/proc/interrupts

涓嬪崐閮ㄦ満鍒?br />
1.tasklet
#define DECLARE_TASKLET(name, func, data) \
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }

2. 宸ヤ綔闃熷垪
struct work_struct my_work;      //瀹氫箟涓涓伐浣滈槦鍒?/span>
void my_work_func(unsigned long); //瀹氫箟涓涓鐞嗗嚱鏁?/span>

鍦ㄤ腑鏂鐞嗗嚱鏁?tasklet鍜屽唴鏍稿畾鏃跺櫒絳夐潪榪涚▼涓婁笅鏂囦笉鑳介樆濉?


澶╀笅 2012-12-04 08:59 鍙戣〃璇勮
]]>
s3c2410鐨刣ma鎿嶄綔鐨勪竴鑸楠?/title><link>http://m.shnenglu.com/aaxron/archive/2012/12/04/195954.html</link><dc:creator>澶╀笅</dc:creator><author>澶╀笅</author><pubDate>Tue, 04 Dec 2012 00:58:00 GMT</pubDate><guid>http://m.shnenglu.com/aaxron/archive/2012/12/04/195954.html</guid><wfw:comment>http://m.shnenglu.com/aaxron/comments/195954.html</wfw:comment><comments>http://m.shnenglu.com/aaxron/archive/2012/12/04/195954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/aaxron/comments/commentRss/195954.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/aaxron/services/trackbacks/195954.html</trackback:ping><description><![CDATA[     鎽樿: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->s3c2410鐨刣ma鎿嶄綔鐨勪竴鑸楠や竴鑸殑錛屽湪s3c2440涓紝瑕佹兂榪涜dma浼犺緭錛岄渶瑕佷竴涓嬩竷涓楠わ細涓錛?* s3c2410_request_dma * * ge...  <a href='http://m.shnenglu.com/aaxron/archive/2012/12/04/195954.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/aaxron/aggbug/195954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/aaxron/" target="_blank">澶╀笅</a> 2012-12-04 08:58 <a href="http://m.shnenglu.com/aaxron/archive/2012/12/04/195954.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Linux璁懼椹卞姩紼嬪簭瀛︿範絎旇:(1) 瀛楃璁懼椹卞姩鍏ラ棬1http://m.shnenglu.com/aaxron/archive/2012/11/08/194881.html澶╀笅澶╀笅Thu, 08 Nov 2012 08:04:00 GMThttp://m.shnenglu.com/aaxron/archive/2012/11/08/194881.htmlhttp://m.shnenglu.com/aaxron/comments/194881.htmlhttp://m.shnenglu.com/aaxron/archive/2012/11/08/194881.html#Feedback0http://m.shnenglu.com/aaxron/comments/commentRss/194881.htmlhttp://m.shnenglu.com/aaxron/services/trackbacks/194881.html 

 

//榪欐槸涓涓渶綆鍗曠殑瀛楃璁懼椹卞姩,鍏ラ棬涓撶敤.
//scull1.h
#ifndef _SCULL1_H
#define _SCULL1_H

#include 
<linux/init.h>
#include 
<linux/module.h>
#include 
<linux/kernel.h>
#include 
<linux/types.h>
#include 
<linux/fs.h>
#include 
<linux/version.h>
#include 
<asm/uaccess.h>
#include 
<linux/cdev.h>
#include 
<linux/mm.h>
#include 
<linux/errno.h>


#define SCULL_MAJOR 0
#define SCULL_SIZE    0x1000
#define SCULL_CMD_CLEAR    0x01


struct scull_dev{
    
struct cdev cDev;
    
char   mem[SCULL_SIZE];
};


int scull_open(struct inode* inode,struct file* filp);

ssize_t scull_read(
struct file *filp, char __user *buf, size_t count,loff_t *f_pos);             

ssize_t scull_write(
struct file *filp, const char __user *buf, size_t count,loff_t *f_pos);

int scull_release(struct inode* inode,struct file* filp);

#endif






//scull1.c
#include "scull1.h"

MODULE_LICENSE(
"Dual BSD/GPL");
MODULE_AUTHOR(
"Aaron.xu");
MODULE_DESCRIPTION(
"hello driver test");
MODULE_VERSION(
"0.1");

static int scull_major = SCULL_MAJOR;
struct scull_dev mydev;

struct file_operations scull_fops = 
{
    .owner     
= THIS_MODULE,
    .open     
= scull_open,
    .release 
= scull_release,
    .read     
= scull_read,
    .write     
= scull_write,
};



static void scull_setup_cdev(void)
{
    
int err;
    dev_t devid 
= MKDEV(scull_major,0);

    
    cdev_init(
&mydev.cDev,&scull_fops);
    
    printk(KERN_INFO 
"&mydev.cDev.ops:%p \n",&mydev.cDev.ops);

    mydev.cDev.owner    
= THIS_MODULE;
    mydev.cDev.ops        
= &scull_fops;

    printk(KERN_INFO 
"&mydev.cDev.ops:%p \n",&mydev.cDev.ops);

    err    
= cdev_add(&mydev.cDev,devid,1);
    
if (err!=0)
    {
        printk(KERN_ERR 
"cdev_add Error,err:%d \n",err);
    }
}

static int scull_init(void)
{
    
int err;
    dev_t devid 
= MKDEV(scull_major,0);

    
if (scull_major)
    {
        err 
= register_chrdev_region(devid,1,"scull1");
    }
    
else
    {
        err 
= alloc_chrdev_region(&devid,0,1,"scull1");
        scull_major 
= MAJOR(devid);
    }

    
if (err !=0 )
    {
        printk(KERN_ERR 
"register chrdev region error,err:%d \n",err);
        
return err;
    }

    scull_setup_cdev();
    
return 0;
}

static void scull_exit(void)
{
    cdev_del(
&mydev.cDev);
    unregister_chrdev_region(MKDEV(scull_major,
0),1);
}


int scull_open(struct inode* inode,struct file* filp)
{
    filp
->private_data = &mydev;
    
return 0;
}

ssize_t scull_read(
struct file *filp, char __user *buf, size_t count,loff_t *f_pos)               
{
    unsigned 
long pos = *f_pos;
    
int err = 0;
    
int ret = 0;
    
struct scull_dev* p_mydev = filp->private_data;

    
if (pos >= SCULL_SIZE)
    {
        
return 0;
    }

    
if (count > (SCULL_SIZE - pos) )
    {
        count 
= SCULL_SIZE - pos;
    }

    err 
= copy_to_user(buf,p_mydev->mem+pos,count);
    
if (err !=0 )
    {
        ret 
= -EFAULT;
    }
    
else
    {
        
*f_pos += count;
        ret 
= count;
        printk(KERN_INFO 
"read %d byte(s) from %lu \n",ret,pos);
    }
    
return ret;
}

ssize_t scull_write(
struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
{
    unsigned 
long pos = *f_pos;
    
int err = 0;
    
int ret = 0;
    
struct scull_dev* p_mydev = filp->private_data;

    
if (pos >= SCULL_SIZE)
    {
        
return 0;
    }

    
if (count > (SCULL_SIZE - pos) )
    {
        count 
= SCULL_SIZE - pos;
    }

    err 
= copy_from_user(p_mydev->mem+pos,buf,count);
    
if (err !=0 )
    {
        ret 
= -EFAULT;
    }
    
else
    {
        
*f_pos += count;
        ret 
= count;
        printk(KERN_INFO 
"write %d byte(s) from %lu \n",ret,pos);
    }
    
return ret;
}

int scull_release(struct inode* inode,struct file* filp)
{
    
return 0;
}


module_init(scull_init);
module_exit(scull_exit);



//Makefile
obj-m    +=scull1.o
KERNELDIR    :
= /usr/src/linux-headers-2.6.32-5-686
PWD    :
=$(shell pwd)
.PHONY: test clean all
all:
    $(MAKE) 
-C $(KERNELDIR) M=$(PWD) modules
clean:
    rm 
-rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versionsm *.order *.symvers .tmp_versions

test:
    insmod .
/scull1.ko
    rmmod scull1
    dmesg 
-c



//鍒涘緩璁懼鑺傜偣
make_dev_node
#
!/bin/bash
DEVICE
="scull1"
MAJOR
=`awk "\\$2==\"$DEVICE\" {print \\$1}" /proc/devices`
cmd
="mknod /dev/$DEVICE c $MAJOR 0"
echo $cmd
`$cmd`

 



澶╀笅 2012-11-08 16:04 鍙戣〃璇勮
]]>
module_param()璇存槑http://m.shnenglu.com/aaxron/archive/2012/11/06/194716.html澶╀笅澶╀笅Tue, 06 Nov 2012 07:54:00 GMThttp://m.shnenglu.com/aaxron/archive/2012/11/06/194716.htmlhttp://m.shnenglu.com/aaxron/comments/194716.htmlhttp://m.shnenglu.com/aaxron/archive/2012/11/06/194716.html#Feedback0http://m.shnenglu.com/aaxron/comments/commentRss/194716.htmlhttp://m.shnenglu.com/aaxron/services/trackbacks/194716.htmlmodule_param()璇存槑
鍦ㄧ敤鎴鋒佷笅緙栫▼鍙互閫氳繃main()鐨勬潵浼犻掑懡浠よ鍙傛暟錛岃岀紪鍐欎竴涓唴鏍告ā鍧楀垯閫氳繃module_param() 
module_param瀹忔槸Linux 
2.6鍐呮牳涓柊澧炵殑錛岃瀹忚瀹氫箟鍦╥nclude/linux/moduleparam.h鏂囦歡涓紝鍏蜂綋瀹氫箟濡備笅錛?br />
#define module_param(name, type, perm)      \
    module_param_named(name, name, type, perm)

鍏朵腑浣跨敤浜?nbsp;
3 涓弬鏁?瑕佷紶閫掔殑鍙傛暟鍙橀噺鍚? 鍙橀噺鐨勬暟鎹被鍨? 浠ュ強璁塊棶鍙傛暟鐨勬潈闄愩?br />
perm鍙傛暟鐨勪綔鐢ㄦ槸浠涔堬紵

鏈鍚庣殑 module_param 瀛楁鏄竴涓潈闄愬?琛ㄧず姝ゅ弬鏁板湪sysfs鏂囦歡緋葷粺涓墍瀵瑰簲鐨勬枃浠惰妭鐐圭殑灞炴с備綘搴斿綋浣跨敤 
<linux/stat.h> 涓畾涔夌殑鍊? 榪欎釜鍊兼帶鍒惰皝鍙互瀛樺彇榪欎簺妯″潡鍙傛暟鍦?nbsp;sysfs 涓殑琛ㄧず.褰損erm涓?鏃訛紝琛ㄧず姝ゅ弬鏁頒笉瀛樺湪 sysfs鏂囦歡緋葷粺涓嬪搴旂殑鏂囦歡鑺傜偣銆?nbsp;鍚﹀垯, 妯″潡琚姞杞藉悗錛屽湪/sys/module/ 鐩綍涓嬪皢鍑虹幇浠ユ妯″潡鍚嶅懡鍚嶇殑鐩綍, 甯︽湁緇欏畾鐨勬潈闄?銆?br />鏉冮檺鍦╥nclude/linux/stat.h涓湁瀹氫箟
姣斿錛?br />
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100

#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010

#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001

浣跨敤 S_IRUGO 浣滀負鍙傛暟鍙互琚墍鏈変漢璇誨彇, 浣嗘槸涓嶈兘鏀瑰彉; S_IRUGO
|S_IWUSR 鍏佽 root 鏉ユ敼鍙樺弬鏁? 娉ㄦ剰, 濡傛灉涓涓弬鏁拌 sysfs 淇敼, 浣犵殑妯″潡鐪嬪埌鐨勫弬鏁板間篃鏀瑰彉浜? 浣嗘槸浣犵殑妯″潡娌℃湁浠諱綍鍏朵粬鐨勯氱煡. 浣犲簲褰撲笉瑕佷嬌妯″潡鍙傛暟鍙啓, 闄ら潪浣犲噯澶囧ソ媯嫻嬭繖涓敼鍙樺茍涓斿洜鑰屼綔鍑哄弽搴?

>>> 

榪欎釜瀹忓畾涔夊簲褰撴斁鍦ㄤ換浣曞嚱鏁頒箣澶? 鍏稿瀷鍦版槸鍑虹幇鍦ㄦ簮鏂囦歡鐨勫墠闈?瀹氫箟濡傦細

static char *whom = "world";
static int howmany = 1;
module_param(howmany, 
int, S_IRUGO);
module_param(whom, charp, S_IRUGO);

妯″潡鍙傛暟鏀寔璁稿綾誨瀷:
bool 
invbool 
涓涓竷灝斿瀷( 
true 鎴栬?nbsp;false)鍊?鐩稿叧鐨勫彉閲忓簲褰撴槸 int 綾誨瀷). invbool 綾誨瀷棰犲掍簡鍊? 鎵浠ョ湡鍊煎彉鎴?nbsp;false, 鍙嶄箣浜︾劧. 

charp 錛氫竴涓瓧絎︽寚閽堝? 鍐呭瓨涓虹敤鎴鋒彁渚涚殑瀛椾覆鍒嗛厤, 鎸囬拡鍥犳璁劇疆. 
int 
long 
short 
uint 
ulong 
ushort 
鍩烘湰鐨勫彉闀挎暣鍨嬪? 浠?nbsp;u 寮澶寸殑鏄棤絎﹀彿鍊? 

鏁扮粍鍙傛暟, 鐢ㄩ楀彿闂撮殧鐨勫垪琛ㄦ彁渚涚殑鍊? 妯″潡鍔犺澆鑰呬篃鏀寔. 澹版槑涓涓暟緇勫弬鏁? 浣跨敤: 
module_param_array(name,type,num,perm); 

榪欓噷 name 鏄綘鐨勬暟緇勭殑鍚嶅瓙(涔熸槸鍙傛暟鍚?, 
type 鏄暟緇勫厓绱犵殑綾誨瀷, 
num 鏄竴涓暣鍨嬪彉閲? 
perm 鏄氬父鐨勬潈闄愬? 

濡傛灉鏁扮粍鍙傛暟鍦ㄥ姞杞芥椂璁劇疆, num 琚緗垚鎻愪緵鐨勬暟鐨勪釜鏁? 妯″潡鍔犺澆鑰呮嫆緇濇瘮鏁扮粍鑳芥斁涓嬬殑澶氱殑鍊? 

嫻嬭瘯妯″潡錛屾簮紼嬪簭hello.c鍐呭濡備笅錛?nbsp;

#include 
<linux/init.h> 
#include 
<linux/module.h>
#include 
<linux/moduleparam.h>         

MODULE_LICENSE(
"Dual BSD/GPL");     

static char *who= "world";             
static int times = 1;       
module_param(times,
int,S_IRUSR);     
module_param(who,charp,S_IRUSR);   

static int hello_init(void)       
{
    
int i;
    
for(i=0;i<times;i++)
       printk(KERN_ALERT 
"(%d) hello, %s!\n",i,who);
     
return 0;
}

static void hello_exit(void
{
    printk(KERN_ALERT
"Goodbye, %s!\n",who);
}

module_init(hello_init);
module_exit(hello_exit);

緙栬瘧鐢熸垚鍙墽琛屾枃浠秇ello

鎻掑叆: 
# insmod hello.ko who
="world" times=5 

鍑虹幇5嬈?/span>"hello,world!"錛?nbsp;

#錛?/span>1錛塰ello,world! 
#錛?/span>2錛塰ello,world! 
#錛?/span>3錛塰ello,world! 
#錛?/span>4錛塰ello,world! 
#錛?/span>5錛塰ello,world! 

鍗歌澆錛?nbsp;
# rmmod hello 

鍑虹幇錛?nbsp;
#Goodbye,world
!


澶╀笅 2012-11-06 15:54 鍙戣〃璇勮
]]>
娣卞叆鐞嗚Вlinux鍐呮牳絎笁鐗?瀹氭椂嫻嬭瘯)http://m.shnenglu.com/aaxron/archive/2012/08/03/186172.html澶╀笅澶╀笅Fri, 03 Aug 2012 08:40:00 GMThttp://m.shnenglu.com/aaxron/archive/2012/08/03/186172.htmlhttp://m.shnenglu.com/aaxron/comments/186172.htmlhttp://m.shnenglu.com/aaxron/archive/2012/08/03/186172.html#Feedback0http://m.shnenglu.com/aaxron/comments/commentRss/186172.htmlhttp://m.shnenglu.com/aaxron/services/trackbacks/186172.html






澶╀笅 2012-08-03 16:40 鍙戣〃璇勮
]]>
Linux璁懼椹卞姩紼嬪簭:gnu make 鎵╁睍璇硶http://m.shnenglu.com/aaxron/archive/2012/03/16/168055.html澶╀笅澶╀笅Fri, 16 Mar 2012 03:11:00 GMThttp://m.shnenglu.com/aaxron/archive/2012/03/16/168055.htmlhttp://m.shnenglu.com/aaxron/comments/168055.htmlhttp://m.shnenglu.com/aaxron/archive/2012/03/16/168055.html#Feedback1http://m.shnenglu.com/aaxron/comments/commentRss/168055.htmlhttp://m.shnenglu.com/aaxron/services/trackbacks/168055.html瑕佺偣:
鍦ㄧ敤鎴風┖闂撮┍鍔ㄧ▼搴?/span>
insmod
modprobe
rmmod


涓浜涘畯:
LINUX_VERSION_CODE
鏁存暟瀹?/span>


GNU make 鎵╁睍璇硶
obj-m   +=hello.o
KERNELDIR   := /usr/src/linux-headers-2.6.32-5-686
PWD :=$(shell pwd)
.PHONY: test clean all
all:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versionsm *.order *.symvers .tmp_versions

test:
    insmod ./hello.ko
    rmmod hello
    dmesg -c

obj-m
鐢卞唴鏍告瀯閫犵郴緇熶嬌鐢ㄧ殑makefilet絎﹀彿,鐢ㄦ潵紜畾鍦ㄥ綋鍓嶇洰褰曚腑搴旀瀯閫犲摢浜涙ā鍧?
鍗砿:鎸囧畾鎶婂璞$紪璇戜負妯″潡

obj-y
鎸囧畾鎶婂璞$紪璇戣繘鍐呮牳涓?/span>

濡傛灉鎴戜滑瑕佹瀯閫犵殑妯″潡涓簃odule.ko,騫剁敱file1.c鍜宖ile2.c鍒欐紜殑makefile鍙涓嬬紪鍐?
obj-m :=module.o
module-objs :=file1.o file2.o

涓轟簡璁╀笂闈㈢殑makefile鍙互宸ヤ綔,蹇呴』鍦ㄥぇ鐨勫唴鏍告瀯閫犵郴緇熺幆澧冧腑璋冪敤瀹冧滑,鎵浠ヤ笂榪板懡浠ら鍏堣鏀瑰彉-C鎸囧畾鐨勭洰褰?鍗?
 $(MAKE) -C $(KERNELDIR)
鐒跺悗鎸囧畾M鍙橀噺鐩綍,鍗寵makefile鍦ㄦ瀯閫爉odules鐩爣涔嬪墠榪斿洖鍒版ā鍧楁簮浠g爜鐨勭洰褰?鏃㈠綋鍓嶇洰褰?M=$(PWD),鏈鍚巑odules鐩爣鎸囧悜obj-m鍙橀噺涓瀹氱殑妯″潡.


M涓嶆槸涓涓紪璇戦夐」錛岃屾槸涓涓彉閲忥紝浠庨《灞俶akefile鏂囦歡閲屽彲浠ユ壘鍒板畠鐨勫畾涔?
鏂囦歡鍦?/span>
/usr/src/linux-headers-2.6.32-5-common/Makefile

69 ifeq ("$(origin M)", "command line")
70   KBUILD_EXTMOD := $(M)
71 endif


-C 鐢ㄤ簬鎸囧畾鍐呮牳婧愪唬鐮佺殑鐩綍

-M 鐢ㄤ簬module鎵鍦ㄧ殑鐩綍

 

濡傛灉涓涓ā鍧楀寘鎷簡澶氫釜.c鏂囦歡(濡?file1.c , file2.c),鍒欏簲璇ヤ互濡備笅鏂瑰紡緙栧啓Makefile
obj-m := modulename.o
module-objs := file1.o file2.o



澶╀笅 2012-03-16 11:11 鍙戣〃璇勮
]]>
涓柇鍙婁腑鏂鐞嗚繃紼?/title><link>http://m.shnenglu.com/aaxron/archive/2011/11/16/160280.html</link><dc:creator>澶╀笅</dc:creator><author>澶╀笅</author><pubDate>Wed, 16 Nov 2011 09:25:00 GMT</pubDate><guid>http://m.shnenglu.com/aaxron/archive/2011/11/16/160280.html</guid><wfw:comment>http://m.shnenglu.com/aaxron/comments/160280.html</wfw:comment><comments>http://m.shnenglu.com/aaxron/archive/2011/11/16/160280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/aaxron/comments/commentRss/160280.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/aaxron/services/trackbacks/160280.html</trackback:ping><description><![CDATA[<div><div><div>涓柇鍙婁腑鏂鐞嗚繃紼?/div></div><div>1. 涓柇鍜屽紓甯哥殑姒傚康鍖哄埆</div><div>   Intel鐨勫畼鏂規枃妗i噷灝嗕腑鏂拰寮傚父鐞嗚В涓轟袱縐嶄腑鏂綋鍓嶇▼搴忔墽琛岀殑涓嶅悓鏈哄埗銆傝繖鏄腑鏂拰寮傚父鐨勫叡鍚岀偣銆備笉鍚岀偣鍦ㄤ簬錛?/div><div>   涓柇(interrupt)鏄紓姝ョ殑浜嬩歡錛屽吀鍨嬬殑姣斿鐢盜/O璁懼瑙﹀彂錛涘紓甯?exception)鏄悓姝ョ殑浜嬩歡錛屽吀鍨嬬殑姣斿澶勭悊鍣ㄦ墽琛屾煇鏉℃寚浠ゆ椂鍙戠幇鍑洪敊浜嗙瓑絳夈?/div><div>   涓柇鍙堝彲浠ュ垎涓哄彲灞忚斀涓柇鍜岄潪鍙睆钄戒腑鏂紝寮傚父鍙堝垎涓烘晠闅溿侀櫡闃卞拰寮傚父涓3縐嶏紝瀹冧滑鐨勫叿浣撳尯鍒緢澶氫功綾嶅拰瀹樻柟鏂囨。閮借В閲婄殑姣旇緝娓呮榪欓噷涓嶅啀璧樿堪銆?/div><div>鍏充簬瀹冧滑鐨勫尯鍒湁涓ょ偣鏄渶瑕佹敞鎰忕殑錛?/div><div>1錛夊鉤甯告墍璇寸殑灞忚斀涓柇鏄笉鍖呮嫭寮傚父鐨勶紝鍗沖紓甯鎬笉浼氬洜涓篊PU鐨処F浣嶈娓咃紙鍏充腑鏂紝鎸囦護錛歝li錛夎屽彈褰卞搷錛屾瘮濡傜己欏靛紓甯革紝鍗充嬌鍏充簡涓柇涔熶細瑙﹀彂CPU鐨勫鐞嗐?/div><div>2錛夐氬父璇寸殑int 80h榪欑緋葷粺璋冪敤浣跨敤鐨勪腑鏂柟寮忓疄闄呬笂紜歡涓婃槸鐞嗚В涓哄紓甯稿鐞嗙殑錛屽洜姝や篃涓嶄細琚睆钄芥帀錛岃繖涔熷緢濂界悊瑙o紝int 80h榪欑涓柇鏂瑰紡鏄▼搴忛噷涓誨姩瑙﹀彂鐨勶紝瀵逛簬CPU鏉ヨ灞炰簬鍚屾浜嬩歡錛屽洜姝や篃灝卞睘浜庡紓甯哥殑鑼冪暣銆?/div><div></div><div>2. 涓柇錛堝紓甯革級澶勭悊榪囩▼</div><div>   闇瑕佹槑紜殑涓鐐規槸CPU瀵逛簬涓柇鍜屽紓甯哥殑鍏蜂綋澶勭悊鏈哄埗鏈川涓婃槸瀹屽叏涓鑷寸殑錛屽嵆錛?/div><div>褰揅PU鏀跺埌涓柇鎴栬呭紓甯哥殑淇″彿鏃訛紝瀹冧細鏆傚仠鎵ц褰撳墠鐨勭▼搴忔垨浠誨姟錛岄氳繃涓瀹氱殑鏈哄埗璺寵漿鍒拌礋璐e鐞嗚繖涓俊鍙風殑鐩稿叧澶勭悊紼嬪簭涓紝鍦ㄥ畬鎴愬榪欎釜淇″彿鐨勫鐞嗗悗鍐嶈煩鍥炲埌鍒氭墠琚墦鏂殑紼嬪簭鎴栦換鍔′腑銆傝繖閲屽彧鎻忚堪淇濇姢妯″紡涓嬬殑澶勭悊榪囩▼錛屾悶娓呮浜嗕繚鎶ゆā寮忎笅鐨勫鐞嗚繃紼嬶紙鏇村鏉傦級錛屽疄妯″紡涓嬬殑澶勭悊鏈哄埗涔熷氨瀹規槗鐞嗚В浜嗐?/div><div></div><div>鍏蜂綋鐨勫鐞嗚繃紼嬪涓嬶細</div><div>0錛変腑鏂搷搴旂殑浜嬪墠鍑嗗錛?/div><div>緋葷粺瑕佹兂鑳藉搴斿鍚勭涓嶅悓鐨勪腑鏂俊鍙鳳紝鎬葷殑鏉ョ湅灝辨槸闇瑕佺煡閬撴瘡縐嶄俊鍙峰簲璇ョ敱鍝釜涓柇鏈嶅姟紼嬪簭璐熻矗浠ュ強榪欎簺涓柇鏈嶅姟紼嬪簭鍏蜂綋鏄浣曞伐浣滅殑銆傜郴緇熷彧鏈変簨鍓嶅榪欎袱浠朵簨閮界煡閬撳緱寰堟竻妤氾紝鎵嶈兘姝g‘鍦板搷搴斿悇縐嶄腑鏂俊鍙峰拰寮傚父銆?/div><div>[a]緋葷粺灝嗘墍鏈夌殑涓柇淇″彿緇熶竴榪涜浜嗙紪鍙鳳紙涓鍏?56涓細0锝?55錛夛紝榪欎釜鍙風О涓轟腑鏂悜閲忥紝鍏蜂綋鍝釜涓柇鍚戦噺琛ㄧず鍝涓柇鏈夌殑鏄瀹氬ソ鐨勶紝涔熸湁鐨勬槸鍦ㄧ粰瀹氳寖鍥村唴鑷璁懼畾鐨勩? </div><div>涓柇鍚戦噺鍜屼腑鏂湇鍔$▼搴忕殑瀵瑰簲鍏崇郴涓昏鏄敱IDT錛堜腑鏂悜閲忚〃錛夎礋璐c傛搷浣滅郴緇熷湪IDT涓緗ソ鍚勭涓柇鍚戦噺瀵瑰簲鐨勪腑鏂弿榪扮錛堜竴鍏辨湁涓夌被涓柇闂ㄦ弿榪扮錛氫換鍔¢棬銆佷腑鏂棬鍜岄櫡闃遍棬錛夛紝鐣欏緟CPU鏌ヨ浣跨敤銆傝孖DT鏈韓鐨勪綅緗槸鐢眎dtr淇濆瓨鐨勶紝褰撶劧榪欎釜鍦板潃涔熸槸鐢監S濉厖鐨勩?/div><div></div><div>[b]涓柇鏈嶅姟紼嬪簭鍏蜂綋璐熻矗澶勭悊涓柇錛堝紓甯革級鐨勪唬鐮佹槸鐢辮蔣浠訛紝涔熷氨鏄搷浣滅郴緇熷疄鐜扮殑錛岃繖閮ㄥ垎浠g爜灞炰簬鎿嶄綔緋葷粺鍐呮牳浠g爜銆備篃灝辨槸璇翠粠CPU媯嫻嬩腑鏂俊鍙峰埌鍔犺澆涓柇鏈嶅姟紼嬪簭浠ュ強浠庝腑鏂湇鍔$▼搴忎腑鎭㈠鎵ц琚殏鍋滅殑紼嬪簭錛岃繖涓祦紼嬪熀鏈笂鏄‖浠剁‘瀹氫笅鏉ョ殑錛岃屽叿浣撶殑涓柇鍚戦噺鍜屾湇鍔$▼搴忕殑瀵瑰簲鍏崇郴璁劇疆鍜屼腑鏂湇鍔$▼搴忕殑鍐呭鏄敱鎿嶄綔緋葷粺紜畾鐨勩?/div><div></div><div>1錛塁PU媯鏌ユ槸鍚︽湁涓柇/寮傚父淇″彿</div><div>   CPU鍦ㄦ墽琛屽畬褰撳墠紼嬪簭鐨勬瘡涓鏉℃寚浠ゅ悗錛岄兘浼氬幓紜鍦ㄦ墽琛屽垰鎵嶇殑鎸囦護榪囩▼涓腑鏂帶鍒跺櫒錛堝錛?259A錛夋槸鍚﹀彂閫佷腑鏂姹傝繃鏉ワ紝濡傛灉鏈夐偅涔圕PU灝變細鍦ㄧ浉搴旂殑鏃墮挓鑴夊啿鍒版潵鏃朵粠鎬葷嚎涓婅鍙栦腑鏂姹傚搴旂殑涓柇鍚戦噺[2]銆?/div><div>瀵逛簬寮傚父鍜岀郴緇熻皟鐢ㄩ偅鏍風殑杞腑鏂紝鍥犱負涓柇鍚戦噺鏄洿鎺ョ粰鍑虹殑錛屾墍浠ュ拰閫氳繃IRQ錛堜腑鏂姹傦級綰垮彂閫佺殑紜歡涓柇璇鋒眰涓嶅悓錛屼笉浼氬啀涓撻棬鍘誨彇鍏跺搴旂殑涓柇鍚戦噺銆?/div><div></div><div>2錛夋牴鎹腑鏂悜閲忓埌IDT琛ㄤ腑鍙栧緱澶勭悊榪欎釜鍚戦噺鐨勪腑鏂▼搴忕殑孌甸夋嫨絎?/div><div>   CPU鏍規嵁寰楀埌鐨勪腑鏂悜閲忓埌IDT琛ㄩ噷鎵懼埌璇ュ悜閲忓搴旂殑涓柇鎻忚堪絎︼紝涓柇鎻忚堪絎﹂噷淇濆瓨鐫涓柇鏈嶅姟紼嬪簭鐨勬閫夋嫨絎︺?/div><div></div><div>3錛夋牴鎹彇寰楃殑孌甸夋嫨絎﹀埌GDT涓壘鐩稿簲鐨勬鎻忚堪絎?/div><div>   CPU浣跨敤IDT鏌ュ埌鐨勪腑鏂湇鍔$▼搴忕殑孌甸夋嫨絎︿粠GDT涓彇寰楃浉搴旂殑孌墊弿榪扮錛屾鎻忚堪絎﹂噷淇濆瓨浜嗕腑鏂湇鍔$▼搴忕殑孌靛熀鍧鍜屽睘鎬т俊鎭紝姝ゆ椂CPU灝卞緱鍒頒簡涓柇鏈嶅姟紼嬪簭鐨勮搗濮嬪湴鍧銆?/div><div>   榪欓噷錛孋PU浼氭牴鎹綋鍓峜s瀵勫瓨鍣ㄩ噷鐨凜PL鍜孏DT鐨勬鎻忚堪絎︾殑DPL錛屼互紜繚涓柇鏈嶅姟紼嬪簭鏄珮浜庡綋鍓嶇▼搴忕殑錛屽鏋滆繖嬈′腑鏂槸緙栫▼寮傚父錛堝錛歩nt 80h緋葷粺璋冪敤錛夛紝閭d箞榪樿媯鏌PL鍜孖DT琛ㄤ腑涓柇鎻忚堪絎︾殑DPL錛屼互淇濊瘉褰撳墠紼嬪簭鏈夋潈闄愪嬌鐢ㄤ腑鏂湇鍔$▼搴忥紝榪欏彲浠ラ伩鍏嶇敤鎴峰簲鐢ㄧ▼搴忚闂壒孌婄殑闄烽槺闂ㄥ拰涓柇闂╗3]銆?/div><div></div><div></div><div>4錛塁PU鏍規嵁鐗規潈綰х殑鍒ゆ柇璁懼畾鍗沖皢榪愯鐨勪腑鏂湇鍔$▼搴忚浣跨敤鐨勬爤鐨勫湴鍧</div><div>   CPU浼氭牴鎹瓹PL鍜屼腑鏂湇鍔$▼搴忔鎻忚堪絎︾殑DPL淇℃伅紜鏄惁鍙戠敓浜嗙壒鏉冪駭鐨勮漿鎹紝姣斿褰撳墠紼嬪簭姝h繍琛屽湪鐢ㄦ埛鎬侊紝鑰屼腑鏂▼搴忔槸榪愯鍦ㄥ唴鏍告佺殑錛屽垯鎰忓懗鐫鍙戠敓浜嗙壒鏉冪駭鐨勮漿鎹紝榪欐椂CPU浼氫粠褰撳墠紼嬪簭鐨凾SS淇℃伅錛堣淇℃伅鍦ㄥ唴瀛樹腑鐨勯鍦板潃瀛樺湪TR瀵勫瓨鍣ㄤ腑錛夐噷鍙栧緱璇ョ▼搴忕殑鍐呮牳鏍堝湴鍧錛屽嵆鍖呮嫭ss鍜宔sp鐨勫鹼紝騫剁珛鍗沖皢緋葷粺褰撳墠浣跨敤鐨勬爤鍒囨崲鎴愭柊鐨勬爤銆傝繖涓爤灝辨槸鍗沖皢榪愯鐨勪腑鏂湇鍔$▼搴忚浣跨敤鐨勬爤銆傜揣鎺ョ潃灝卞皢褰撳墠紼嬪簭浣跨敤鐨剆s,esp鍘嬪埌鏂版爤涓繚瀛樿搗鏉ャ?/div><div></div><div>6錛変繚鎶ゅ綋鍓嶇▼搴忕殑鐜板満</div><div>   CPU寮濮嬪埄鐢ㄦ爤淇濇姢琚殏鍋滄墽琛岀殑紼嬪簭鐨勭幇鍦猴細渚濇鍘嬪叆褰撳墠紼嬪簭浣跨敤鐨別flags錛宑s錛宔ip錛宔rrorCode錛堝鏋滄槸鏈夐敊璇爜鐨勫紓甯革級淇℃伅銆?/div><div>瀹樻柟鏂囨。[1]緇欏嚭鐨勬爤鍙樺寲鐨勭ず鎰忓浘濡備笅錛?/div><div></div><div></div><div>7錛夎煩杞埌涓柇鏈嶅姟紼嬪簭鐨勭涓鏉℃寚浠ゅ紑濮嬫墽琛?/div><div>   CPU鍒╃敤涓柇鏈嶅姟紼嬪簭鐨勬鎻忚堪絎﹀皢鍏剁涓鏉℃寚浠ょ殑鍦板潃鍔犺澆鍒癱s鍜宔ip瀵勫瓨鍣ㄤ腑錛屽紑濮嬫墽琛屼腑鏂湇鍔$▼搴忋傝繖鎰忓懗鐫鍏堝墠鐨勭▼搴忚鏆傚仠鎵ц錛屼腑鏂湇鍔$▼搴忔寮忓紑濮嬪伐浣溿?/div><div></div><div>8錛変腑鏂湇鍔$▼搴忓鐞嗗畬姣曪紝鎭㈠鎵ц鍏堝墠涓柇鐨勭▼搴?/div><div>   鍦ㄦ瘡涓腑鏂湇鍔$▼搴忕殑鏈鍚庯紝蹇呴』鏈変腑鏂畬鎴愯繑鍥炲厛鍓嶇▼搴忕殑鎸囦護錛岃繖灝辨槸iret錛堟垨iretd錛夈傜▼搴忔墽琛岃繖鏉¤繑鍥炴寚浠ゆ椂錛屼細浠庢爤閲屽脊鍑哄厛鍓嶄繚瀛樼殑琚殏鍋滅▼搴忕殑鐜板満淇℃伅錛屽嵆eflags,cs,eip閲嶆柊寮濮嬫墽琛屻?br /><img src="http://m.shnenglu.com/images/cppblog_com/aaxron/涓柇.png" alt="" /></div></div><div></div><img src ="http://m.shnenglu.com/aaxron/aggbug/160280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/aaxron/" target="_blank">澶╀笅</a> 2011-11-16 17:25 <a href="http://m.shnenglu.com/aaxron/archive/2011/11/16/160280.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Debian 6 椹卞姩寮鍙戠幆澧冩惌寤?/title><link>http://m.shnenglu.com/aaxron/archive/2011/11/01/159454.html</link><dc:creator>澶╀笅</dc:creator><author>澶╀笅</author><pubDate>Tue, 01 Nov 2011 06:24:00 GMT</pubDate><guid>http://m.shnenglu.com/aaxron/archive/2011/11/01/159454.html</guid><wfw:comment>http://m.shnenglu.com/aaxron/comments/159454.html</wfw:comment><comments>http://m.shnenglu.com/aaxron/archive/2011/11/01/159454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/aaxron/comments/commentRss/159454.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/aaxron/services/trackbacks/159454.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Debian </span><span style="color: #800000; ">6</span><span style="color: #000000; "> 椹卞姩寮鍙戠幆澧冩惌寤?br /></span><span style="color: #800000; ">1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">瀹夎鐩稿叧宸ュ叿<br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">get install </span><span style="color: #000000; ">-</span><span style="color: #000000; ">y gcc g</span><span style="color: #000000; ">++</span><span style="color: #000000; "> gdb make build</span><span style="color: #000000; ">-</span><span style="color: #000000; ">essential<br /><br /></span><span style="color: #800000; ">2</span><span style="color: #000000; ">.</span><span style="color: #000000; ">鏌ョ湅緋葷粺鐗堟湰</span><span style="color: #000000; ">,</span><span style="color: #000000; ">騫跺畨瑁呭唴鏍稿ご鏂囦歡<br />root@</span><span style="color: #800000; ">192.168</span><span style="color: #000000; ">.</span><span style="color: #800000; ">20.128</span><span style="color: #000000; ">:~/</span><span style="color: #000000; "> </span><span style="color: #008000; ">#</span><span style="color: #008000; "> uname -r</span><span style="color: #008000; "><br /></span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">cache search linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">get install </span><span style="color: #000000; ">-</span><span style="color: #000000; ">y linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br /><br /></span><span style="color: #800000; ">3</span><span style="color: #000000; ">.</span><span style="color: #000000; ">鏌ョ湅鍐呮牳澶存枃浠朵綅緗?br />鐪嬩笅浼氬畨瑁呭埌鍝?/span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">cache show linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br /><br />鏈夎繖涔堝彞</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />These files are going to be installed into<br /></span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; ">,</span><span style="color: #000000; "> and can be used </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> building modules<br /><br />灝辨槸榪欓噷鍟?/span><span style="color: #000000; ">.</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br /><br /></span><span style="color: #800000; ">4</span><span style="color: #000000; ">.</span><span style="color: #000000; ">濂戒簡</span><span style="color: #000000; ">,</span><span style="color: #000000; ">鎺ヤ笅鏉ュ啓嫻嬭瘯渚嬪瓙</span><span style="color: #000000; ">:</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">,</span><span style="color: #000000; ">鎶勪簡http</span><span style="color: #000000; ">://</span><span style="color: #000000; ">bbs</span><span style="color: #000000; ">.</span><span style="color: #000000; ">chinaunix</span><span style="color: #000000; ">.</span><span style="color: #000000; ">net</span><span style="color: #000000; ">/</span><span style="color: #000000; ">thread</span><span style="color: #000000; ">-</span><span style="color: #800000; ">3570849</span><span style="color: #000000; ">-</span><span style="color: #800000; ">1</span><span style="color: #000000; ">-</span><span style="color: #800000; ">1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">html<br />涓婄殑浠g爜</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />鏂囦歡1</span><span style="color: #000000; ">:</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">.</span><span style="color: #000000; ">c<br /></span><span style="color: #008000; ">#</span><span style="color: #008000; ">include <linux/init.h><br />#include <linux/module.h></span><span style="color: #008000; "><br /></span><span style="color: #000000; ">MODULE_LICENSE(</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">GPL</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">);<br /><br />static </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> hello_init(void)<br />{<br />    printk(KERN_ALERT </span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">Hello, world\n</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">);<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #800000; ">0</span><span style="color: #000000; ">;<br />}<br /><br />static void hello_exit(void)<br />{<br />    printk(KERN_ALERT </span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">Goodbye, cruel world\n</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">);<br />}<br /><br />module_init(hello_init);<br />module_exit(hello_exit);<br /><br />鏂囦歡2</span><span style="color: #000000; ">:</span><span style="color: #000000; ">Makefile</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />obj</span><span style="color: #000000; ">-</span><span style="color: #000000; ">m   </span><span style="color: #000000; ">+=</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o<br />KERNELDIR   </span><span style="color: #000000; ">:=</span><span style="color: #000000; "> </span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br />PWD </span><span style="color: #000000; ">:=</span><span style="color: #000000; ">$(shell pwd)<br /></span><span style="color: #000000; ">.</span><span style="color: #000000; ">PHONY</span><span style="color: #000000; ">:</span><span style="color: #000000; "> test clean all<br />all</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />    $(MAKE) </span><span style="color: #000000; ">-</span><span style="color: #000000; ">C $(KERNELDIR) M</span><span style="color: #000000; ">=</span><span style="color: #000000; ">$(PWD) modules<br />clean</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />    rm </span><span style="color: #000000; ">-</span><span style="color: #000000; ">rf </span><span style="color: #000000; ">*.</span><span style="color: #000000; ">o </span><span style="color: #000000; ">*~</span><span style="color: #000000; "> core </span><span style="color: #000000; ">.</span><span style="color: #000000; ">depend </span><span style="color: #000000; ">.*.</span><span style="color: #000000; ">cmd </span><span style="color: #000000; ">*.</span><span style="color: #000000; ">ko </span><span style="color: #000000; ">*.</span><span style="color: #000000; ">mod</span><span style="color: #000000; ">.</span><span style="color: #000000; ">c </span><span style="color: #000000; ">.</span><span style="color: #000000; ">tmp_versionsm </span><span style="color: #000000; ">*.</span><span style="color: #000000; ">order </span><span style="color: #000000; ">*.</span><span style="color: #000000; ">symvers<br /><br />test</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />    insmod </span><span style="color: #000000; ">./</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">.</span><span style="color: #000000; ">ko<br />    rmmod hello<br />    dmesg </span><span style="color: #000000; ">-</span><span style="color: #000000; ">c<br />    <br /></span><span style="color: #800000; ">5</span><span style="color: #000000; ">.</span><span style="color: #000000; ">濂戒簡</span><span style="color: #000000; ">,</span><span style="color: #000000; ">鐜板湪嫻嬭瘯寮濮?/span><span style="color: #000000; ">,</span><span style="color: #000000; ">鎴愬姛鐨勮瘽</span><span style="color: #000000; ">,</span><span style="color: #000000; ">灝卞彲浠ョ湅鍒頒笅闈㈢殑鏂囧瓧浜?/span><span style="color: #000000; ">.</span><span style="color: #000000; "><br />濡傛灉鏈夐棶棰樼殑璇?/span><span style="color: #000000; ">,</span><span style="color: #000000; ">鍚慻oogle澶х璇鋒暀鍚?/span><span style="color: #000000; ">.</span><span style="color: #000000; ">鍙﹀瑕佺湅<br />root@</span><span style="color: #800000; ">192.168</span><span style="color: #000000; ">.</span><span style="color: #800000; ">20.128</span><span style="color: #000000; ">:~/</span><span style="color: #000000; ">cpp </span><span style="color: #008000; ">#</span><span style="color: #008000; "> make </span><span style="color: #008000; "><br /></span><span style="color: #000000; ">make </span><span style="color: #000000; ">-</span><span style="color: #000000; ">C </span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "> M</span><span style="color: #000000; ">=/</span><span style="color: #000000; ">root</span><span style="color: #000000; ">/</span><span style="color: #000000; ">cpp modules<br />make[</span><span style="color: #800000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">:</span><span style="color: #000000; "> Entering directory `</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; "><br />  CC [M]  /root/cpp/hello.o<br />  Building modules, stage 2.<br />  MODPOST 1 modules<br />  CC      /root/cpp/hello.mod.o<br />  LD [M]  /root/cpp/hello.ko<br />make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-5-686</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; "><br />root@</span><span style="color: #800000; ">192.168</span><span style="color: #000000; ">.</span><span style="color: #800000; ">20.128</span><span style="color: #000000; ">:~/</span><span style="color: #000000; ">cpp </span><span style="color: #008000; ">#</span><span style="color: #008000; "> make test</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">insmod </span><span style="color: #000000; ">./</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">.</span><span style="color: #000000; ">ko<br />rmmod hello<br />dmesg </span><span style="color: #000000; ">-</span><span style="color: #000000; ">c<br />[  </span><span style="color: #800000; ">673.500413</span><span style="color: #000000; ">] Hello</span><span style="color: #000000; ">,</span><span style="color: #000000; "> world<br />[  </span><span style="color: #800000; ">673.504907</span><span style="color: #000000; ">] Goodbye</span><span style="color: #000000; ">,</span><span style="color: #000000; "> cruel world<br />root@</span><span style="color: #800000; ">192.168</span><span style="color: #000000; ">.</span><span style="color: #800000; ">20.128</span><span style="color: #000000; ">:~/</span><span style="color: #000000; ">cpp </span><span style="color: #008000; ">#<br /></span><span style="color: #000000; "><br /><br /></span><span style="color: #800000; ">6</span><span style="color: #000000; ">.</span><span style="color: #000000; ">鏈鍚?/span><span style="color: #000000; ">.</span><span style="color: #000000; ">瀹夎寮鍙戝府鍔╂枃妗?br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">get install </span><span style="color: #000000; ">-</span><span style="color: #000000; ">y manpages</span><span style="color: #000000; ">-</span><span style="color: #000000; ">kernel</span><span style="color: #000000; ">-</span><span style="color: #000000; ">dev linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">manual<br />man </span><span style="color: #800000; ">9</span><span style="color: #000000; "> printk<br />man </span><span style="color: #800000; ">9</span><span style="color: #000000; "> module_init<br /><br />鍙傝冭祫鏂?/span><span style="color: #000000; ">:</span><span style="color: #000000; "> <br />http</span><span style="color: #000000; ">://</span><span style="color: #000000; ">bbs</span><span style="color: #000000; ">.</span><span style="color: #000000; ">chinaunix</span><span style="color: #000000; ">.</span><span style="color: #000000; ">net</span><span style="color: #000000; ">/</span><span style="color: #000000; ">thread</span><span style="color: #000000; ">-</span><span style="color: #800000; ">3570849</span><span style="color: #000000; ">-</span><span style="color: #800000; ">1</span><span style="color: #000000; ">-</span><span style="color: #800000; ">1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">html</span></div> <img src ="http://m.shnenglu.com/aaxron/aggbug/159454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/aaxron/" target="_blank">澶╀笅</a> 2011-11-01 14:24 <a href="http://m.shnenglu.com/aaxron/archive/2011/11/01/159454.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://m.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://icciran.com" target="_blank">亚洲电影有码</a>| <a href="http://by3799.com" target="_blank">免费高清在线一区</a>| <a href="http://www-111111.com" target="_blank">久久亚洲一区二区三区四区</a>| <a href="http://wwwby2232.com" target="_blank">午夜久久久久久</a>| <a href="http://by722777.com" target="_blank">亚洲欧美日韩国产综合在线</a>| <a href="http://guanghezixun.com" target="_blank">亚洲欧美一区二区精品久久久</a>| <a href="http://7ccdd.com" target="_blank">亚洲欧美日韩在线</a>| <a href="http://333666333.com" target="_blank">欧美一区精品</a>| <a href="http://677cn.com" target="_blank">牛人盗摄一区二区三区视频</a>| <a href="http://llyx888.com" target="_blank">亚洲国产99</a>| <a href="http://yjizzdizhigmail.com" target="_blank">亚洲另类自拍</a>| <a href="http://wwwcao88.com" target="_blank">亚洲欧美日韩在线播放</a>| <a href="http://122332.com" target="_blank">先锋影音国产精品</a>| <a href="http://857sds.com" target="_blank">蜜桃精品久久久久久久免费影院</a>| <a href="http://9ctv2.com" target="_blank">欧美精品成人在线</a>| <a href="http://1000078.com" target="_blank">国产伪娘ts一区</a>| <a href="http://119552.com" target="_blank">亚洲日本一区二区三区</a>| <a href="http://hgx123.com" target="_blank">亚洲欧美bt</a>| <a href="http://www01614.com" target="_blank">女女同性女同一区二区三区91</a>| <a href="http://sclddn.com" target="_blank">亚洲精品久久久久久一区二区</a>| <a href="http://maomi998.com" target="_blank">亚洲午夜久久久</a>| <a href="http://ewaygou.com" target="_blank">久久婷婷影院</a>| <a href="http://avtbr123.com" target="_blank">亚洲人成艺术</a>| <a href="http://041935.com" target="_blank">午夜激情一区</a>| <a href="http://mimi78.com" target="_blank">欧美精品aa</a>| <a href="http://www-4564949.com" target="_blank">国产一区视频网站</a>| <a href="http://lfxhfh.com" target="_blank">亚洲永久在线观看</a>| <a href="http://www224558.com" target="_blank">欧美成人精品在线观看</a>| <a href="http://ztsctgs.com" target="_blank">一本综合精品</a>| <a href="http://5456yy.com" target="_blank">欧美紧缚bdsm在线视频</a>| <a href="http://www66441.com" target="_blank">国内精品久久久久久久97牛牛</a>| <a href="http://6633kj.com" target="_blank">亚洲精品欧洲</a>| <a href="http://23230066.com" target="_blank">久久久久久9</a>| <a href="http://123-sj.com" target="_blank">一区二区三区国产精品</a>| <a href="http://cabenn.com" target="_blank">欧美成人精品一区二区三区</a>| <a href="http://1323123.com" target="_blank">国产亚洲成av人片在线观看桃 </a>| <a href="http://23230066.com" target="_blank">欧美成人中文字幕在线</a>| <a href="http://3315588.com" target="_blank">国产伦精品一区二区</a>| <a href="http://www-136hk.com" target="_blank">亚洲美女电影在线</a>| <a href="http://hbshwx.com" target="_blank">欧美成人网在线</a>| <a href="http://av2027.com" target="_blank">久久精品官网</a>| <a href="http://www930666.com" target="_blank">国产精品制服诱惑</a>| <a href="http://www-3121.com" target="_blank">亚洲一二三区视频在线观看</a>| <a href="http://4080sy.com" target="_blank">亚洲国产成人精品女人久久久</a>| <a href="http://bocai01.com" target="_blank">欧美在线视频在线播放完整版免费观看 </a>| <a href="http://51duanxinmao.com" target="_blank">欧美高清hd18日本</a>| <a href="http://sdjinchuan.com" target="_blank">欧美中文字幕视频</a>| <a href="http://gs-qintai.com" target="_blank">国产麻豆日韩欧美久久</a>| <a href="http://66889h.com" target="_blank">亚洲欧美日韩一区在线</a>| <a href="http://895658.com" target="_blank">正在播放欧美一区</a>| <a href="http://3314133.com" target="_blank">欧美日韩精品伦理作品在线免费观看</a>| <a href="http://dailymailnepal.com" target="_blank">亚洲高清资源</a>| <a href="http://674446.com" target="_blank">欧美激情1区</a>| <a href="http://xaxkizlar.com" target="_blank">欧美大片免费观看在线观看网站推荐</a>| <a href="http://3b6f.com" target="_blank">亚洲激情一区二区三区</a>| <a href="http://www16axax.com" target="_blank">欧美激情视频在线播放</a>| <a href="http://91pinping.com" target="_blank">久久一区二区三区av</a>| <a href="http://00000i.com" target="_blank">在线看成人片</a>| <a href="http://www40255.com" target="_blank">欧美成人精品在线</a>| <a href="http://www107aa.com" target="_blank">欧美14一18处毛片</a>| <a href="http://xhs015.com" target="_blank">99re视频这里只有精品</a>| <a href="http://909059c.com" target="_blank">亚洲精品乱码久久久久久久久</a>| <a href="http://649929.com" target="_blank">欧美不卡视频一区</a>| <a href="http://www962aa.com" target="_blank">亚洲精品久久视频</a>| <a href="http://cbb188.com" target="_blank">亚洲欧洲精品一区二区精品久久久</a>| <a href="http://pgd857.com" target="_blank">欧美99久久</a>| <a href="http://psykoptic.com" target="_blank">在线亚洲精品</a>| <a href="http://csjtzn.com" target="_blank">亚洲欧美日韩一区二区三区在线观看 </a>| <a href="http://123yongjiu.com" target="_blank">香蕉久久精品日日躁夜夜躁</a>| <a href="http://521nb.com" target="_blank">亚洲婷婷在线</a>| <a href="http://663747.com" target="_blank">国内伊人久久久久久网站视频</a>| <a href="http://5101h.com" target="_blank">久久综合国产精品台湾中文娱乐网</a>| <a href="http://0070571.com" target="_blank">久久手机免费观看</a>| <a href="http://22abb.com" target="_blank">亚洲高清久久网</a>| <a href="http://456316.com" target="_blank">99国产精品久久久久久久久久</a>| <a href="http://3b6f.com" target="_blank">亚洲国产日韩欧美一区二区三区</a>| <a href="http://hbdfgq.com" target="_blank">欧美成人精品在线播放</a>| <a href="http://ykk7.com" target="_blank">在线午夜精品自拍</a>| <a href="http://www47777.com" target="_blank">亚洲欧美在线磁力</a>| <a href="http://nachang5117.com" target="_blank">在线色欧美三级视频</a>| <a href="http://wu52vip.com" target="_blank">亚洲国产精品久久久久久女王</a>| <a href="http://605012.com" target="_blank">欧美国产国产综合</a>| <a href="http://ll992.com" target="_blank">午夜激情亚洲</a>| <a href="http://hznaja.com" target="_blank">久久亚洲精品欧美</a>| <a href="http://5566kan.com" target="_blank">在线视频欧美日韩</a>| <a href="http://456dv.com" target="_blank">久久久av网站</a>| <a href="http://uuuu30.com" target="_blank">在线一区二区三区四区五区</a>| <a href="http://beeperagain.com" target="_blank">亚洲一区二区av电影</a>| <a href="http://360695.com" target="_blank">一区二区在线视频</a>| <a href="http://44cgcg.com" target="_blank">av成人老司机</a>| <a href="http://26mmmm.com" target="_blank">在线观看日韩www视频免费</a>| <a href="http://9911444.com" target="_blank">亚洲精品欧洲</a>| <a href="http://edtxt.com" target="_blank">国内外成人在线</a>| <a href="http://498626.com" target="_blank">日韩图片一区</a>| <a href="http://543422.com" target="_blank">在线电影国产精品</a>| <a href="http://dsbangx.com" target="_blank">99精品欧美一区</a>| <a href="http://bkf23.com" target="_blank">尤物精品在线</a>| <a href="http://yada-jg.com" target="_blank">亚洲私拍自拍</a>| <a href="http://7m08.com" target="_blank">亚洲毛片av</a>| <a href="http://8181777.com" target="_blank">久久久99国产精品免费</a>| <a href="http://511caifu.com" target="_blank">一区二区三区精品在线</a>| <a href="http://jxrisen.com" target="_blank">久久成人精品无人区</a>| <a href="http://488089.com" target="_blank">夜夜嗨av色一区二区不卡</a>| <a href="http://www-188445.com" target="_blank">欧美一区不卡</a>| <a href="http://55kam.com" target="_blank">亚洲女ⅴideoshd黑人</a>| <a href="http://342889.com" target="_blank">欧美1区2区3区</a>| <a href="http://www8qa.com" target="_blank">久久在线免费视频</a>| <a href="http://23230066.com" target="_blank">国产精品私拍pans大尺度在线</a>| <a href="http://www-kj8777.com" target="_blank">欧美大片91</a>| <a href="http://www57669.com" target="_blank">极品尤物久久久av免费看</a>| <a href="http://18loutv.com" target="_blank">亚洲影院在线观看</a>| <a href="http://430390.com" target="_blank">在线一区二区日韩</a>| <a href="http://atmub.com" target="_blank">欧美成年人视频网站</a>| <a href="http://www49718.com" target="_blank">久久天天躁夜夜躁狠狠躁2022 </a>| <a href="http://3451215.com" target="_blank">国产欧美日本一区二区三区</a>| <a href="http://pao449.com" target="_blank">免费在线日韩av</a>| <a href="http://016889.com" target="_blank">国产视频在线观看一区二区三区</a>| <a href="http://044925.com" target="_blank">99国产精品久久久久久久</a>| <a href="http://06le.com" target="_blank">亚洲人成人一区二区在线观看</a>| <a href="http://039658.com" target="_blank">久久www免费人成看片高清 </a>| <a href="http://pron12.com" target="_blank">久久精品国产亚洲aⅴ</a>| <a href="http://sdsankeguo.com" target="_blank">欧美精品在线网站</a>| <a href="http://musicshq.com" target="_blank">亚洲第一视频</a>| <a href="http://by3180.com" target="_blank">亚洲激情视频在线</a>| <a href="http://52wenxiu.com" target="_blank">久久一综合视频</a>| <a href="http://xajtyd.com" target="_blank">久久综合久久综合久久</a>| <a href="http://www-662553.com" target="_blank">国产夜色精品一区二区av</a>| <a href="http://www-5888c.com" target="_blank">亚洲欧美日韩系列</a>| <a href="http://320ur.com" target="_blank">欧美中文在线观看</a>| <a href="http://320ur.com" target="_blank">国产啪精品视频</a>| <a href="http://p54y.com" target="_blank">久久久久久婷</a>| <a href="http://mmmm26.com" target="_blank">国产麻豆一精品一av一免费</a>| <a href="http://hzdss.com" target="_blank">一本久久综合亚洲鲁鲁五月天</a>| <a href="http://yzxq520.com" target="_blank">亚洲精品欧洲精品</a>| <a href="http://9931111.com" target="_blank">欧美激情一区二区三区</a>| <a href="http://yp889.com" target="_blank">亚洲黑丝一区二区</a>| <a href="http://qiruiwangluo.com" target="_blank">亚洲人线精品午夜</a>| <a href="http://sdluliang.com" target="_blank">欧美激情综合亚洲一二区</a>| <a href="http://www-13413.com" target="_blank">亚洲人成在线影院</a>| <a href="http://hjersqc.com" target="_blank">在线视频日本亚洲性</a>| <a href="http://z10669.com" target="_blank">国产精品萝li</a>| <a href="http://seyuav4.com" target="_blank">午夜在线一区</a>| <a href="http://xianjiacf.com" target="_blank">免费在线观看一区二区</a>| <a href="http://h15h15.com" target="_blank">亚洲精品123区</a>| <a href="http://xhs1039.com" target="_blank">欧美精品激情</a>| <a href="http://xingba999.com" target="_blank">亚洲深夜福利网站</a>| <a href="http://082235.com" target="_blank">久久精品免费观看</a>| <a href="http://631537.com" target="_blank">亚洲高清色综合</a>| <a href="http://aaddgg66.com" target="_blank">欧美激情一区二区三区蜜桃视频</a>| <a href="http://fyfsds.com" target="_blank">亚洲精品欧美一区二区三区</a>| <a href="http://tongrenyaoye.com" target="_blank">国产精品99久久久久久久vr</a>| <a href="http://daqinhkvip.com" target="_blank">国产精品乱看</a>| <a href="http://maokk77.com" target="_blank">久久久久久久激情视频</a>| <a href="http://199372.com" target="_blank">亚洲高清视频中文字幕</a>| <a href="http://951738.com" target="_blank">一区二区高清</a>| <a href="http://8xv0.com" target="_blank">国产视频观看一区</a>| <a href="http://8332777.com" target="_blank">免费永久网站黄欧美</a>| <a href="http://pppp95.com" target="_blank">99国产精品久久久久久久久久 </a>| <a href="http://583775.com" target="_blank">亚洲激情校园春色</a>| <a href="http://www39pao.com" target="_blank">欧美日韩亚洲一区三区</a>| <a href="http://yzstbjt.com" target="_blank">亚洲一区在线免费</a>| <a href="http://83mmmm.com" target="_blank">欧美国产精品一区</a>| <a href="http://lctongda.com" target="_blank">亚洲在线观看免费</a>| <a href="http://8p3c.com" target="_blank">在线电影一区</a>| <a href="http://138128.com" target="_blank">欧美午夜a级限制福利片</a>| <a href="http://c7lc.com" target="_blank">西西人体一区二区</a>| <a href="http://instantptt.com" target="_blank">亚洲激情综合</a>| <a href="http://wce-expo.com" target="_blank">性久久久久久</a>| <a href="http://universehb.com" target="_blank">亚洲欧洲另类国产综合</a>| <a href="http://yw9677.com" target="_blank">国产精品高清网站</a>| <a href="http://6h8c.com" target="_blank">麻豆精品视频在线观看视频</a>| <a href="http://3838418.com" target="_blank">中文av一区二区</a>| <a href="http://rljyy.com" target="_blank">欧美国产一区视频在线观看 </a>| <a href="http://avtb2120.com" target="_blank">亚洲欧洲日本一区二区三区</a>| <a href="http://021-job.com" target="_blank">欧美日韩日本视频</a>| <a href="http://zjkgjt.com" target="_blank">久久久噜噜噜久久中文字幕色伊伊 </a>| <a href="http://www225011.com" target="_blank">欧美日韩一区二区在线观看视频</a>| <a href="http://498626.com" target="_blank">亚洲综合色在线</a>| <a href="http://www-699603.com" target="_blank">亚洲电影免费观看高清完整版在线 </a>| <a href="http://www-919198.com" target="_blank">国产亚洲欧美一区二区</a>| <a href="http://tuokuba520.com" target="_blank">欧美成人一品</a>| <a href="http://668756.com" target="_blank">久久精品日韩欧美</a>| <a href="http://www1122fu.com" target="_blank">一区二区国产精品</a>| <a href="http://sdgs6788.com" target="_blank">欧美成人在线网站</a>| <a href="http://312012.com" target="_blank">久久精品盗摄</a>| <a href="http://www38ccc.com" target="_blank">亚洲欧美国产三级</a>| <a href="http://wtoykd.com" target="_blank">一本一本久久a久久精品综合麻豆</a>| <a href="http://5gn4y.com" target="_blank">国产亚洲人成a一在线v站</a>| <a href="http://www123hao.com" target="_blank">欧美精品一区视频</a>| <a href="http://hhsj31.com" target="_blank">欧美va天堂在线</a>| <a href="http://www92444.com" target="_blank">久久精品国产久精国产思思</a>| <a href="http://042225.com" target="_blank">夜夜嗨网站十八久久</a>| <a href="http://lfxhfh.com" target="_blank">一区二区在线视频观看</a>| <a href="http://www330088.com" target="_blank">国产精品视频观看</a>| <a href="http://777777hb.com" target="_blank">欧美日韩国产a</a>| <a href="http://dracotek.com" target="_blank">欧美xx69</a>| <a href="http://xiyan88.com" target="_blank">麻豆亚洲精品</a>| <a href="http://2302345.com" target="_blank">麻豆精品网站</a>| <a href="http://97sgg.com" target="_blank">欧美成人a视频</a>| <a href="http://wocao1997.com" target="_blank">噜噜噜噜噜久久久久久91</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>