Translate 번역

Translate to EnglishÜbersetzen Sie zum Deutsch/GermanΜεταφράστε στα ελληνικά/GreekПереведите к русскому/RussianOversetter til Norsk/NorwegianÖversätta till Svensk/Swedishहिन्दी अनुवाद करने के लिए/Hindi
Tradueix al català/CatalanTulkot uz latviešu/LatvianPreložiť do slovenčiny/SlovakVertaal aan het Nederlands/Dutchترجمة الى العربية/ArabicTraduzca al Español/SpanishTraduisez au Français/French
Traduca ad Italiano/ItalianTraduza ao Português/Portuguese日本語に翻訳しなさい /Japanese한국어에게 번역하십시오/Korean中文翻译/Chinese Simplified中文翻译/Chinese TraditionalПереклад на українську/Ukrainian

Linux HPET Support 리눅스 HPET 지원

IA-PC HPET 아이오와 주 - PC를 HPET (High Precision Event Timer) is a specification which was jointly developed by Intel and Microsoft in the early part of this decade.. (고가 정밀 이벤트 타이머) 공동으로 인텔과 MS가 2010 년 초반 부분에 개발된 사양입니다 .. The latest version is dated October 2004. 최신 버전은 2004년 10월 일자입니다. It's stated purpose is to 그것은 목적을 명시의 것입니다

initially supplement and eventually replace the legacy 8254 Programmable Interval Timer and the Real Time Clock Periodic Interrupt generation functions that are currently used as the 'de-facto' timer hardware for IA-PCs. 처음에는 보충 결국 유산을 대체할 8254 프로그래머블 인터벌 타이머와 현재 아이오와 주 - PC를위한 '사실상'하드웨어 타이머로 사용되는 실시간 클록주기적인 인터럽트 생성 기능을합니다.

The HPET HPET architecture defines a set of timers that can be used by the operating system. 아키텍처는 운영 체제에서 사용할 수있는 타이머의 집합을 정의합니다. A timer block is a combination of a single counter and up to 32 comparators and match registers. 타이머 블록은 단일 창구의 조합과 최대 32 개의 비교기과 일치하는 레지스터이다. The comparator compares the contents of the match register against the value of a free running monotonic up-counter. 비교는 무료 실행 단조 업 카운터의 가치에 대해 일치하는 레지스터의 내용을 비교합니다. When the output of the up-counter equals the value in the match register an interrupt is generated. 언제까지 - 카운터의 출력은 인터럽트를 등록 매치의 가치를 등호가 생성됩니다. Each of the comparators can output an interrupt. 각 비교기의 출력 인터럽트 할 수 있습니다. A maximum of 8 timer blocks are supported for a total of 256 timers. 8 타이머 블록의 최대 256 타이머의 총 지원됩니다. Each timer block can have different clocking attributes. 각 타이머 블록 클러킹 다른 특성을 가질 수 있습니다. Specific implementations may include only a subset of these timers. 구체적인 구현은 다음과 타이머만을 하위 집합을 포함할 수 있습니다. A minimum of three timers is required. 3 개의 타이머의 최소 필요합니다.

The specification contains the following block diagram of the HPET architecture. 사양은 HPET 아키텍처의 다음 블록 다이어그램이 포함되어 있습니다.

하드웨어 블록 다이어그램

Some of the timers may be enabled to generate a periodic interrupt. 일부는 타이머의주기적인 인터럽트를 생성하는 데 사용할 수 있습니다. If a timer is set to be periodic, its period is added to the match register each time a match occurs, thus computing the next time for this timer to generate an interrupt.. 타이머가 주기적 수로 설정하면, 그 기간은 일치 일치가 발생할 때마다 등록, 그래서 .. 인터럽트를 생성할이 타이머에 대한 다음 번에 컴퓨팅에 추가됩니다 An up-counter is usually 64 bits wide but 32-bit implementations are permitted by the specification and 64-bit up-counters can also be driven in 32-bit mode. 위 카운터는 일반적으로 64 비트 폭하지만 32 비트 구현은 명세와 64 비트까지 카운터에 의해 또한 32 비트 모드에서 구동 수있는 허용하고있다. Up-counters run at a minimum of 10 MHz. 카운터 최대 10 MHz의 최소 실행합니다. which is much faster than the older 어느 훨씬 빨리보다 이전 버전입니다 RTC RTC (Real Time Clock) and can thus produce periodic interrupts at a much higher resolution. (실시간 시계) 따라서 훨씬 더 높은 해상도로 정기 인터럽트를 생성할 수 있습니다. The registers associated with these timers are mapped to memory space. 레지스터는 다음과 타이머와 관련된 메모리 공간에 매핑됩니다.

