Linux Development
-
x86-64 Assembly Language 7 Directives와 Hello world 코드Linux Development/Kernel 2021. 8. 1. 19:54
Hello world code 다시 보기 Assembler Directives for AT&T syntax Assembler Directives for Intel syntax 1. Hello world code 다시 보기 이제 앞에서 사용했던 hello world 코드를 해석해보자. Intel syntax에서도 global(라인 1), section(라인 3, 16), db(라인 17), equ(라인 18)등 지시자(directive)를 사용해서 어셈블러에게 정보를 전달한다. 하지만 모든 지시자 앞에 "."(period)가 붙고 모든 레이블 뒤에 ":"(colon)이 붙는 AT&T 방식에 비해 간결성이 떨어진다. Hello world of Intel syntax (좌측) 주변 코드 라인 1에서 코드의 기..
-
x86-64 Assembly Language 6 AT&T Syntax와 Intel SyntaxLinux Development/Kernel 2021. 7. 31. 05:15
ISA (Instruction Set Architecture) Low part of calling convention AT&T syntax Intel syntax 1. ISA (Instruction Set Architecture) ISA는 하드웨어 진영에서 소프트웨어 진영에 제공해주는 최종 결과물의 형태라고 보면 된다. 이 결과물 중엔 아래와 같은 것이 있다. 어셈블리 명령(Instruction)들의 종류와 기계어로서의 각 명령(opcode)에 해당하는 이진수들에 대한 정보 우리가 제공받는 레지스터의 종류와 역할, 기능에 관한 정보 각 어셈블리 명령(opcode)들이 operands(인자)로 사용하는 레지스터들의 종류와 역할 메모리 사용에 관한 정보(little endian 인지 또는 big endian..
-
x86-64 Assembly Language 5 Hello world와 System callLinux Development/Kernel 2021. 7. 29. 00:43
시스템 콜은 애플리케이션과 OS가 대화하는 가장 중요한 방법이다. 앞선 두 hello world 코드를 보면 물론 여러 가지가 다르지만 그중 시스템 콜을 이용하는데 의미 있는 차이를 보인다. 32bit 환경에서는 int라는 opcode(오피 코드, 명령 부분)와 0x80이라는 operand(데이터 부분)가 포함된 인스트럭션이 보인다. 64bit 환경에서는 syscall이라는 opcode만 보인다. 이 두 가지 코드는 모두 System Call을 이용하기 위한 코드들로서 하나는 32bit에서 고전적으로 쓰이는 트랩 게이트를 이용한 시스템 콜, 다른 하나는 64bit 환경에서 권장되는 MSRs(Modes Specific Registers) 시스템 콜 전용 레지스터들을 이용한 콜이다. 아래는 이에 대한 설명이..
-
x86-64 Assembly Language 4 Hello world의 구동 준비과정Linux Development/Kernel 2021. 7. 24. 11:01
하나의 실행파일(Elf 포맷, PE 포맷)이 제작되고 실행되는 흐름을 정리함 실행파일 생성 실행파일 실행 Windows에서 프로그램 구동을 위해 발생하는 일 Linux에서 프로그램 구동을 위해 발생하는 일 Linux에서 fork()와 exec()를 이용한 로더(Loader) 만들기 1. 실행파일 생성 애플리케이션 개발 과정 속에서 개발자는 실행을 위해 필요한 세그먼트들의(text, data, bss, stack, heap) 재료들을 사전에 기입한다. 어셈블러로 개발할 때는 이런 재료들을 미리 분류도 해두는 것을 앞의 설명에서 보았다.(text, date) 컴파일 과정(번역 과정)을 통해 기계어로 된 text, data, bss 세그먼트들이 내용물이 만들어진다. 링킹(ld) 과정을 통해 실행파일이 만들어질..
-
x86-64 Assembly Language 3 Hello world와 메모리 구조Linux Development/Kernel 2021. 7. 23. 00:21
Hello world in 32bit Architecture Hello world in 64bit Architecture 1. Hello world in 32bit Architecture 이전 설명에서 본 nasm 코드를 다시 보자. 코드의 내용 중 "section. text"라는 라인과 "section. data"라는 라인이 보인다. 이는 32bit 아키텍처 cpu가 제공해주는 4GB의 가상 메모리 주소 공간에 "코드 세그먼트"와 "데이터 세그먼트"에 배치될 내용이라는 걸 의미한다. 4GB의 가상 메모리 주소 공간 보통 메인 메모리(RAM)는 1바이트(8비트) 단위로 내용을 기록한다. 이때 우리는 메모리 주소로 2비트를 사용할 수 있다고 가정해보자. 00, 01, 11, 10의 네 가지 표현이 가능하고..
-
x86-64 Assembly Language 2 초기 환경 세팅Linux Development/Kernel 2021. 7. 21. 05:24
Assembly language를 위한 세팅 GAS에서의 Hello world NASM에서의 Hello world 1. Assembly Language를 위한 세팅 리눅스에서 가장 많이 사용되는 어셈블러는 Intel문법의 NASM과 AT&T문법의 GAS이다. 이를 위한 세팅을 해보자. 가장 먼저 컴파일러가 필요하다. GAS는 리눅스 고유의 C 컴파일러 패키지인 GCC에 포함되어 있는 어셈블리 컴파일러다, NASM도 역시 독립적인 어셈블리 컴파일러라서 따로 설치해 줄 필요가 있다. 난 리눅스 Ubuntu 21.04 버전에서 작업할 것이다. VMware로 우분투를 설치하는 방법은 아래 내 블로그 링크에 나와있다. VMware에서 Ubuntu 설치 VMware란? 현재 시중에 나와있는 버츄얼 머신 프로그램 중..
-
x86-64 Assembly Language 1 어셈블러의 종류와 RegisterLinux Development/Kernel 2021. 7. 20. 05:20
개발자로서 가끔 어셈블러(Assembler 또는 Assembly programming)를 왜 해? 그거 해봐야 뭐해?라는 질문을 듣곤 한다. 개인적으로는 어셈블러가 엔지니어와 일반인을 구분하는 가장 중요한 경계선이라고 생각한다. 어셈블러를 아는 것이 당장 나에게 수익을 가져다 주진 않지만 컴퓨터의 구조를 이해하고 우리가 만들어가는 프로그램이라는 것이 무엇인지 명확히 이해할 수 있는 기회를 주기 때문이다. 더 많은 분들이 이 언어를 알고 공부했으면 하는 마음에서 이 글을 쓴다. GAS 어셈블러와 NASM 그리고 MASM 컴퓨터 레지스터 구조 컨텍스트 스위칭(Context switching) 1. AT&T 문법 어셈블러와 NASM 그리고 MASM 어셈블러는 매우 다양하다, 하나의 CPU가 개발될 때마다 CP..