프로그램을 만드는 프로그램사람의 언어를 CPU의 언어(기계어)로 번역프로그램을 만든다.기계어 코딩 -> 어셈블리어 -> 기타 언어(컴파일러) -> C언어CPU : 00 더해라 , 01 빼라 , 10 불러와라너무 불편하다어셈블리어가 나타남01 ADD 덧셈02 SUB 뺄셈
문제 ) 첫째 줄에는 어떤 지역을 나타내는 2차원 배열의 행과 열의 개수를 나타내는 수 N이 입력된다. N은 2 이상 100 이하의 정수이다. 둘째 줄부터 N개의 각 줄에는 2차원 배열의 첫 번째 행부터 N번째 행까지 순서대로 한 행씩 높이 정보가 입력된다. 각 줄에는
연결 리스트를 여러개0 {1,2,3}1 {0}2 {0,1}3 {0}===> adj라는 변수를 사용하게 될 예정정점마다 adj가 있다.1000번짜리 정점정점 10개visited : 방문연결하려는 정점이 있고 방문하지 않았다면 go함수 작동연결되는 정점이 방문되었다면 컨티
연결되어있다.무방향 간선 = 양방향 간선인접행렬이란 그래프에서 정점과 간선간의 관계를 나타내는 bool타입의 정사각형 행렬정사각형 행렬의 각 요소가 0 또는 1이라는 값으로 가짐을 의미 ,0은 두 정점 사이의 경로가 없음을 의미하며 1은 두 정점 사이의 경로가 있음을
각각의 노드의 자식노드 수가 2개 이하로 구성되어있는 트리완전이진트리 : 포화 이진 트리가 되기 직전균형이진트리 : 모든 노드의 왼쪽 하위트리와 오른쪽 하위트리의 차이가 1이하인 트리=> 높이차이가 2개 이상이면 안됨오른쪽 하위 트리에는 '노드의 값보다 큰 값'을 가진
자식 노드와 부모 노드로 이루어진 계층적인 구조를 가지며 무방향 그래프의 일종이자 사이클이 없는 자료구조리프 노드 : 가장 끝에 있는 노드(자식 노드가 없음)루트 노드 : 가장 첫 번째 노드내부 노드 : 루트 노드와 리프 노드 사이에 있는 노드위 : 부모아래 : 자식계
디바이스 드라이버나 커널 드라이버가 초기화되는 레벨 빌트인 타입으로 등록된 모든 디바이스 드라이버가 초기화됨빌트인 타입 : 작성한 디바이스 드라이버가 커널 이미지에 포함이 되어서 커널의 기능이 하나로 부팅이 됨모듈 타입 : insmod 명령을 사용해서 디바이스 드라이
initcall:\* printk:console디바이스 드라이버가 가장 먼저 초기화 될 때 호출되는 함수.타임스탬프를 확인하여 함수의 실행시간을 체크할 수 있다.구현부 아래에 late_initcall로 지정된 매크로가 확인 가능하다.리눅스 커널이 부팅하는 과정에서 특
커널 소스를 수정할 필요가 없음boot-time ftrace tracing이 필요한 이유부팅 시간 이슈 대응부팅 초반 tracing을 위해서 (0.0002 초부터 트레이싱 가능) 부팅 시간이 느려짐 아예 부팅을 못함 (모든 event를 활성화) 자주 트레이싱되는 이벤트
작은시스템인 경우 persistent한 스토리지가 없는 경우가 많다.ex) IoT디바이스 , 센서처음에는 Boot Flash에 모두 저장이 되어있다.파워 => 부트 플래시NOR은 반도체 셀이 병렬로 배열, 소스라인이 DRAM처럼 주소 하나마다 Random accessN
임베디드 개발자는 하드웨어를 변경해야할 때가 많이 생긴다.커널이 어떤 하드웨어가 있는지 알아야 초기화 하고 사용한다.하드웨어 자원의 명세를 어떻게 알까?flash가 SD카드였다가 eMMC였다가커널에 하드코딩을 한다. => 하드웨어가 바뀌면 소스코드가 바뀌고 다시 빌드하
속성 + 디스크블럭 위치위치 : Direct + Indirecttree 구조로 나타낼 수 있다.inode는 imbalanced tree.대부분의 파일은 작다 // 작은파일을 효과적으로 지원해야함큰 파일이 스토리지의 대부분을 차지한다. // 큰 파일도 지원해야함 ==>
모든 것이 파일아이노드 + Direct , Indirect 포인터디스크 블럭의 위치정보를 포함한 uid ,gid ,time 등등 여러가지 정보를 아이노드에서 찾을 수 있다.디렉토리는 파일명과 inumber의 쌍으로 이루어져 있다.리눅스(미닉스)의 첫 번째 파일 시스템
task_struct가 가장 중요한 자료구조.task_struct는 fork가 될 때 마다 하나씩 만들어진다.pid mm => 메모리 => vmarea => text segmentpgd => 페이지테이블 => 페이지프레임files => fd => 파일 테이블 => in
해당 cmm 파일을 분석라즈베리파이에 설치된 모듈 드라이버를 출력해주는 동작이 커널로그가 어느 함수에서 호출이 되는것인가?다음 함수에서 출력이 된다.modules라는 변수가 있다. 링크드리스트 자료구조가 보인다.list 확인오프셋 : 0x8이 주소에서 8만큼 빼주면 s
소스 그 자체 보다는 소스의 변화를 분석하자 전처리 파일을 활용하자 디버깅 툴과 함께 소스를 분석하자 ftrace message를 자주 활용하자 상용 드라이버 코드를 분석하자: e.g: Qualcomm kernel BSP code embetronicx.com/
y : sYmbol 메모리 데이터 덤프elf파일 로딩 , d.load키워드를 잘 설정해야함소스 위치를 파악할 수 있음주소가 출력됨 (주소를 모를 때)(void (\*)()) &schedule = 0xFFFFFFD174D4FDF0 = schedule ->시작주소 확인d.
log -m : 커널 로그 출력runq-m : 런큐에서 실행중인 현재 프로세스 목록 / 태스크 디스크립터 확인 가능==> bash에서 크래쉬 발생CPU 2: 0 00:00:00.000 PID: 1591 TASK: ffffff805d66dac0 COMMAND: "