업데이트를 하거나 쓰지 않는게 답인 듯 하다.


Ubuntu 10.10 (Maverick Meerkat) end-of-life reached on April 10, 2012

This note is just to confirm that the support period for Ubuntu 10.10 (Maverick Meerkat) formally ends on April 10, 2012 and Ubuntu Security Notices no longer includes information or updated packages for Ubuntu 10.10.

The supported upgrade path from Ubuntu 10.10 is via Ubuntu 11.04 (Natty Narwhal). Instructions and caveats for the upgrade may be found at https://help.ubuntu.com/community/NattyUpgrades. Note that upgrades to version 11.04 and beyond are only supported in multiple steps, via an upgrade first to 11.04, then to 11.10. Both Ubuntu 11.04 and Ubuntu 11.10 continue to be actively supported with security updates and select high-impact bug fixes. All announcements of official security updates for Ubuntu releases are sent to the ubuntu-security-announce mailing list, information about which may be found athttps://lists.ubuntu.com/mailman/listinfo/ubuntu-security-announce.

Since its launch in October 2004 Ubuntu has become one of the most highly regarded Linux distributions with millions of users in homes, schools, businesses and governments around the world. Ubuntu is Open Source software, costs nothing to download, and users are free to customize or alter their software in order to meet their needs.

Originally posted to the ubuntu-announce mailing list by Kate Stewart on Tue Apr 10 15:39:12 UTC 2012




출처 : http://fridge.ubuntu.com/2012/04/10/ubuntu-10-10-maverick-meerkat-end-of-life-reached-on-april-10-2012/

'Embedded Lab > linux, x86' 카테고리의 다른 글

[우분투에서 monaco 폰트 설정]  (0) 2014.04.27
[ln 명령어]  (0) 2014.02.06
[특수문자표]  (0) 2013.11.04
[GFS(Google File System)]  (0) 2013.10.28
[top 명령어]  (0) 2013.10.23
Posted by cyj4369
,

Ubuntu 에서 추가 글꼴 설정하기.

