KR20060078433A - 컴파일러의 메모리 접근코드 생성 방법 - Google Patents

컴파일러의 메모리 접근코드 생성 방법 Download PDF

Info

Publication number
KR20060078433A
KR20060078433A KR1020040118391A KR20040118391A KR20060078433A KR 20060078433 A KR20060078433 A KR 20060078433A KR 1020040118391 A KR1020040118391 A KR 1020040118391A KR 20040118391 A KR20040118391 A KR 20040118391A KR 20060078433 A KR20060078433 A KR 20060078433A
Authority
KR
South Korea
Prior art keywords
byte order
memory
byte
register
value
Prior art date
Application number
KR1020040118391A
Other languages
English (en)
Inventor
김종성
Original Assignee
엘지전자 주식회사
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 엘지전자 주식회사 filed Critical 엘지전자 주식회사
Priority to KR1020040118391A priority Critical patent/KR20060078433A/ko
Publication of KR20060078433A publication Critical patent/KR20060078433A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/441Register allocation; Assignment of physical memory space to logical memory space
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

본 발명은 소프트웨어를 개발하거나 이미 개발된 소프트웨어를 다른 기종으로 이식할 때 발생하는 이기종간의 바이트 순서 문제를 해결하는 기술에 관한 것으로, 이는 컴파일러의 코드 생성 단계에서 레지스터에서 메모리로 값을 쓰거나 메모리에서 레지스터로 값을 읽어오는 명령어를 생성하는 과정에 적용되는 기술이다. 이러한 본 발명은, 여러개의 바이트로 구성되어 있는지의 여부, 생성된 코드가 실생되는 바이트 순서 정책, 소스코드에서 지정한 해당 메모리의 바이트 순서 정책의 속성을 검사하여 메모리에서 레지스터로 값을 읽어오는 명령어를 생성할 때, 바이트 순서를 바꾸는 명령어로 번역하거나 일반적인 읽기 명령어로 번역하는 과정과; 레지스터의 값을 메모리에 저장할 때, 바이트 순서를 바꾸어 저장하는 명령어로 번역하거나 일반적인 저장 명령어로 번역하는 과정에 의해 달성된다.

Description

