March 4, 2012

AP 이름으로 접속하는 Client를 다운시킬 수 있을까?

언젠가 온사이트 인터뷰에서 점심 시간을 같이한 인터뷰어가 물은 질문이었다. 정확하게는 질문은 아니었고 다음과 같은 정도의 대화… “특정한 이름을 가진 AP에 접속하면 Windows가 다운되는 버그가 있었어. 신기하지 않니?”

AP의 SSID는 beacon이나 probe response의 IE를 파싱해서 얻을 수 있는데, IE는 첫 바이트는 그 IE의 길이(Bytes) 그리고 다음 부터는 그 길이 만큼의 데이터가 온다. SSID의 최대 길이는 32Bytes란다. ASCII 캐릭터로 표현할 경우 영문 32자가 최대가 되겠다.

여기서 네트웍 드라이버를 크래쉬되게 만들려면 memory corruption 정도를 일으키면 될 것 같은데…

만일 AP set-up 프로그램이 SSID의 길이를 확인하지 않고  32자 이상의 사용자 입력을 받아 들이고 IE 길이에 32 이상을 써넣은 다면.. 그리고 클라이언트에서 이 길이의 IE보다 적은 길이의 버퍼를 할당했다면 클라이언트의 memory를 corruption 시킬 수 도 있을 것 같다.

그런데 길이를 체크하는데도 memory를 corruption 시킬 수 있을까?

March 4, 2012

LPC2194 GNU linker script – Need to debug

OUTPUT_FORMAT(“elf32-littlearm”, “elf32-bigarm”, “elf32-littlearm”)
OUTPUT_ARCH(arm)
ENTRY(_start)

MEMORY { /* memory map of LPC2194 */
ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256k
RAM (rwx) : ORIGIN = 0x40000000, LENGTH = 64k
}

/* The sizes of the stacks used by the application. */
C_STACK_SIZE = 512;
IRQ_STACK_SIZE = 0;
FIQ_STACK_SIZE = 0;
SVC_STACK_SIZE = 0;
ABT_STACK_SIZE = 0;
UND_STACK_SIZE = 0;

SECTIONS {

.reset : {
*startup.o (.text) /* startup code (ARM vectors and reset handler) */
. = ALIGN(0x4);
} >ROM

.ramvect : { /* used for vectors remapped to RAM */
__ram_start = .;
. = 0x40;
} >RAM

.text : {
*(.text)
} >ROM

_etext = .;

.data : {
__data_load = LOADADDR (.data);
__data_start = .;
*(.data)
. = ALIGN (4);
_edata = .;
} >RAM AT>ROM

.bss : {
__bss_start__ = . ;
*(.shbss)
*(.bss)
*(COMMON)
. = ALIGN (8);
__bss_end__ = .;
} >RAM

.stack : {
__stack_start__ = . ;

. += IRQ_STACK_SIZE;
. = ALIGN (4);
__irq_stack_top__ = . ;

. += FIQ_STACK_SIZE;
. = ALIGN (4);
__fiq_stack_top__ = . ;

. += SVC_STACK_SIZE;
. = ALIGN (4);
__svc_stack_top__ = . ;

. += ABT_STACK_SIZE;
. = ALIGN (4);
__abt_stack_top__ = . ;

. += UND_STACK_SIZE;
. = ALIGN (4);
__und_stack_top__ = . ;

. += C_STACK_SIZE;
. = ALIGN (4);
__c_stack_top__ = . ;

__stack_end__ = .;
} >RAM

_end = . ;
__end = . ;
PROVIDE(end = .);
}

March 4, 2012

LPC2194 startup.s – Need further debugging

/**********************************************************
* Generic startup code for ARM
*
* Board Spec.
* CPU: LPC2194 with OSC 14.7456MHz
*
* Written by seyoungjeong@gmail.com
* March 2012
**********************************************************/

/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */

.equ I_BIT, 0x80 /* when I bit is set, IRQ is disabled */
.equ F_BIT, 0x40 /* when F bit is set, FIQ is disabled */

.equ USR_MODE, 0x10
.equ FIQ_MODE, 0x11
.equ IRQ_MODE, 0x12
.equ SVC_MODE, 0x13
.equ ABT_MODE, 0x17
.equ UND_MODE, 0x1B
.equ SYS_MODE, 0x1F

/* constant to pre-fill the stack */
.equ STACK_FILL, 0xAAAAAAAA

/**********************************************************
* PLL frequency calculation (UM10114.pdf ch.9.9)
*
* CCLK: 29.4912 = 2[M] * Fosc(14.7456)
* Fcco: 58.9824 = 29.4912(CCLK) * 2 * 1[P]
**********************************************************/