[#1] 폰트 다운로드


[#2] Font 설정

sudo mkdir /usr/share/fonts/truetype/custom/
sudo cp *.ttf /usr/share/fonts/truetype/custom/
sudo fc-cache -f -v

Ubuntu 11.04 에서는 antialias true 로 enable 되어 있어서 추가로 설정하지 않아도 되는듯…

[#3] 적용





[#4] Emacs 에서 monaco font 설정

다른 글을 보니깐 아래와 같이 하면 된다고 하던데…

echo “Emacs.font: Monaco-10″ > ~/.Xresources
xrdb -merge ~/.Xresources

잘 안 되는 듯 하여, emacs configuration file 에 font 설정하도록 추가.
덕분에 gitHub 사용법 좀더 찾아보고 https://github.com/tkhwang/tkhwang-dotemacs 에도 update 완료. :)

(if (eq system-type 'gnu/linux)
    (progn
      (setq initial-frame-alist '((top . 10) (left . 100)))
      (setq default-frame-alist
        (append
         '(
           (font . "-*-Monaco-normal-normal-normal-*-13-*-*-*-m-0-iso10646-1")
           (width . 140)
           (height . 80)
           )
         default-frame-alist))))



출처 : http://tkhwang.pe.kr/humblecoding/archives/680

'Embedded Lab > linux, x86' 카테고리의 다른 글

[우분투 10.10 maveric apt-get update 에러]  (0) 2014.05.04
[ln 명령어]  (0) 2014.02.06
[특수문자표]  (0) 2013.11.04
[GFS(Google File System)]  (0) 2013.10.28
[top 명령어]  (0) 2013.10.23
Posted by cyj4369
,

이번에 고생 했던 EEPROM M95512 이제는 잘 동작 한다~

 

#define WRSR  0x01 //Write Status Register
#define WRITE 0x02 //Write to Memory Array 
#define READ  0x03 //Read from Memory Array
#define WRDI  0x04 //Write Disable
#define RDSR  0x05 //Read Status Register
#define WREN  0x06 //Write Enable
#define DUMMY 0x00 //DUMMY BYTE
  
#define EEPROM_CS_LOW()  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
#define EEPROM_CS_HIGH()  GPIO_SetBits(GPIOB, GPIO_Pin_0);

void SPI_Config(void);
uint8_t SPI_SendByte(uint8_t Data);
uint8_t SPI_Flash_Read(uint16_t address);
void SPI_Flash_Write(uint16_t address, uint8_t data);

 

 

/* Includes ------------------------------------------------------------------*/
#include "stdio.h"
#include "stm32f10x.h"
#include "M95512.h"

void SPI_Config(void)
{
  SPI_InitTypeDef SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  SPI_Cmd(SPI1, DISABLE); 
  SPI_I2S_DeInit(SPI1);
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, DISABLE); 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
      
  /* Enable SPI clock, SPI1 */ 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50 MHz
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  // Configure CS pin as output floating
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* SPI configuration -------------------------------------------------------*/
  EEPROM_CS_HIGH();
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
  SPI_Cmd(SPI1, ENABLE); 
}

uint8_t SPI_SendByte(uint8_t Data)
{
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  SPI_I2S_SendData(SPI1, Data); 
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
  return SPI_I2S_ReceiveData(SPI1);
}


static void M95512_WREN(void)
{//0x06 Write Enable
  EEPROM_CS_LOW(); 
  SPI_SendByte(WREN); 
  EEPROM_CS_HIGH();
}

static void M95512_WRDI(void)
{//0x04 Write Disable
  EEPROM_CS_LOW(); 
  SPI_SendByte(WRDI); 
  EEPROM_CS_HIGH();
}

static void M95512_RDSR(void)
{//0x05 Read Status Register
  unsigned char data_H, data_L;
  unsigned int data = 0;
  
  EEPROM_CS_LOW();  
  SPI_SendByte(RDSR); 
//  data_H = SPI_ReadByte();  
//  data_L = SPI_ReadByte();
  EEPROM_CS_HIGH();
  data = (data_H << 1) + (data_L << 7);     
}

static void M95512_WRSR(unsigned char reg)
{//0x01 Write Status Register
  EEPROM_CS_LOW();  
  SPI_SendByte(WRSR);
  SPI_SendByte(reg);  
  EEPROM_CS_HIGH(); 
}

uint8_t SPI_Flash_Read(uint16_t address)
{
  uint8_t data;
  
   EEPROM_CS_LOW();
  SPI_SendByte(READ);
  SPI_SendByte((address & 0xFF00) >> 8);
  SPI_SendByte(address & 0xFF);
  data = SPI_SendByte(DUMMY);
  EEPROM_CS_HIGH();
  return data;

   
void SPI_Flash_Write(uint16_t address, uint8_t data)
{
  M95512_WREN();
 
  EEPROM_CS_LOW();
  SPI_SendByte(WRITE);          // Send SPI instruction 
  SPI_SendByte((address & 0xFF00) >> 8);  // Send SPI address MSB
  SPI_SendByte(address & 0xFF);           // Send SPI address LSB
  SPI_SendByte(data);           // Send SPI Write data(Byte)
  EEPROM_CS_HIGH();
}

 

위와 같이 하여 놓고

main에서

  SPI_Flash_Write(0x0000,0x11);
  SPI1_READ_DATA = SPI_Flash_Read(0x0000);

사용하면 데이타가 잘 들어 온다~

'Embedded Lab > ARM' 카테고리의 다른 글

[STM32 : SPI, using chip select]  (0) 2014.03.05
[SWI의 진실]  (0) 2013.03.22
[논리 스프트와 산술 시프트의 차이]  (0) 2013.03.20
Posted by cyj4369
,
int main(void)
{
 char Received_From_device[500] = "";        // Maximum data from device of 500 bytes
 //char character[10] = "";
    char ETX_character;
 int i,a,lazy_timeout_counter,lazy_timeout_max,tmp,adc_value;
 char c;
  
  RCC_Configuration();
  
  GPIO_Configuration();
 
  SPI2_Configuration();   //SPI configure
  
  USART1_Configuration();
 
   GPIO_SetBits(GPIOB, GPIO_Pin_12);   //set Chip Select HIGH for SPI
  
 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // Wait for Empty
  
    USART_SendData(USART1, 0x49); // Send 'I'
 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, 0x42); // Send 'B'
SPI_Loop:
 Delay(1000);    //1second delay
 
 //goto Jump2Here;
 
 //Select CH0 of LTC2492
 
 GPIO_ResetBits(GPIOB, GPIO_Pin_12); // Assert -CS
 Delay_us(10); // overkill
 
// You need semicolons after the whiles otherwise they repeat the next statement
 
 while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == 0); //wait for transmit buffer to be empty, should be
 
 SPI_I2S_ReceiveData(SPI2); // Clear RXNE
 SPI_I2S_SendData(SPI2, LTC_Internal_Temperature_select); //LTC_Internal_Temperature_select
 while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == 0); //wait for transmit buffer to not be empty (ie data loaded in)
 SPI_I2S_SendData(SPI2, 0); // Fill for 32-bits, remaining 16-bits in holding buffer
 
 while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == 0); // wait for last bit to be sent
 SPI_I2S_ReceiveData(SPI2); // Clear RXNE, first word
 while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == 0); // wait for last bit to be sent
 SPI_I2S_ReceiveData(SPI2); // Clear RXNE, second word
 
 Delay_us(10);
 GPIO_SetBits(GPIOB, GPIO_Pin_12); // Release -CS
 
 
 Delay(1000);    //1second delay
 
 
 //await result readable via SPI and read in result via SPI   two 16bit reads over SPI
 
 GPIO_ResetBits(GPIOB, GPIO_Pin_12); // Assert -CS
 Delay_us(10); // overkill
 
 while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == 0); // should be empty
 
 SPI_I2S_ReceiveData(SPI2);  // clear RXNE
 SPI_I2S_SendData(SPI2, LTC_Internal_Temperature_select); // send command word
 while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == 0); //wait for transmit buffer to not be empty (ie data loaded in)
 SPI_I2S_SendData(SPI2, 0); // Fill for 32-bits, remaining 16-bits in holding buffer
 while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == 0);
 tmp = SPI_I2S_ReceiveData(SPI2);  // read word from receive buffer, high order 16-bits
 adc_value =  tmp * 65536;
 while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == 0);  // wait until receive buffer is not empty
 tmp = SPI_I2S_ReceiveData(SPI2);  // read word from receive buffer, low order 16-bits
 adc_value = adc_value + tmp;
 
 Delay_us(10);
 GPIO_SetBits(GPIOB, GPIO_Pin_12); // Release -CS
 
  
 
  
 