The BIOS uses BIOS가 사용 ACPI ACPI를 ( Advanced Configuration and Power Interface) functionality to inform the operating system of the location of the HPET memory-mapped register space. (고급 구성 및 전원 인터페이스) 기능을 HPET 메모리 매핑 등록 공간의 위치의 운영 체제를 알려주십시오. Here is an example of a disassembled ACPI HPET table from an Intel DX48BT2 (AKA BoneTrail) motherboard. 여기에 인텔 DX48BT2 (일명 BoneTrail) 메인 보드에서 ACPI를 해체 HPET 테이블의 예입니다.

$ cat /sys/firmware/acpi/tables/HPET > /var/tmp/hpet.out
$ iasl -d /var/tmp/hpet.out
$ cat /var/tmp/hpet.dsl
/*
 * Intel ACPI Component Architecture
 * AML Disassembler version 20090123
 *
 * Disassembly of /var/tmp/hpet.out, Sun Jul  5 19:34:47 2009
 *
 * ACPI Data Table [HPET]
 *
 * Format: [HexOffset DecimalOffset ByteLength]  FieldName : FieldValue
 */

[000h 000  4]                    Signature : "HPET"    /* High Precision Event Timer table */
[004h 004  4]                 Table Length : 00000038
[008h 008  1]                     Revision : 01
[009h 009  1]                     Checksum : CE
[00Ah 010  6]                       Oem ID : "INTEL "
[010h 016  8]                 Oem Table ID : "DX48BT2 "
[018h 024  4]                 Oem Revision : 0000076E
[01Ch 028  4]              Asl Compiler ID : "MSFT"
[020h 032  4]        Asl Compiler Revision : 01000013

[024h 036  4]            Hardware Block ID : 8086A301

[028h 040 12]         Timer Block Register : 
[028h 040  1]                     Space ID : 00 (SystemMemory)
[029h 041  1]                    Bit Width : 00
[02Ah 042  1]                   Bit Offset : 00
[02Bh 043  1]                 Access Width : 00
[02Ch 044  8]                      Address : 00000000FED00000

[034h 052  1]              Sequence Number : 00
[035h 053  2]          Minimum Clock Ticks : 0001
[037h 055  1]        Flags (decoded below) : 00
                              Page Protect : 0
                           4K Page Protect : 0
                          64K Page Protect : 0
Raw Table Data

  0000: 48 50 45 54 38 00 00 00 01 CE 49 4E 54 45 4C 20  HPET8.....INTEL
  0010: 44 58 34 38 42 54 32 20 6E 07 00 00 4D 53 46 54  DX48BT2 n...MSFT
  0020: 13 00 00 01 01 A3 86 80 00 00 00 00 00 00 D0 FE  ................
  0030: 00 00 00 00 00 01 00 00                          ........
$


See page 30 of the HPET v1.0a specification for a detailed breakdown of the individual bits in the Event Time Block (called Hardware Block by the AML disassember). 이벤트 타임 블럭 (하드웨어 블록 AML의 disassember로 불리는)의 개별 비트에 대한 자세한 분해 페이지 30 HPET의 v1.0a 사양을 참조하십시오. Note that only one Event Timer Block need be described in the HPET table in order to bootstrap an operating system. 참고 그것은 하나의 이벤트 타이머 블록이 필요 HPET 테이블에 주문 운영 체제를 부트 스트랩에 설명됩니다. This is the case here. 이 경우 여기에있다. For non-legacy platforms, the Event Timer Block described in the HPET is the one that provides functionality to replace the 8254/RTC Periodic Interrupt Logic. 비 레거시 플랫폼, 이벤트 타이머 블록 HPET에서 설명이 8254/RTC주기적인 인터럽트 로직을 대체하는 기능을 제공 하나입니다.