컴파일러의 메모리 접근코드 생성 방법{METHOD FOR GENERATING MEMORY ACCESS CODE IN COMPILER}
도 1은 네트워크를 통한 정보 교환시 발생하는 바이트 순서 설명도.
도 2는 종래의 바이트 순서 문제 해결을 위한 TCP/IP 사용 예시도.
도 3은 본 발명의 바이트 순서 문제 해결을 위한 TCP/IP 사용 예시도.
도 4는 본 발명에 의한 컴파일러의 메모리 접근코드 생성 방법의 처리과정을 나타낸 신호 흐름도.
***도면의 주요 부분에 대한 부호의 설명***
1 : 피씨 2 : 노트북컴퓨터
3 : 개인휴대정보단말기
본 발명은 소프트웨어를 개발하거나 이미 개발된 소프트웨어를 다른 기종으로 이식(porting)할 때 발생하는 이기종간의 바이트 순서(byte ordering) 문제를 해결하는 기술에 관한 것으로, 특히 네트워크용 소프트웨어나 내장(embedded)용 소프트웨어를 개발하거나 이식할 때의 난이도를 줄이고 제품 개발 속도를 향상시키는 데 적당하도록 한 컴파일러의 메모리 접근코드 생성 방법에 관한 것이다.
이기종간의 통신시 발생하는 문제점들 중에서 대표적인 것이 바이트 순서 문제이다. 바이트 순서는 두 개 이상의 바이트로 이루어진 하나의 정수형 또는 실수형으로 선언된 메모리에서 각각의 바이트가 어떤 주소에 위치하는 가에 대한 정책결정 요소로서, 이는 주로 장비가 사용하고 있는 프로세서의 종류에 따라서 달라지게 된다. 따라서, 동일한 내용의 정보를 통신망을 통해 수신한 경우에도 장비에 내장된 프로세서의 특성에 따라 그 내용이 달라지게 된다.(도 1 참조)
OSI(OSI: Open System Interconnection) 7계층 분류에 따르면, 이기종 간의 문제들을 표현(Presentation) 계층에 의해 해결되도록 되어 있으나, 실제로 이런 계층을 제공하기에는 현존하는 통신규약(Protocol)들의 종류가 너무 많고, 알려진 프로토콜에 대해서는 처리할 수 없는 등 기술적으로 해결해야 할 문제가 많다. 상기 OSI 7 계층을 대신해서 인터넷에서 사용되는 TCP/IP 프로토콜에는 표현 계층에 해당하는 부분이 없으며, 이러한 문제점에 대해서는 프로그래머가 응용 프로그램 내부에서 처리하도록 되어 있다. TCP/IP는 바이트 순서를 호스트(Host) 바이트 순서와 네트워크 바이트 순서로 구분하여, 단지 둘 사이의 변환을 가능하게 하는 API(API: Application Programming Interface) 몇 개를 제공할 뿐이다. 따라서, 내장 소프트웨어를 개발하는 개발자가 이러한 바이트 순서 관련 문제가 발생할 것으로 예상되는 부분에서 적절한 작업을 해주는 방법으로 해결할 수 밖에 없다.
예를 들어, C/C++ 언어에서 이더넷(ethernet) 헤더를 조작하기 위해 도 2와 같은 코드를 작성한 경우, 개발자는 바이트 순서 문제가 발생할 것으로 예상되는 변수를 참조할 때마다 적절한 함수를 사용하여 바이트 순서를 요구사항에 알맞는 순서로 맞추어 주어야 한다.
이기종 간의 통신 뿐만 아니라, 특정 하드웨어를 대상으로 개발된 장치 드라이버 소프트웨어를 다른 하드웨어로 이식하고자 할 때, 일반적으로 가장 문제 되는 부분 중의 하나가 바이트 순서와 관련된 부분이다.
이런 경우에도 개발자가 하드웨어를 사용하기 위한 방법에 대해 정확하게 이해하고, 발생할 수 있는 문제에 대해 적절한 작업을 해주는 방법으로 해결해야 한다.
이와 같이 종래에 있어서는 이기종 간의 통신을 위한 소프트웨어를 개발할 때, 내장 소프트웨어의 개발자가 바이트 순서 관련 문제가 발생할 것으로 예상되는 부분에서 적절한 작업을 해주야 하므로 그만큼 개발자의 부담이 가중되는 문제점이 있었다.
또한, 특정 하드웨어를 대상으로 개발된 장치 드라이버 소프트웨어를 다른 하드웨어로 이식하고자 할 때, 개발자가 하드웨어를 사용하기 위한 방법에 대해 정확하게 이해하고, 발생할 수 있는 문제에 대해 적절한 작업을 해주어야 하므로, 숙련된 개발자일지라도 시행착오를 겪게 되는 경우가 많고, 그렇지 못한 경우에는 코드를 작성하는 시간보다 어떤 부분에서 문제가 발생하는지 파악하고 해결하는데 훨씬 많은 시간이 소요되는 등의 문제점이 있었다.
따라서, 본 발명의 제1목적은 바이트 순서 일치문제를 간단하게 해결하는 것 이다.
본 발명의 제2목적은 네트워크용 소프트웨어를 개발하고자 할 때, 소스코드에서 최소한의 수정으로 기종에 관계없이 동일한 코드를 사용할 수 있게 하는 것이다.
본 발명의 제3목적은 장치 드라이버 소프트웨어 등의 시스템 소프트웨어를 개발하거나, 이미 개발된 소프트웨어를 다른 기종으로 이식할 때 기종에 관계없이 동일한 코드를 사용할 수 있도록 하는 것이다.
본 발명의 제1특징에 따르면, 소스 코드에서 메모리를 선언할 때, 해당 메모리에 대해 바이트 순서를 속성으로 지시할 수 있는 지시자(directive)를 가진다.
본 발명의 제2특징에 따르면, 지시자에 의해 바이트 순서 속성이 지정된 메모리에 대해서 읽기/쓰기 동작시 마다 필요한 적절한 명령어로 기계어가 생성되도록 한다.
본 발명에 의한 컴파일러의 메모리 접근코드 생성 방법은, 여러개의 바이트로 구성되어 있는지의 여부, 생성된 코드가 실생되는 바이트 순서 정책, 소스코드에서 지정한 해당 메모리의 바이트 순서 정책의 속성을 검사하여 메모리에서 레지스터로 값을 읽어오는 명령어를 생성할 때, 바이트 순서를 바꾸는 명령어로 번역하거나 일반적인 읽기 명령어로 번역하는 과정과; 레지스터의 값을 메모리에 저장할 때, 바이트 순서를 바꾸어 저장하는 명령어로 번역하거나 일반적인 저장 명령어로 번역하는 과정으로 이루어지는 것으로, 이와 같이 이루어지는 본 발명의 메모리 접 근코드 생성 처리과정을 첨부한 도 3 및 도 4를 참조하여 상세히 설명하면 다음과 같다.
예를 들어, C/C++ 언어에서 이더넷 헤더를 조작하기 위한 도 3과 같은 구조체를 사용하는 것으로 한다. 여기에서는 도 2의 구조체에서 바이트 순서 문제를 야기시키는 len 멤버 변수에 대해 빅 엔디안("_big_endian_")이라는 지시자가 사용되었다. 이 지시자는 프로세서가 어떤 바이트 순서 정책에 맞춰 구현되었는가에 관계없이, len 멤버 변수는 메모리 상에 빅 엔디안 방식으로 저장되는 것을 보장한다.
참고로, 빅 엔디안은 컴퓨터 메모리에 저장된 바이트들의 순서를 설명하는 용어로서 큰 쪽(바이트 열에서 가장 큰 값)이 먼저 저장되는 순서이다. 예를 들면, 빅 엔디안 컴퓨터에서는 16진수 "4F52"를 저장공간에 "4F52"라고 저장한다. 여기서, 만약 4F가 1000번지에 저장되었다면, 52는 1001번지에 저장된다)
이와 같이 선언된 구조체를 실제로 소스코드에서 사용하고자 할 때는 도 3의 foo 함수와 같이 사용할 수 있다. 도 3의 foo 함수에는 도 2의 foo 함수와 달리, 개발자가 바이트 순서를 염두에 두고 작성된 코드가 전혀 없다. 본 발명을 적용하게 되면 이와 같이, 개발자는 소프트웨어 개발 시에 소프트웨어가 수행되는 하드웨어의 바이트 순서 정책에 무관하게 개발을 진행할 수 있다.
본 발명이 실제 적용되었을 때, 컴파일러는 서로 다른 바이트 순서에 따라 저장되어 있는 변수들이 동일한 연산에 섞여 있는 경우를 빈번하게 접하게 될 것이다. 기존의 컴파일러에서 사용하던 메모리 읽기/쓰기 기계어 번역 방식으로는 올바른 연산 결과를 낼 수 없게 된다. 따라서, 컴파일러는 도 4와 같은 처리과정을 통 해 저장공간에서 레지스터로 값을 읽어오고, 레지스터에서 메모리로 값을 써넣게 된다.
메모리에서 레지스터로 값을 읽어올 때에는, 우선 엔디안 지시자(Endian Directive)를 사용하여 변수의 바이트 순서를 지정한 변수인지 확인한다. 상기 확인 결과 바이트 순서를 지정하지 않은 것으로 판명되면 프로세서의 바이트 순서 정책과 같은 것으로 볼 수 있으므로 일반적인 읽기 명령어를 사용하도록 한다.(S1,S2,S5)
그러나, 상기 확인 결과 변수에 바이트 순서 속성이 지정된 것으로 판명되면, 변수가 여러 개의 바이트로 구성되어 있는지 확인한다. 상기 확인 결과 변수가 단일 바이트로 되어 있다거나, 단일 바이트의 행렬로 정의가 되어 있다면 바이트 순서 문제와는 무관하므로, 일반적인 읽기를 수행하는 기계어로 번역한다.(S3,S5)
상기 확인 결과 변수가 여러 개의 바이트로 구성되어 있는 것으로 판명되면, 프로세서에서 사용하는 바이트 순서 정책과 메모리에 지정된 바이트 순서 속성이 일치하는지 확인해야 한다.(S4)
상기 확인 결과 프로세서에서 사용하는 바이트 순서 정책과 메모리에 지정된 바이트 순서 속성이 일치하는 것으로 판명되면, 상기와 같이 일반적인 읽기 명령어를 사용하게 되지만, 일치하지 않는 경우에는 레지스터로 읽어들이는 과정에서 바이트 순서를 바꾸는 읽기명령(재배열 명령)을 사용한다.(S5,S6)
이와 같은 과정을 통해 읽기 작업이 완료된 후, 레지스터에는 항상 프로세서 바이트 순서에 맞게 해석된 값이 저장되게 되므로, 프로세서는 문제없이 연산을 계 속 할 수 있게 된다.
한편, 레지스터에서 메모리로 값을 쓸 때에도 상기 값을 읽어올 때와 유사한 방법으로 처리된다.
즉, 엔디안 지시자가 지정되었고, 여러 개의 바이트로 구성되어 있으며, 프로세서의 바이트 순서 정책과 지정된 지시자가 일치하는 가의 여부를 확인하여, 세가지 조건이 모두 참인 경우에만 바이트 순서를 바꾸어 저장하는 쓰기 명령어를 사용하고, 나머지의 경우에는 일반적인 쓰기 명령어를 사용한다.(S7-S11)
이상에서 상세히 설명한 바와 같이 본 발명은 소스 코드에서 메모리를 선언할 때 해당 메모리에 대해 바이트 순서를 속성으로 지시할 수 있는 지시자를 사용하고, 그 지시자에 의해 바이트 순서 속성이 지정된 메모리에 대해서 읽기/쓰기 동작시 마다 필요한 적절한 명령어로 기계어가 생성되도록 함으로써, 컴파일러를 사용하여 소프트웨어를 개발할 경우 바이트 순서 문제와 관련된 개발자의 부담이 줄어드는 효과가 있다.
또한, 소프트웨어를 개발하거나, 오류를 수정하거나, 이미 개발된 소프트웨어를 다른 기종으로 이식할 때 소요 시간이 현저하게 줄어들어 결과적으로, 그만큼 제품 출하시간이 단축되는 효과가 있다.