Jump2Here:
 //send result via RS232
 
 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, 0x43); // Send 'C'
 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, 0x48); // Send 'H'
 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, 0x30); // Send '0'
 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, 0x3A); // Send ':'
 
 // Sends as binary, not ascii
 //adc_value = 1234567890;
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, ((adc_value >> 24) & 0xFF));
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, ((adc_value >> 16) & 0xFF));
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, ((adc_value >>  8) & 0xFF));
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, ((adc_value >>  0) & 0xFF));
 
 //goto SPI_Loop;
 
 while (1);
}


'Embedded Lab > ARM' 카테고리의 다른 글

[STM32 : SPI, using chip select2]  (0) 2014.03.05
[SWI의 진실]  (0) 2013.03.22
[논리 스프트와 산술 시프트의 차이]  (0) 2013.03.20
Posted by cyj4369
,

ln 명령은 파일을 링크할 때 사용하는 명령입니다.

리눅스 시스템 상에는 심볼릭링크와 하드링크 두가지의 링크가 있습니다.

 

심볼릭링크는 원본파일을 가리키도록 링크만 시켜둔 것으로 윈도우의 바로가기와 같다고 보시면 됩니다. 심볼릭링크는 원본파일이 삭제되면 링크파일은 작동하지 않게 됩니다.

 

하드링크는 원본파일과 이름은 다르지만 동일한 파일입니다. 하드링크에서는 원본파일이나 링크파일 둘중의 하나가 삭제되더라도 나머지 하나는 그대로 남아 정상 동작 합니다. 또한 하드링크는 원본파일의 내용이 변경될 경우에 링크파일의 내용도 자동으로 변경됩니다.

 

명령어 위비: /bin/ln

사용형식 : ln [옵션] 원본파일 대상파일

             ln [옵션] 원본파일 대상디렉토리

옵션

-b, --backup : 대상파일이 이미 존재할 경우 백업파일을 만든 후에 링크파일을 생성

-d, -F, --directory : 디렉토리에 대한 하드링크파일 생성을 가능하게함

-f : 대상파일이 존재할 경우 대상파일을 지우고 링크파일을 생성

-i : 대상파일이 존재할 경우 대상파일을 지울 것인가 확인하게함

-s : 심볼릭링크파일을 생성

-S : 만약에 대상이 이미 있어서 백업을 해야 할 경우에 그 백업파일에서 사용 할 파일이름의

      접미사(suffix)를 지정할 수 있음

-t, --target-directory=DIRECTORY : 링크파일을 생성할 디렉토리를 지정

 

예1) ln 명령어를 사용하여 하드링크 생성하기

우선 hard_source 파일을 hard_link 파일로 하드링크 시킨 후 두 파일의 내용을 확인해 보도록 하겠습니다.

 

#ln hard_source hard_link

#

#ls -l

합계 12
-rw-r--r-- 2 root root 15  7월 19 21:54 hard_link

-rw-r--r-- 2 root root 15  7월 19 21:54 hard_source

 

#cat hard_source

linux

network

windows

 

#cat hard_link

linux

network

windows

 

위에서 보시는 것과 같이 두파일의 내용이 동일하다는 것을 알 수 있습니다.

이번에는 원본파일 내용의 첫행을 지운뒤 링크파일과 비교해 보도록 하겠습니다.

 

#cat hard_source

network

windows

 

#cat hard_link

network

windows

 

위와 같이 원본파일만 수정했는데도 링크된 파일의 내용도 같이 수정됨을 확인 할 수 있습니다.

 

 

예2)심볼릭링크 사용하기

심볼릭링크를 사용하기 위해서는 -s 옵션을 사용해야 합니다.

sym_source 파일을 만든뒤 sym_link 파일로 심볼릭링크 시키도록 하겠습니다.

 

#ln -s sym_source sym_link

#ls -l

lrwxrwxrwx 1 root root 14  7월 19 22:09 sym_link -> sym_source

-rw-r--r-- 1 root root 22  7월 19 22:09 sym_source

 