Other Event Time Blocks are described in the ACPI namespace. 기타 이벤트 타임 블록은 ACPI 이름 공간에 설명되어 있습니다. Here is the relevant section from the disassembled ACPI DSDT table. 여기 분해 DSDT ACPI를 테이블에서 관련된 부분입니다.

            Device (HPET)
            {
                Name (_HID, EisaId ("PNP0103"))
                Name (_CRS, ResourceTemplate ()
                {
                    Memory32Fixed (ReadOnly,
                        0xFED00000,         // Address Base
                        0x00004000,         // Address Length
                        )
                })
                Method (_STA, 0, NotSerialized)
                {
                    If (HPEE)
                    {
                        Return (0x0F)
                    }
                    Else
                    {
                        Return (Zero)
                    }
                }
            }


Note the assigned PNPID ( PNP0103 ) for the HPET. 참고 HPET 할당된 PNPID (PNP0103)에 대한. Because no _UID is specified it means that there are no other HPET timer blocks. 아니 _UID 지정한이기 때문에 그것은 아무도 HPET 타이머 블록을 의미합니다.

Here is a list of the HPET-related messages outputted when this particular motherboard is booted up under Fedora 11. 여기 HPET 관련 메시지 출력의 목록이 특정 마더보드는 페도라 11 아래에 부팅입니다.

$ dmesg | grep -i HPET
ACPI: HPET CFBF2000, 0038 (r1 INTEL  DX48BT2       76E MSFT  1000013)
ACPI: HPET id: 0x8086a301 base: 0xfed00000
hpet clockevent registered
HPET: 4 timers in total, 0 timers will be used for per-cpu timer
hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0, 0
hpet0: 4 comparators, 64-bit 14.318180 MHz counter
rtc0: alarms up to one month, 114 bytes nvram, hpet irqs
$


The first line is outputted when the ACPI HPET table is read. 첫 번째 줄은 때는 ACPI HPET 테이블은 읽기가 출력됩니다. The second line is outputted when the ACPI HPET table is mapped into memory by …/arch/x86/kernel/acpi/boot.c . 두번째 라인은 arch/x86/kernel/acpi/boot.c /는 출력했을 때 ACPI가에 매핑된 테이블의 HPET는 기억으로 .... The next line is outputted when the HPET legacy interrupts are started and HPET is registered as the global clock. 다음 줄에 때 HPET 레거시 인터럽트가 시작하는 HPET는 글로벌 클럭으로 등록되어 출력됩니다. The following line is outputted when the kernel checks to ensure that at least one timer is reserved for userspace ( /dev/hpet .) The next two lines of output comes from the HPET device driver ( …/drivers/char/hpet.c .) It shows that 2 timers have allocated interrupts and two do not.. 다음 명령줄은 hpet을 /는 출력했을 때 dev에 / 커널에 검사하도록 그 (userspace 적어도 하나의 타이머가있다 소유하십시오.) 두 라인의 출력은 다음 hpet.c / 오는에서 HPET 장치 드라이버 (... / 메기 드라이버 /. ) 그것은 2 타이머 및 인터럽트 할당 말해주 두 안 ..

Here is the relevant part of the output from /proc/time_list as it relates to HPET: 여기 HPET 얽혀있로 / time_list proc 디렉토리는 관련 / 부분부터 출력 :

Tick Device: mode:     1
Broadcast device
Clock Event Device: hpet
 max_delta_ns:   149983005959
 min_delta_ns:   5000
 mult:           61496114
 shift:          32
 mode:           3
 next_event:     9223372036854775807 nsecs
 set_next_event: hpet_legacy_next_event
 set_mode:       hpet_legacy_set_mode
 event_handler:  tick_handle_oneshot_broadcast
tick_broadcast_mask: 00000000
tick_broadcast_oneshot_mask: 00000000


Here is the output from /proc/sys/dev/hpet and /proc/driver/rtc : 여기 RTC 드라이버 / /는 출력에서 / proc 디렉토리 /에서 sys / dev에 proc 디렉토리 / hpet/ :

$ cat /proc/sys/dev/hpet/max-user-freq
64
$ cat /proc/driver/rtc
rtc_time	: 06:34:31
rtc_date	: 2009-07-06
alrm_time	: **:24:40
alrm_date	: ****-**-**
alarm_IRQ	: no
alrm_pending	: no
24hr		: yes
periodic_IRQ	: no
update_IRQ	: no
HPET_emulated	: yes
DST_enable	: no
periodic_freq	: 1024
batt_status	: okay