.equ PLL_BASE, 0xE01FC080
.equ PLLCON_OFS, 0x00
.equ PLLCFG_OFS, 0x04
.equ PLLSTAT_OFS, 0x08
.equ PLLFEED_OFS, 0x0C

.equ PLLCFG_Val, ((1 << 5) | (2))
.equ PLLCON_En, (1 << 0)
.equ PLLCON_Con, (1 << 1)
.equ PLLSTAT_Lock, (1 << 10)

/**********************************************************
* NAM setup
* < 20 MHz 1 CCLK
* 20 MHz to 40 MHz 2 CCLK
* 40 MHz to 60 MHz 3 CCLK
* > 60 MHz 4 CCLK
**********************************************************/

.equ MAM_BASE, 0xE01FC000
.equ MAMCR_OFS, 0x00
.equ MAMTIM_OFS, 0x04

.equ MAMCR_Val, 0x00000002
.equ MAMTIM_Val, 0x00000002

/**********************************************************
* APBDIV = 2
*
* PCLK: 7.3728 = 14.7456(Fosc) / 2
**********************************************************/

.equ APBDIV_Val, 0x00000002

.equ APBDIV_BASE, 0xE01FC100

/**********************************************************
* UART0
*
* baudrate
9600 = 7.3728(PCLK)
* / ( 16 * ( 256 * 0[DLM] + 48[DLL] ) )
**********************************************************/

.equ UART0_BASE, 0xE000C000

.equ UART1_BASE, 0xE0010000
.equ U1DLL_OFS, 0x00
.equ U1THR_OFS, 0x00
.equ U1DLM_OFS, 0x04
.equ U1LCR_OFS, 0x0C

.equ U1LCR_En, (0x02 | (1 << 7 ))
.equ U1LCR_Dis, 0x02
.equ U1DLL_Val, 0x30
.equ U1DLM_Val, 0x00

.text
.code 32

.global _start
.func _start

_start:

/* TODO: Remap Vector table to RAM address */
B _reset_handler
_undef_handler: B _undef_handler
_swi_handler: B _swi_handler
_pabort_handler:B _pabort_handler
_dabort_handler:B _dabort_handler
NOP
/*
_irq_handler: B _irq_handler
_fiq_handler: B _fiq_handler
*/
.align 4
_reset_handler:

/* Setup PLL */
LDR R0, =PLL_BASE
MOV R1, #0xAA
MOV R2, #0x55