여기서 확인하고 넘어가야 할 부분은 심볼릭링크된 파일의 퍼미션이 하드링크일때와는 다르게

lrwxrwxrwx 이라는 것과 -> 로 원본을 가리켜 심볼릭링크된 파일이라는 것을 확인 할 수있게 해줍니다.

 

[출처] ln 명령어|작성자 김동훈



출처 : http://blog.naver.com/PostView.nhn?blogId=ehdgns621&logNo=130056448055

'Embedded Lab > linux, x86' 카테고리의 다른 글

[우분투 10.10 maveric apt-get update 에러]  (0) 2014.05.04
[우분투에서 monaco 폰트 설정]  (0) 2014.04.27
[특수문자표]  (0) 2013.11.04
[GFS(Google File System)]  (0) 2013.10.28
[top 명령어]  (0) 2013.10.23
Posted by cyj4369
,

ㆍ⦁∎◦∘∙⋅▪▫■○▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉

ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ

ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ

 

⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇

⓪①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳

㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿



❶❷❸❹❺❻❼❽❾❿⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴

➊➋➌➍➎➏➐➑➒➓

 

㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍         ㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭

㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛         ㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻

 

㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩                      ㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉

 

㈪㈫㈬㈭㈮㈯㈰                                ㊊㊋㊌㊍㊎㊏㊐

㋀㋁㋂㋃㋄㋅㋆㋇㋈㋉㋊㋋

㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾

 

[화폐기호] ==================================================================

¢£¥₩₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱

 

[로마자]=====================================================================

ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯↀↁↂ

ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿ

 

[분수]========================================================================

¼½¾⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞

 

[원, 괄호 한자, 일어]===========================================================

㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿㉀㉁㉂㉃

㊑㊒㊓㊔㊕㊖㊗㊘㊙㊚㊛㊜㊝㊞㊟㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰

㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯

㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾

 

[화살표]=====================================================================

←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳

➔➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾

⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓

⤔⤕⤖⤗⤘⤙⤚⤛⤜⤝⤞⤟⤠⤡⤢⤣⤤⤥⤦⤧⤨⤩⤪⤫⤬⤭⤮⤯⤰⤱⤲⤳⤴⤵⤶⤷⤸⤹⤺⤻⤼⤽⤾⤿⥀⥁

⥂⥃⥄⥅⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩⥪⥫⥬⥭⥮⥯⥰⥱⥲⥳⥴⥵⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿

¬ ̄¦￧│←↑→↓

 

[수학기호, 연산자]============================================================

∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱

⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿

 

[단위 기호 모음]==============================================================

㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝

 

[기타 기호 모음]==============================================================

㈜㉿〄

☎☏☐☑☒☓

♠♡♢♣♤♥♦

♲♳♴♵♶♷♸♹♺♻♼☢

♩♪♫♬♭♮♯♰♱

☼☀☽☾☁☂☃☄★☆☇☈☉☊☋☌☍

✓✔✕✖✗✘

✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋

‐‑‒–—―‖‗‘’‚‛“”„‟†‡•‣․‥…‧‰‱′″‴‵‶‷‸‹›※‼‽‾‿⁀⁁⁂⁃⁄⁅⁆⁇⁈⁉⁑

▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕

■□▢▣▤▥▦▧▨▩▬▭▮▯▰▱◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◧◨◩◪◫◬◭◮◯

☖☗☚☛☜☝☞☟☠☡☣☤☥☦☧☨☩☪☫☬☭☮☯

☰☱☲☳☴☵☶☷

☸☹☺☻☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♧♨

✁✂✃✆✇✈✉✌✍✎✏✐✑✒❍❏❐❑❒❖❘❙❚❛❜❝❞❡❢❣❤❥❦❧

⦅⦆⦿⧺⧻⧼⧽⧾

⨀⨁⨂⨃⨄⨅⨆⨇⨈⨉

、。〃々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡〢〣〤〥〦〧〨

〩〪〱〲〳〴〵〶〷〸〹〺〻〼〽〾〿

゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネ

ノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ

 

︰︱︲︳︴︵︶︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹅﹆﹇﹈﹉﹊﹋﹌﹍﹎﹏

﹐﹑﹒﹓﹔﹕﹖﹗﹘﹙﹚﹛﹜﹝﹞﹟﹠﹡﹢﹣﹤﹥﹦﹧﹨﹩﹪﹫

'Embedded Lab > linux, x86' 카테고리의 다른 글

[우분투에서 monaco 폰트 설정]  (0) 2014.04.27
[ln 명령어]  (0) 2014.02.06
[GFS(Google File System)]  (0) 2013.10.28
[top 명령어]  (0) 2013.10.23
[커널스택]  (0) 2013.08.13
Posted by cyj4369
,

GFS는 구글이 만든 분산 파일시스템입니다. Hadoop의 HDFS(Hadoop Distributed File System)는 GFS를 기반으로 만들어졌습니다.