The HPET driver ( /dev/hpet ) has a similar API to the Real Time Clock driver. HPET 드라이버 (는 / dev / hpet) 드라이버 리얼 타임 클록이 비슷한 API를합니다. It is a character device which can support any number of HPET devices. 그것은 HPET 장치의 어떤 숫자를 지원할 수있는 문자 장치입니다. The kernel API has three interfaces exported from the driver: 커널 API는 세 가지 인터페이스를 드라이버에서 내보낸 있습니다 :

hpet_register( struct hpet_task *tp, int periodic )
hpet_unregister( struct hpet_task *tp )
hpet_control( struct hpet_task *tp, unsigned int cmd, unsigned long arg )


The userspace interface to HPET is defined in the header /usr/include/linux/hpet.h . 인터페이스에 HPET userspace의 hpet.h /에 정의된 / 리눅스 포함 헤더를 / usr을 /. The current set of supported operations is: 지원되는 작업의 현재 설정이 있습니다 :

#define HPET_IE_ON      _IO('h', 0x01)                        /* interrupt on */
#define HPET_IE_OFF     _IO('h', 0x02)                        /* interrupt off */
#define HPET_INFO       _IOR('h', 0x03, struct hpet_info)     /* get information */
#define HPET_EPI        _IO('h', 0x04)                        /* enable periodic */
#define HPET_DPI        _IO('h', 0x05)                        /* disable periodic */
#define HPET_IRQFREQ    _IOW('h', 0x6, unsigned long)         /* set frequency */


The following example shows how to use the published interface to access a HPET and call a simple periodic signal handler hpet_alarm between 2 and 99 times a second. 다음 예제는 보여줍 출판 방법을 사용하여 액세스하는 인터페이스를 HPET 하고 핸들러를 호출하는 간단한 정기 신호 hpet_alarm 두 번째 사이에 2 99 회.

#include <stdio.h>
#include <stdlib.h;>
#include <fcntl.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/time.h>
#include <linux/hpet.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <signal.h>

static uint16_t hpet_sigio_count;
static uint64_t secs;

static void
hpet_alarm(int val)
{
   struct timespec t;
   clock_gettime(CLOCK_REALTIME, &t);

   if (!secs)  secs = t.tv_sec;

   fprintf(stderr, "hpet_alarm called. iteration: %2d  secs: %ld  nsecs: %ld \n",
                    hpet_sigio_count, (t.tv_sec - secs) , t.tv_sec * 100000 + t.tv_nsec );

   hpet_sigio_count++;
}

int
main(int argc, const char **argv)
{
    struct sigaction old, new;
    struct hpet_info info;
    int              frequency;
    int              iterations;
    int              retval = 0;
    int              fd;
    int              r, i, value;

    if (argc != 3) {
        fprintf(stderr, "Usage: %s frequency(1-64) iterations(10-99)\n", argv[0]);
        return -1;
    }

    frequency = atoi(argv[1]);
    iterations = atoi(argv[2]);

    if (frequency > 64 || frequency < 1 ) {
        fprintf(stderr, "ERROR: Invalid value for frequency\n");
        return -1;
    }

    if (iterations < 10 || iterations > 99 ) {
        fprintf(stderr, "ERROR: Invalid value for iterations\n");
        return -1;
    }

    hpet_sigio_count = 0;

    sigemptyset(&new.sa_mask);
    new.sa_flags = 0;
    new.sa_handler = hpet_alarm;

    sigaction(SIGIO, NULL, &old);
    sigaction(SIGIO, &new, NULL);

    fd = open("/dev/hpet", O_RDONLY);
    if (fd < 0) {
        fprintf(stderr, "ERROR: Failed to open /dev/hpet\n");
        return -1;
    }

    if ((fcntl(fd, F_SETOWN, getpid()) == 1) ||
        ((value = fcntl(fd, F_GETFL)) == 1) ||
        (fcntl(fd, F_SETFL, value | O_ASYNC) == 1)) {
        fprintf(stderr, "ERROR: fcntl failed\n");
        retval = 1;
        goto fail;
    }

    if (ioctl(fd, HPET_IRQFREQ, frequency) < 0) {
        fprintf(stderr, "ERROR: Could not set /dev/hpet to have a %2dHz timer\n", frequency);
        retval = 2;
        goto fail;
    }

    if (ioctl(fd, HPET_INFO, &info) < 0) {
        fprintf(stderr, "ERROR: failed to get info\n");
        retval = 3;
        goto fail;
    }

    fprintf(stdout, "\nhi_ireqfreq: 0x%lx  hi_flags: %0x%lx  hi_hpet: 0x%x  hi_timer: 0x%x\n\n",
            info.hi_ireqfreq,  info.hi_flags, info.hi_hpet, info.hi_timer);

    r = ioctl(fd, HPET_EPI, 0);
    if (info.hi_flags && (r < 0)) {
        fprintf(stderr, "ERROR:  HPET_EPI failed\n");
        retval = 4;
        goto fail;
    }

    if (ioctl(fd, HPET_IE_ON, 0) < 0) {
        fprintf(stderr, "ERROR: HPET_IE_ON failed\n");
        retval = 5;
        goto fail;
    }

    /* wait for specified number of signal interrupts */
    for (i = 0; i < iterations; i++) {
        (void) pause();
    }

    if (ioctl(fd, HPET_IE_OFF, 0) < 0) {
        fprintf(stderr, "ERROR: HPET_IE_OFF failed\n");
        retval = 6;
    }

fail:
    sigaction(SIGIO, &old, NULL);

    if (fd > 0)
        close(fd);

    return retval;
}