MOV R3, #PLLCFG_Val
STR R3, [R0, #PLLCFG_OFS]
MOV R3, #PLLCON_En
STR R3, [R0, #PLLCON_OFS]
STR R1, [R0, #PLLFEED_OFS]
STR R2, [R0, #PLLFEED_OFS]

PLL_Loop: LDR R3, [R0, #PLLSTAT_OFS]
ANDS R3, R3, #PLLSTAT_Lock
BEQ PLL_Loop

MOV R3, #(PLLCON_En | PLLCON_Con)
STR R3, [R0, #PLLCON_OFS]
STR R1, [R0, #PLLFEED_OFS]
STR R2, [R0, #PLLFEED_OFS]

/* Setup APBDIV */
LDR R0, =APBDIV_BASE
MOV R1, #APBDIV_Val
STR R1, [R0]

/* NAM setup */
LDR R0, =MAM_BASE
MOV R1, #MAMTIM_Val
STR R1, [R0, #MAMTIM_OFS]
MOV R1, #MAMCR_Val
STR R1, [R0, #MAMCR_OFS]

/* Setup UART0 */
LDR R0, =UART1_BASE
MOV R1, #U1LCR_En
STR R1, [R0, #U1LCR_OFS]
MOV R1, #U1DLL_Val
STR R1, [R0, #U1DLL_OFS]
MOV R1, #U1DLM_Val
STR R1, [R0, #U1DLM_OFS]
MOV R1, #U1LCR_Dis
STR R1, [R0, #U1LCR_OFS]

/**/
1:
MOV R1, #0x30
STR R1, [R0, #U1THR_OFS]
B 1

/* Clear the .bss section */
LDR r1,=__bss_start__
LDR r2,=__bss_end__
MOV r3,#0
1:
CMP r1,r2
STMLTIA r1!,{r3}
BLT 1b

/* setup Stack */
MSR CPSR_c,#(IRQ_MODE | I_BIT | F_BIT)
LDR sp,=__irq_stack_top__ /* set the IRQ stack pointer */

MSR CPSR_c,#(FIQ_MODE | I_BIT | F_BIT)
LDR sp,=__fiq_stack_top__ /* set the FIQ stack pointer */

MSR CPSR_c,#(SVC_MODE | I_BIT | F_BIT)
LDR sp,=__svc_stack_top__ /* set the SVC stack pointer */

MSR CPSR_c,#(ABT_MODE | I_BIT | F_BIT)
LDR sp,=__abt_stack_top__ /* set the ABT stack pointer */

MSR CPSR_c,#(UND_MODE | I_BIT | F_BIT)
LDR sp,=__und_stack_top__ /* set the UND stack pointer */

MSR CPSR_c,#(SYS_MODE | I_BIT | F_BIT)
LDR sp,=__c_stack_top__ /* set the C stack pointer */

/* Enter the C/C++ code */
LDR r12,=main
MOV lr,pc /* set the return address */
BX r12 /* the target code can be ARM or THUMB */

SWI 0xFFFFFF /* cause exception if main() ever returns */

.size _start, . – _start
.endfunc

.end

March 4, 2012

MOV와 LDR의 차이점?

ARM ASM을 좀 들여다 보고 있는데 둘이 헷갈리기 시작햇다. 처음에는 MOV는 Variable의 값이나 레지스터의 값을 타겟 레지스터로 복사하는 것, 그리고 LDR은 레지스터가 가르키는 주소의 값을 타겟 레지스터에 복사하는 것으로 생각했는데 그게 아니였다. 구글링이 문서하나를 보여 준다.

MOV는 #을 그리고 LDR은 =을 사용한다. immediate value를 정의하기 위해서.

MOV는 8비트16비트 값만을 복사할 수 있다. LDR은 32비트 값을 복사할 수 있고. ARM 홈페이지에 가면 MOV{cond} Rd, #imm16 에서 imm16은 0-65535까지 어떤 숫자도 될 수 있다고 한다. (그런데, GNU 컴파일러에서는 65537부터 에러를 출력한다. 왜 65536은 허용되지? 띠빌.)

LDR은 pseudo instruction이다. =expr에서 expr값이 MOV(또는 MVN)로 로딩될 수 있으면 MOV를 사용한다.  =label_expr이 사용될 경우label_expr(이 넘은 constant)이 복사된다. (Keil.com 설명 참조)

 

 

March 3, 2012

LPC2194

짐 속 어디엔가에 처박아 두엇던 LPC2194 보드를 찾아냈다.

5년은 된 보드의 먼지를 털고 회로도를 열어 5V 전원을 확인하고, USB 케이블을 잘라 연결해서 전원을 먹였다. LED가 들어오는 걸 보고 Flash Utility를 Serial로 연결 Device ID를 읽어 보는 것 확인. 자 이제 startup 코드를 만들어 볼까…

이 넘은 ARM7TDMI-S 호환 CPU에 flash ROM과 static RAM이 내장되어 있어 이것만으로 프로그램을 해 볼 수 있다.

기억이 가물거리는 ARM의 Reset Vector 테이블을 확인하고..

0x00000000 Reset Vector
0x00000004 Undefined Instruction
0x00000008 Software Interrupt
0x0000000C Prefetch Abort (instruction fetch memory fault)
0x00000010 Data Abort (data access memory fault)
0x00000014 Reserved
0x00000018 IRQ
0x0000001C FIQ

ARM 페이지의 샘플 Startup 코드를 참고하고… GNU ARM 컴파일러를 찾아보고…

GNU ASM으로 startup 코드를 작성하는 법에 대한 좋은 아티클이 있네.

자, 정리하자면, Startup 코드에 작성해 줘야 할 것들은

  1. ARM Vector 테이블을 정의하고 각 Vector에 대한 핸들러들을 작성해 준다.
  2. Clock(PLL), Memory 레지스터들을 설정한다.
  3. C루틴에서 사용될 Stack을 설정한다.

정도 되겠다. 추가로 할 일들은 link 설정 파일에 ROM과 RAM의 메모리 영역을 정의해 주고 .text, .bss그리고 .data가 로딩될 어드레스를 정해 준다. ROM의 코드를 RAM으로 복사해서 RAM에서 실행 하고 싶다면 추가 코드를 넣어주여야 한다.

GNU ARM 빌드 커맨드들 요약.

arm-elf-as startup.s -o startup.o
arm-elf-gcc -nostartfiles main.c -o main.o
arm-elf-ld -Tboot.ld -e 0 -nodefaultlibs -Map boot.map -o boot.elf startup.o main.o
arm-elf-objcopy  -R .bss -R .stack -R .data -O ihex boot.elf boot.hex

Tags: , ,
January 19, 2012

Threads and Processes

Processes

A process is usually defined as an instance of a running program and consists of two components:

A kernel object that the operating system uses to manage the process. The kernel object is also where the system keeps statistical information about the process.
An address space that contains all the executable or dynamic-link library(DLL) module’s code and data. It also contains allocations such as thread stacks and heap allocations
Each thread has its own set of CPU registers and its own stack.
Threads

A thread is the fundamental unit of execution within an application; A running application consists of a least on thread. Each threads has its own stack and runs independently from the application’s other threads.

Preemptive threading

The operating system can suspend a thread’s execution at any point in order to let another thread run. Swapping one thread out and another in is referred to as a context switch.

From ‘Windows Internals’


August 28, 2011

방향

  • Write two technical essays a month
  • Work out… golf or swimming
  • Follow known rules for success
  • Participate in any communities, English spoken
  • Make more friends in the company
  • Move
  • Creative & Brave
돌아오는 비행기에서 적은.
August 28, 2011

The shredder

세 박스 였다.  4년 전 부터 모아 두었던 기록들이. Redmond에서 첫 미국살이를 시작할 때 부터 모아 두었던 영수증들과 각종 서류들. 낸 돈 또 내랄 때 아님 다른 무슨 일에 혹여 소용이 될까 버리지 못하고 모아 두었던 것들이다. 이것들이 쓰레기 봉투로 네개가 되었다. 모두 갈린 채로.  지난 주 Costco에서 쿠폰 전단지가  날라왔을 때 보아 두었던 20불 할인하는 shredder를 오늘 사가지고 와서 다 갈아 버렸다. 이제 call center에 전화하기 정도는 자신 있어 진 게야.

*추신:
1. 4년치 서류들을 단 반나절에 갈아서인지 shredder가 늙은 소리를 낸다. 내일 Costco에 리턴하러 가야겠다.
2.Shredder 정보:  Royal HD1400MX. 89.99불 붙어 있는 넘을 69.99에 판다. Amazon에는 125.95에 나와 있군. http://www.amazon.com/Royal-14-sheet-Crosscut-Paper-Shredder/dp/B004RI5S2G

July 11, 2011

Stupid Toyota Dealership

이제 갓 25K이 넘은 Camry에 engine check light이 처음 들어온 것은 4~5개월 전인 듯 하다. Toyota dealership에서 체크를 받은 결과는 ‘에러 코드가 세개가 같이 뜨는데 새차에 이런 경우는 드무니 리셋을 하고 타 보다가 engine check light가 들어오면 다시 또 오라’는 것. 전자장치의 오류로 체크등이 들어왔을 수도 있다고. 어느 정도 make sense가 되길래 가지고 와서 한 5K를 아무 문제 없이 탔다가 지지난 주에 다시 light가 들어왔다. 가지고 가니 같은 코드. 이번에는 부품을 replace하기로 했다.

Warranty로 커버되는 것은 그렇다고 치고 새차가 이 모양이니 기분이 상했는데, 금요일 수리가 완료되었다는 전화를 받고 저녁 6시경 차를 찾으러 갔다. 담당 매니저는 이미 퇴근했고, 카운터에 loaner car를 반납하고 내 Camry를 기다리는데, 내 쪽으로 몰고 나오는 Camry의 hood에서 마치 헬기 프로펠러 소리가 나는 거다. 이전에 Water pump 나간 차를 몇 마일 끌어본 적이 있는데 딱 그 소리. 부스에 있던 다른 매니저가 놀래서 나오고. 그 매니저가 컴퓨터로 확인해 보니  part 하나를 리플레이스 안 했다는 거다.

정비가 완료되었는지도 모르고 차 찾아가라고 전화 준 담당 매니저에. 그것도 모르고 차 끌고 나온 테크니션에.  말로만 듣던 한심한 미국 dealership 서비스의 전형을 경험했다. 성질나서 금요일 바로 서비스 디렉터 이메일로 항의를 했는데 메일이나 제대로 읽나 모르겠다. 답장도 없으니.

* 아침에 담당 매니저가 전화해서 추가 부품이 담주에나 들어온다고 연락 줄 때 까지 loaner car 계속 쓰란다. ‘I apologize’한다는데. 소리라도 안나서 부품 없는 차 그냥 끌고 나갔으면 어떻할뻔 했나?

July 11, 2011

Hello world!

Welcome to WordPress.com. After you read this, you should delete and write your own post, with a new title above. Or hit Add New on the left (of the admin dashboard) to start a fresh post.

Here are some suggestions for your first post.

  1. You can find new ideas for what to blog about by reading the Daily Post.
  2. Add PressThis to your browser. It creates a new blog post for you about any interesting  page you read on the web.
  3. Make some changes to this page, and then hit preview on the right. You can alway preview any post or edit you before you share it to the world.