Key Design Goals

* Component failures are the norm rather than the exception
GFS는 수천개의 값싼 PC로 이루어진 클러스터 위에서 동작할 것을 가정하고 만들어졌습니다.
한두개의 하드 디스크 불량이나 네트워크 문제에도 서비스는 원활하게 돌아가야 합니다.

* Files are huge
GFS는 수 GB 단위의 큰 파일에 특화된 파일시스템입니다. 작은 파일도 저장할 수는 있지만 많은 숫자의 작은 파일에는 효율적이지 않습니다.
때문에 64KB의 큰 block size를 이용합니다. (FAT/NTFS/ext3 등에서는 1KB~4KB 정도입니다.)

* Modify / Delete are rare
GFS는 구글이 사용하는 DBMS인 BigTable을 염두에 두고 설계되었습니다.
이 시스템의 특징은 file의 read / append가 집중적으로 이루어지며, modify / delete는 거의 없다는 것입니다. append 또한 sequential하게 이루어지는 경우가 많습니다.

* High Bandwidth over Fast Response
GFS는 응답시간보다는 높은 대역폭에 더 특화되어 있습니다.
몇몇 application은 빠른 응답시간을 필요로 하지만, 그보다 많은 application이 bulk data processing을 필요로 한다고 가정하고 있습니다.

Interface

일반적인 파일시스템과 같이 create, delete, open, close, read, write 등의 연산을 지원합니다.
그 외에 중요한 것으로 snapshot과 record append 연산이 있습니다.
snapshot은 현재 파일과 디렉토리의 copy를 빠른 시간 안에 만들어 냅니다.
record append는 여러 개의 client가 같은 파일에 동시에 접근하여 atomic append 연산을 할 수 있도록 지원합니다.
이로서 multi-way merge나 producer-consumer queue를 별도의 lock 없이 구현할 수 있습니다.

File Structure

파일은 여러 개의 블록으로 나누어 저장됩니다.
GFS는 각각의 블록을 chunk라고 부르며, 시스템 내부적으로 chunk는 고정된 크기(64MB)의 linux file로 저장됩니다.
각각의 chunk에는 64bit integer로 된 unique한 handle이 붙어 있습니다.

Architecture

GFS는 한 개의 master server와 여러 개의 chunkserver로 구성되어 있습니다.
master server와 chunkserver는 user-level linux process이며, 원한다면 master와 chunkserver를 같은 시스템에서 돌릴 수도 있습니다.
master는 각각의 파일과 chunk의 일련번호를 관리하고, 일정한 주기로 Heartbeat 신호를 보내 chunkserver가 살아있는지를 점검하며, access control을 관리하는 등의 일을 합니다. 파일시스템의 관리를 위한 metadata는 접근속도를 위해 master의 메인 메모리에 저장됩니다.
chunkserver는 각각의 chunk를 저장하는데, 한두대의 chunkserver가 죽어도 서비스가 유지되도록 여러 개의 chunkserver에 chunk의 사본이 3개 저장됩니다.

Client

API를 통해 GFS에 접근하는 프로그램을 client라고 부릅니다.
관리와 consistency 문제를 단순화하기 위해 전체 시스템에 master는 하나뿐이지만, master가 병목이 되는 것을 막기 위해 데이터 전송은 master를 통해서 이루어지지 않습니다.
예를 들어 client가 파일을 읽기 위해 파일 이름과 chunk 번호를 master에 전송하면, master는 client에 chunk의 복사본이 있는 위치와 handle을 반환합니다. client가 그 중 가까운 chunk server에 다시 요청을 전송하면, chunk server가 client에 데이터를 직접 전송합니다.

Metadata

master가 저장하는 metadata는 세가지입니다. 파일의 namespace(access control, 파일이름, 디렉토리 구조 등 일반적인 파일시스템이 갖는 정보), 파일과 chunk handle 사이의 mapping, 각각의 chunk 사본의 위치입니다. 모든 metadata는 master의 메인 메모리에 저장되며, 앞의 두 가지(namespace와 mapping)는 log의 형태로 디스크에도 저장됩니다. 디스크에 저장되는 정보를 log로 제한함으로서 master의 동작을 단순화할 수 있고, master가 다운되었을 때도 복원이 가능합니다.

 

==========================================================================================================================

 

GFS(Google File System)은 Hadoop의 HDFS에 대응한는 파일 시스템이다.

특징

  • very large
  • replicated
  • detect failure, recover algorithm
  • batch processing
  • single name space node(==directory), master징
  • java application
  • 일반 파일 시스템과 동일한 인터페이스 제공 : create, delete, open, close...
  • 파일 입력시, appen만 제공하는 것이 특징
  • os와 무관한 user level app, linux vnode layer 접근 불가