Claims (2)

  1. 컴파일러의 코드 생성 단계에서 레지스터에서 메모리로 값을 쓰거나 메모리에서 레지스터로 값을 읽어오는 명령어를 생성하는 방법에 있어서,
    여러개의 바이트로 구성되어 있는지의 여부, 생성된 코드가 실생되는 바이트 순서 정책, 소스코드에서 지정한 해당 메모리의 바이트 순서 정책의 속성을 검사하여 메모리에서 레지스터로 값을 읽어오는 명령어를 생성할 때, 바이트 순서를 바꾸는 명령어로 번역하거나 일반적인 읽기 명령어로 번역하는 과정과;
    레지스터의 값을 메모리에 저장할 때, 바이트 순서를 바꾸어 저장하는 명령어로 번역하거나 일반적인 저장 명령어로 번역하는 과정을 포함하여 이루어지는 것을 특징으로 하는 컴파일러의 메모리 접근코드 생성 방법.
  2. 제1항에 있어서, 바이트 순서를 바꾸는 명령어로 번역하거나 일반적인 읽기 명령어로 번역하는 과정은,
    엔디안 지시자를 사용하여 변수의 바이트 순서를 지정하지 않은 것으로 판명되면 일반적인 읽기 명령어를 사용하도록 하는 제1단계와;
    상기 변수에 바이트 순서 속성이 지정된 것으로 판명되면, 변수가 여러 개의 바이트로 구성되어 있는지 확인하여 단일 바이트로 되어 있다거나, 단일 바이트의 행렬로 정의가 되어 있으면 일반적인 읽기를 수행하는 기계어로 번역하는 제2단계와;
    상기 확인 결과 변수가 여러 개의 바이트로 구성되어 있는 것으로 판명되면, 프로세서에서 사용하는 바이트 순서 정책과 메모리에 지정된 바이트 순서 속성이 일치하는지 확인하여 일치하면, 일반적인 읽기 명령어를 사용하고, 일치하지 않으면 레지스터로 읽어들이는 과정에서 바이트 순서를 바꾸는 명령어를 사용하는 제3단계로 이루어지는 것을 특징으로 하는 컴파일러의 메모리 접근코드 생성 방법.