Here is the output from this example when it is invoked with a frequency of 32 and an iteration count of 64. 여기 예제가 32 주파수 및 64의 반복 카운트 호출의 출력입니다.

$ sudo ./hpet_example 32 64

hi_ireqfreq: 0x20  hi_flags: 00  hi_hpet: 0x2  hi_timer: 0x4a1cb9c8

hpet_alarm called. iteration:  0  secs: 0  nsecs: 124683205055050
hpet_alarm called. iteration:  1  secs: 0  nsecs: 124683236313149
hpet_alarm called. iteration:  2  secs: 0  nsecs: 124683267566342
hpet_alarm called. iteration:  3  secs: 0  nsecs: 124683298821905
hpet_alarm called. iteration:  4  secs: 0  nsecs: 124683330077493
hpet_alarm called. iteration:  5  secs: 0  nsecs: 124683361341893
hpet_alarm called. iteration:  6  secs: 0  nsecs: 124683392590764
hpet_alarm called. iteration:  7  secs: 0  nsecs: 124683423849157
hpet_alarm called. iteration:  8  secs: 0  nsecs: 124683455101917
hpet_alarm called. iteration:  9  secs: 0  nsecs: 124683486357683
hpet_alarm called. iteration: 10  secs: 0  nsecs: 124683517617931
hpet_alarm called. iteration: 11  secs: 0  nsecs: 124683548872198
hpet_alarm called. iteration: 12  secs: 1  nsecs: 124682580229541
hpet_alarm called. iteration: 13  secs: 1  nsecs: 124682611481235
hpet_alarm called. iteration: 14  secs: 1  nsecs: 124682642740016
hpet_alarm called. iteration: 15  secs: 1  nsecs: 124682673992697
hpet_alarm called. iteration: 16  secs: 1  nsecs: 124682705247479
hpet_alarm called. iteration: 17  secs: 1  nsecs: 124682736504664
hpet_alarm called. iteration: 18  secs: 1  nsecs: 124682767758840
hpet_alarm called. iteration: 19  secs: 1  nsecs: 124682799014280
hpet_alarm called. iteration: 20  secs: 1  nsecs: 124682830270129
hpet_alarm called. iteration: 21  secs: 1  nsecs: 124682861530334
hpet_alarm called. iteration: 22  secs: 1  nsecs: 124682892784577
hpet_alarm called. iteration: 23  secs: 1  nsecs: 124682924038220
hpet_alarm called. iteration: 24  secs: 1  nsecs: 124682955294110
hpet_alarm called. iteration: 25  secs: 1  nsecs: 124682986550572
hpet_alarm called. iteration: 26  secs: 1  nsecs: 124683017805756
hpet_alarm called. iteration: 27  secs: 1  nsecs: 124683049061117
hpet_alarm called. iteration: 28  secs: 1  nsecs: 124683080318331
hpet_alarm called. iteration: 29  secs: 1  nsecs: 124683111576954
hpet_alarm called. iteration: 30  secs: 1  nsecs: 124683142828988
hpet_alarm called. iteration: 31  secs: 1  nsecs: 124683174083954
hpet_alarm called. iteration: 32  secs: 1  nsecs: 124683205337967
hpet_alarm called. iteration: 33  secs: 1  nsecs: 124683236593144
hpet_alarm called. iteration: 34  secs: 1  nsecs: 124683267851530
hpet_alarm called. iteration: 35  secs: 1  nsecs: 124683299104054
hpet_alarm called. iteration: 36  secs: 1  nsecs: 124683330358748
hpet_alarm called. iteration: 37  secs: 1  nsecs: 124683361617445
hpet_alarm called. iteration: 38  secs: 1  nsecs: 124683392870249
hpet_alarm called. iteration: 39  secs: 1  nsecs: 124683424124489
hpet_alarm called. iteration: 40  secs: 1  nsecs: 124683455379717
hpet_alarm called. iteration: 41  secs: 1  nsecs: 124683486634424
hpet_alarm called. iteration: 42  secs: 1  nsecs: 124683517889149
hpet_alarm called. iteration: 43  secs: 1  nsecs: 124683549144315
hpet_alarm called. iteration: 44  secs: 2  nsecs: 124682580500695
hpet_alarm called. iteration: 45  secs: 2  nsecs: 124682611761325
hpet_alarm called. iteration: 46  secs: 2  nsecs: 124682643011863
hpet_alarm called. iteration: 47  secs: 2  nsecs: 124682674265864
hpet_alarm called. iteration: 48  secs: 2  nsecs: 124682705521034
hpet_alarm called. iteration: 49  secs: 2  nsecs: 124682736776049
hpet_alarm called. iteration: 50  secs: 2  nsecs: 124682768030654
hpet_alarm called. iteration: 51  secs: 2  nsecs: 124682799285398
hpet_alarm called. iteration: 52  secs: 2  nsecs: 124682830544701
hpet_alarm called. iteration: 53  secs: 2  nsecs: 124682861797319
hpet_alarm called. iteration: 54  secs: 2  nsecs: 124682893051578
hpet_alarm called. iteration: 55  secs: 2  nsecs: 124682924306748
hpet_alarm called. iteration: 56  secs: 2  nsecs: 124682955562132
hpet_alarm called. iteration: 57  secs: 2  nsecs: 124682986823545
hpet_alarm called. iteration: 58  secs: 2  nsecs: 124683018073636
hpet_alarm called. iteration: 59  secs: 2  nsecs: 124683049327560
hpet_alarm called. iteration: 60  secs: 2  nsecs: 124683080586707
hpet_alarm called. iteration: 61  secs: 2  nsecs: 124683111841132
hpet_alarm called. iteration: 62  secs: 2  nsecs: 124683143095147
hpet_alarm called. iteration: 63  secs: 2  nsecs: 124683174349985
hpet_alarm called. iteration: 64  secs: 2  nsecs: 124683205607103
$


Well, I think that I have provided you with enough information so that you should now be able to go away and experiment with the HPET interface yourself. 글쎄, 난 내가 충분한 정보와 그래서 당신이 지금 멀리 가서 HPET 인터페이스 스스로 실험 수 있어야합니다 당신을 제공한 것.

By the way, not all VMware products support HPET. 그건 그렇고, 모든웨어 제품 지원 HPET. Currently ESX does not provide a virtual HPET to guest operating systems and in some cases it may be necessary to disable HPET altogether because of timer drift in virtual machines. 현재 ESX 게스트 운영 체제 및 일부 경우에 그것을 해제하는 데 필요한 전체 HPET 타이머 드리프트 때문에 가상 머신에있을 수있는 가상 HPET를 제공하지 않습니다. See 보기 VMware TimeKeeping VM웨어는 측정 for more information. 자세한 내용은.

PS I tested the the above example on an Intel DX48BT2 motherboard running a 2.6.29.5-191 kernel. 추신 : 전 인텔 DX48BT2 메인 보드 2.6.29.5-191 커널을 실행하는 위의 예제를 테스트했습니다.

Leave a Comment 코멘트를 남겨주세요