CHUNK

  • 파일은 고정 크기(64MB)의 chunk로 나눠짐
  • 하나의 chunk는 여러 chunkserver에 중복 저장
  • 장점
    • Master와 interection 줄일 수 있다.
    • TCP connection 줄일 수 있다.
    • Matadata 줄일 수 있다.
  • 단점
    • file의 크기가 chunk보다 작을 경우, 비효율적

구조

  • Master Server 
    • 메모리 상에 Matadata 로딩
    • Chunk Server와 heartbeat(Chunk Server들의 생사 확인)로 통신
  • Chunk Servers : 
    • File data 저장
  • GFS Client
    • Master Server와 Chunk Server와 통신하며 appication에 file system API제공
    • Master Server의 Matadata로 원하는 파일을 가지고 있는 Chunk Server의 위치 확인
    • Chunk Server로부터 데이터 교류

operation log file

  • Directory structure의 persistence 유지
  • Master Server는 operation log file을 replay함으로 file system복구 가능

    [출처] GFS (Google File System)|작성자 누룽지

출처 : http://blog.naver.com/PostView.nhn?blogId=say501&logNo=110082677976

'Embedded Lab > linux, x86' 카테고리의 다른 글

[ln 명령어]  (0) 2014.02.06
[특수문자표]  (0) 2013.11.04
[top 명령어]  (0) 2013.10.23
[커널스택]  (0) 2013.08.13
[커널 예전 버전 받기]  (0) 2013.08.06
Posted by cyj4369
,


1초단위로  5초동안  실시간 모니터링하기 

  => top -b -d 1  -n 5 -u userid 



* 비정상종료상태로 남아있는 프로세스들 죽이기

top -b -n 1 -u gisys | grep 'T ' | awk '{print $1}' | xargs kill -9


***멀티cpu 사용량 직접 구하기

/proc/stat 첫줄에 있는 user, low priority, system, idle jiffies 값을 가지고 구한다고 하더군요.