KR1020040118391A 2004-12-31 2004-12-31 컴파일러의 메모리 접근코드 생성 방법 KR20060078433A (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020040118391A KR20060078433A (ko) 2004-12-31 2004-12-31 컴파일러의 메모리 접근코드 생성 방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020040118391A KR20060078433A (ko) 2004-12-31 2004-12-31 컴파일러의 메모리 접근코드 생성 방법

Publications (1)

Publication Number Publication Date
KR20060078433A true KR20060078433A (ko) 2006-07-05

Family

ID=37170338

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020040118391A KR20060078433A (ko) 2004-12-31 2004-12-31 컴파일러의 메모리 접근코드 생성 방법

Country Status (1)

Country Link
KR (1) KR20060078433A (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100947137B1 (ko) * 2004-12-13 2010-03-12 인텔 코오퍼레이션 양 엔디안 가능 컴파일러를 구현하기 위한 방법 및 장치

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100947137B1 (ko) * 2004-12-13 2010-03-12 인텔 코오퍼레이션 양 엔디안 가능 컴파일러를 구현하기 위한 방법 및 장치

Similar Documents

Publication Publication Date Title
CN109976761B (zh) 软件开发工具包的生成方法、装置及终端设备
US10360327B2 (en) Modifying a virtual processor model for hardware/software simulation
JP6994071B2 (ja) Protobufベースのプロジェクトのための包括的な検証手法
US6061783A (en) Method and apparatus for manipulation of bit fields directly in a memory source
US7162710B1 (en) Dynamic modifications to a heterogeneous program in a distributed environment
TWI536263B (zh) 將作業系統之原始應用程式介面投射至其它程式語言
US7155379B2 (en) Simulation of a PCI device's memory-mapped I/O registers
US8768683B2 (en) Self initialized host cell spatially aware emulation of a computer instruction set
US20100095286A1 (en) Register reduction and liveness analysis techniques for program code
US7730492B1 (en) Method and system for running multiple virtual machines in a single process
CN107924326A (zh) 对经更新的类型的迁移方法进行覆盖
JP5050019B2 (ja) ソースコード解析システム
US5819252A (en) Method and apparatus for handling and detecting an invalid use of a data structure
US20040221274A1 (en) Source-transparent endian translation
JP2005128692A (ja) シミュレータ及びシミュレーション方法
US8090935B2 (en) Direct register access for host simulation
JPH03208159A (ja) マルチプロセッサコンピュータシステム使用方法
KR20060078433A (ko) 컴파일러의 메모리 접근코드 생성 방법
US11544436B1 (en) Hardware-software interaction testing using formal verification
CN115292676A (zh) 一种可编程数据平面程序验证方法及装置
US20040098708A1 (en) Simulator for software development and recording medium having simulation program recorded therein
US7543307B2 (en) Interface method and device having interface for circuit comprising logical operation element
JP3270729B2 (ja) 拡張命令セット・シミュレータ
CN115421875B (zh) 二进制翻译方法及装置
CN116775127B (zh) 一种基于RetroWrite框架的静态符号执行插桩方法

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E601 Decision to refuse application