(idle jiffies * 100 / user + low priority + system + idle jiffies




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


아래 출처 : http://www.mimul.com/pebble/default/2012/06/26/1340680991596.html

*** 3번 vmstat를 주로 활용

일반적인 커맨드들을 활용 방법들

1. top을보고 상위에 붙어있는 프로세스를 확인하면서 CPU나 I/O의 어느 문제인지 판별
- 프로세스의 Fullpath를 알고 싶으면 'c'를 누름.
- 개별 CPU의 성능 정보를 볼려면 '1'을 누름.
- 정렬은 'shift'+ 'm'에서 메모리 정렬, 'shift'+ 'o'로 정렬 필드를 선택할 수 있음.
- 'k' 로 프로세스를 kill 시킬 수 있음.
- top -u %UserName% 사용자 계정 단위로 프로세스 확인 가능.

2. ps로 프로세스의 상태를 확인 (T), (D)상태에서 CPU나 I/O의 어느 문제인지 판별
- ps -e -o pid,args --forest : 프로세스의 트리를 보여줌.
- ps -f -u k2,mysql : 사용자 계정별로 프로세스 정보 확인.
- ps -f --ppid 9576 : pid나 ppid로 프로세스 조회.
- ps -p 1,28641 -o pid,etime= : 프로세스 구동 후 경과 시간 정보 확인.
- ps -C java -L -o pid,tid,pcpu,state,nlwp,args : 프로세스의 쓰레드 정보 조회.
- ps aux --sort pmem : 메모리 정보 조회해서 메모리 많이 차지하는 프로세스는 'ps ev --pid=28641'로 해서 개별 프로세스를 감시할 수 있음.

3. vmstat에서 procs의 r, b의 수, swap의 si, so 상태, I/O의 bi, bo 상태, cpu에서 us, sy, id 상태를 확인
- vmstat의 r이 cpu 수 이상이면 실행 프로세스 큐가 cpu를 기다리고있는 상태.
- b가 0보다 크다면 I / O 대기로 인터럽트가 금지되는 프로세스 수가있다는 것.
- memory에서 swpd가 0보다 크다면 스왑을 사용 중이며 메모리 부족.
- bi, bo이 많을 경우 블록 전송이 빈발하고 있음.
- vmstat 명령어 결과에 시간 표시하기 : vmstat 1 5 | timestamp.pl
$ vi timestamp.pl
#!/usr/bin/perl
while (<>) { print localtime() . ": $_"; }

- vmstat -m : slab 정보 표시.
- vmstat -s : 전체 통계 정보 요약.
- vmstat -d : 디스크 통계 정보 조회.
- vmstat -p sdb1 : 디스크 파티션 정보 조회.

4. sar를 사용하여 os 상태 추가 확인
- sar -W 1 5 에서 pswpin/s pswpout/s 0보다 클 경우 스왑 발생하고 있어서 메모리 부족.
- sar 1 5 CPU 정보
- sar -q 1 5 : 평균 부하 및 작업 실행 큐에 대한 정보.
- sar -r 1 5 : 메모리 정보.
- sar -u -P ALL 1 5 : 프로세 서당 CPU 사용률에 대한 정보.
- sar -b 1 5 : I/O 통계 정보 조회.
- sar -d 1 5 : Block Device I/O 통계 조회.
- sar -w 1 5 : 초당 context switch 정보 조회.
- sar -n DEV 1 5 : 네트워크 통계 조회.

5. iostat을 사용해서 디스크 I/O 정보 확인
- iostat -c : Cpu 정보 조회.
- iostat -d : Disk I/O 정보 조회.
- iostat -n : 네트워크 정보 조회.
- iostat -p sda : 디바이스별 I/O 통계.
- iostat -x sda1 : 상세 Disk I/O 정보 조회.



################################################

### mysql monitoring #################

dstat을 활용한 방법들

1. 유용한 dstat 커맨드들
- dstat -Tclmdrn : 전체 정보 조회.
- dstat -Tclm : 메모리 정보 조회.
- dstat -Tclr : CPU 정보 조회
- dstat -Tclnd : 네트워크 정보 조회.
- dstat -Tcldr : 디스크 정보 조회.
- dstat --top-cpu --top-cputime : CPU 부하가 크고 전체 높은 CPU 타임을 가진 프로세스 조회.
- dstat --top-cpu-adv : CPU 부하가 큰 프로세스 상세 정보 조회.
- dstat --top-io --top-bio : 가장 IO를 많이 발생하는 프로세스 조회.
- dstat --top-io-adv --top-bio-adv : 가장 IO를 많이 발생하는 프로세스 상세 정보 조회.
- dstat --cpu --sys --disk --net 1 5 : CPU, SYSTEM, DISK, NETWORK 정보 조회.
- dstat -tal --top-io --top-cpu --top-mem : 전체 정보 조회.

2. dstat으로 MySQL 모니터링
MySQL을 모니터링 하려면 Python의 MySQLdb 라이브러리가 설치되어 있어야 한다.
$ export DSTAT_MYSQL_USER=user
$ export DSTAT_MYSQL_PWD=pwd
$ export DSTAT_MYSQL_HOST=localhost
$ dstat -T --mysql5-cmds --mysql5-conn --mysql5-io --mysql5-keys
--epoch--- ------mysql5-cmds------ mysql5-co -mysql5-io- ---mysql5-key-status----
  epoch   | sel   ins   upd   del |ThCo %Con| recv  sent|used read writ rreq wreq
1330500331|    0     0     0     0|0.00 0.00|0.02  0.11 |  0    0    0    0    0 
1330500332|    8     0     0     0|4.00 1.60|9796B 59.8k|  0    0    0    0    0 
1330500333|    8     0     0     0|4.00 1.60|9.90k 61.1k|  0    0    0    0    0 
1330500334|    8     0     0     0|4.00 1.60|10.2k 62.5k|  0    0    0    0    0 

3. dstat으로 MySQL Innodb 모니터링
$ export DSTAT_MYSQL='-uuser -ppwd -hlocalhost'
$ dstat -T --innodb-io --innodb-buffer --innodb-ops
--epoch--- innodb-io-o innodb-pool ---innodb-ops--
  epoch   |rea wri syn|crt rea wri|ins upd del rea
1330500814|  0   0   0|0.2 1.0  11|  0   0   0   0
1330500815|  0   0   0|3.0 1.0 139|  0   0   0   0
1330500816|  0   0   0|3.0 5.0 172|  0   0   0   0
1330500817|  0   0   0|5.0 5.0 133|  0   0   0   0
출처 http://blog.daum.net/techtip/12414558

'Embedded Lab > linux, x86' 카테고리의 다른 글

[특수문자표]  (0) 2013.11.04
[GFS(Google File System)]  (0) 2013.10.28
[커널스택]  (0) 2013.08.13
[커널 예전 버전 받기]  (0) 2013.08.06
[grub 배경화면 변경]  (0) 2013.08.04
Posted by cyj4369
,

최근에 Linux Understanding Kernel 이란 책을 일부분 봤는데 어느 정보 아는 부분이라 지나가다 적어봅니다. 모든 설명은 80x86 아키텍처를 기준으로 합니다.

 

1. 커널 스택은 프로세스마다 하나씩 생성됩니다.
일반적인 프로세스는 User Mode 스택과 Kernel Mode 스택을 각각 하나씩 가지고 있습니다.
User Mode에서 Kernel Mode로의 전환은 시스템호출이나 인터럽트가 발생하면 일어납니다.
즉, esp 레지스터는 프로세스가 User Mode이면 User Mode 스택의 top을 가르키다가
Kernel Mode로 전환이 되면 Kernel Mode 스택의 top을 가르킵니다.

 

2. Kernel Mode 스택은 적어도 다음 두가지 목적으로 사용됩니다. 다른 사용처는 딱히 생각나지 않네요.
가. Kernel Mode로 전환된 프로세스는 언젠간 다시 User Mode로 되돌아가야 합니다.
따라서 User Mode로 전환하기위해 필요한 정보 중 일부를 저장합니다. (일부는 다른 곳에 저장합니다.)
나. Kernel Mode에서 함수를 호출하게 되면 그 함수의 지역변수는 Kernel Mode 스택에서 할당됩니다. (User Mode에서 함수를 호출하면 지역변수가 User Mode 스택에 할당되는 것과 같습니다.)
참고로 80x86 아키텍처에서 커널 스택으로 할당된 공간의 크기는 8KB로 고정되어있습니다. 프로세스 생성때 한번 할당되어 작아지지도 커지지도 않습니다. 따라서 커널에 있는 함수에서는 지역변수를 많이 할당하거나 재귀 함수 호출을 하면 좋지 않습니다.

 

3. 어떻게 설명드려야할 지 상당히 난해한 질문이군요.
커널은 주소 공간 3~4GB를 사용합니다. Kernel Mode 스택은 Kernel Mode에서만 사용되므로 커널 주소 공간에서 할당됩니다.
즉, User Mode 스택을 가르키는 esp 값을 읽어보면 0GB~3GB 사이의 값을 가지고 Kernel Mode 스택을 가르키는 esp 값을 읽어보면 3~4GB 사이의 값을 가지게 됩니다.

 

4. 기타

가. 프로세스의 User Address Space는 프로세스마다 각각 다르지만, Kernel Address Space는 모든 프로세스가 동일하게 봅니다. 즉, 프로세스 A와 프로세스 B의 특정 가상주소 (예를 들면 0xa0001000) 은 서로 다른 물리주소로 맵핑될 수 있습니다. 하지만 특정 커널 공간 주소 (예를 들면 0xc0001000) 는 모든 프로세스에서 동일한 물리주소로 맵핑됩니다.
이를 위해서 커널은 kernel master page table (swapper_pg_dir 변수가 가르킴)을 관리하고, 필요할 때마다 특정 엔트리를 kernel master page table에서 해당 프로세스의 page table에 복사를 합니다 -- 이런 작업은 Kernel Mode에서 페이지 폴트가 발생했을 때 페이지 폴트 핸들러가 수행합니다.

 

나. 시스템호출, 인터럽트 핸들러, 커널 모듈 등은 임의의 프로세스의 context를 이용합니다. 예를 들어, 프로세스 A가 User Mode에서 수행되고 있을 때 timer interrupt가 발생하는 경우 Kernel Mode로 전환하여 timer interrupt service routine을 수행하게 되는데 이때 프로세스 A의 page table과 Kernel Mode 스택을 빌어 쓰게됩니다.
Timer interrupt와 프로세스 A와는 별다른 연관이 없지만 interrupt 발생시점에 프로세스 A가 CPU를 점유하고 있었기 때문에 부하가 큰 context switch 등을 따로 하지 않고 프로세스 A의 context를 그대로 이용하는 것입니다. 다만 커널 모듈 등이 기능의 일부를 따로 커널 쓰레드를 생성하여 구현한 경우라면 그 커널 쓰레드의 context를 사용하겠죠.

'Embedded Lab > linux, x86' 카테고리의 다른 글

[GFS(Google File System)]  (0) 2013.10.28
[top 명령어]  (0) 2013.10.23
[커널 예전 버전 받기]  (0) 2013.08.06
[grub 배경화면 변경]  (0) 2013.08.04
[리눅스에서 itoa는 사용 불가]  (0) 2013.04.14
Posted by cyj4369
,

Linux kernel 을 보고 있는데, 책 마다 base kernel version 이 조금씩 달라서 source code 가 많이 차이가 나더군요.

Understanding Linux Kernel : 2.6.11 version

Professional Linux Kernel Architecture : 2.6.24 version

The Linux Kernel Archives 에서 kernel source code download 할 수 있는데, 2.6.11 이나 2.6.24 와 같이 아주 예전(?) version 의 경우에는 바로 보이지 않아서 
어떻게  download 하는지 몰랐었습니다.

혹시 저같은 분을 위하여 link 적어봅니다. :) 
http://www.kernel.org/pub/linux/kernel/ 에 각 버전별로 압축되서 올라와 있으므로 원하시는 버전 찾으셔서 download 하실 수 있습니다.

http://www.kernel.org/pub/linux/kernel/v2.6/

2.6.11 source (Understanding Linux Kernel base code)

2.6.24 source (Professional Linux Kernel Architecture base code)

 

http://www.kernel.org/pub/linux/kernel/ // 2.6 이전 버전도 directory 선택하여 download 가능.

'Embedded Lab > linux, x86' 카테고리의 다른 글

[top 명령어]  (0) 2013.10.23
[커널스택]  (0) 2013.08.13
[grub 배경화면 변경]  (0) 2013.08.04
[리눅스에서 itoa는 사용 불가]  (0) 2013.04.14
[gz 또는 bz2 압축하기/풀기]  (0) 2013.04.13
Posted by cyj4369
,