Linux
expect 명령어
현재 회사에서 사용중인 제품이 PC와 연결되어 있는데 제품을 사용자가 수동으로 전원을 끄지 않고 원격으로 끄는 방법에 대해 찾아 보는 중에 ssh로 이용하여 poweroff 명령어를 보내는 것으로 가능했지만 ssh 접속 시 나오는 문구에 대해 자동으로 처리하는 방법에 대해 막히게 되었다. 구글링 하던 중 입력을 자동으로 하게 해주는 exepct 명령어를 확인하게 되었다. expect Linux manual page에 따르면 다음과 같이 설명한다. Expect 는 다른 대화형 프로그램과 "대화"하는 프로그램입니다. 사용자는 원할 때 직접 제어하고 상호 작용할 수 있습니다. 그런 다음 스크립트에 제어권을 반환합니다. SSH 자동화아래는 exepct를 사용하여 만든 원격종료 쉘 파일이다.#!/usr/bin..
[Gstreamer] appsink
appsink는 애플리케이션이 파이프라인의 GStreamer 데이터를 처리할 수 있도록 다양한 방법을 지원하는 싱크 플러그인입니다. 대부분의 GStreamer 요소와 달리 Appsink는 외부 API 기능을 제공합니다.https://gstreamer.freedesktop.org/documentation/applib/gstappsink.html?gi-language=c GstAppSinkGstAppSink Appsink is a sink plugin that supports many different methods for making the application get a handle on the GStreamer data in a pipeline. Unlike most GStreamer elements,..
ubuntu 네트워크 장치 이름 변경
네트워크 인터페이스명 가지고 프로젝트를 진행하던 중 우분투를 깔면서 이더넷 인터페이스가 바뀌게 되면서 프로그램을 우분투 버전마다 프로그램을 만들어야 되는 상황이 생겼다. 그래서 네트워크 인터페이스를 고정할 수 있는 방법에 대해서 알아 봤다. 1. 네트워크 인터페이스 MAC 주소 확인 ifconfig 2. 70-persistent-net.rules 생성 sudo gedit /etc/udev/rules.d/70-persistent-net.rules SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="MAC 주소", NAME="인터페이스 명" NAME 부분에 다른 명칭도 사용 가능 테스트는 enp0s3으로 진행한다. 3. grub 수정 sudo g..
PCIe ASPM Error
PCie 장치를 Host PC 에 장착 후 부팅 하였을 때 아래와 같은 에러 메시지가 출력되는 에러가 발생한다. 해당 에러 메시지는 PC 메인보드에서 PCIe 슬롯에 장착된 디바이스들의 전원을 컨트롤 하는 ASPM 기능에 대한 에러 메시지로 PC 와 장치의 기능 관련으로는 전혀 문제가 없다. ASPM이란? 활성 상태 전원 관리(ASPM, Active-State Power Management)는 PCIe 서브시스템의 전원 소비를 PCIe 연결로 접속된 장치가 사용중이 아닐 때 저전력 상태로 변경해서 절약하는 전원 관리 메커니즘입니다. ASPM은 연결된 디바이스들의 전원 상태를 제어합니다. 해당 에러 메시지가 뜨는 것을 막기 위해서는 ASPM 기능을 끄는 것으로 방법은 아래와 같다. PC 를 실행 후 터미널..
i2c-tools
i2c-tools는 코드를 작성하지 않고도 I2C 주변 장치를 쉽게 디버깅할 수 있게 해주는 I2C 프로그램이다.i2cdetect특정 I2C 버스에 어떤 주변 장치가 연결되어 있는지 확인할 수 있습니다.i2cdetect -l // i2c 연결된 모든 라인 확인특정 I2C 버스에서 감지된 주변 장치 목록을 가져옵니다i2cdetect -r -y 2ex) i2cdetect -r -y 2 // i2c 라인 2번에 연결된 모든 장치 주소 확인i2cset ( 1byte & 2byte Adress )원하는 장치에 직접 쓰려면 i2cset를 사용한다.i2cset -f -y 2ex) i2cset -f -y 2 0x10 0x01 0x50 // i2c 라인 2번에 연결된 0x10 주소를 가진 장치의 0x01 (1by..
SSD 자동 인식
리눅스에서 ssd에 파일을 저장하는 프로그램을 만들다가 자동으로 ssd를 인식하고 포맷 후 마운트 하는 작업이 필요하여 만들게 되었다. fdisk 를 이용해서 구성할려고 하였지만 사용중인 SSD가 4TB 이기 때문에 parted 프로그램을 사용하였다. *fdisk는 MBR 방식이기 때문에 디스크의 사이즈가 2TB가 넘어가면 용량을 2TB 까지 밖에 사용을 못합니다. 때문에 2TB 이상의 스토리지를 사용할 때는 MBR 방식 대신 GPT 방식을 사용해주어야 합니다. #!/bin/bash # Installed Parted Checking if which parted >/dev/null; then echo "parted cli already installed!!!" for i in a b do if [ -b /..
리눅스 커널 소스의 구조
arch arch 하부 디렉토리에는 아키텍처별로 동작하는 커널 코드가 있습니다. arm: 32비트 계열 ARM 아키텍처 코드가 있다. arm64: 64비트 계열 ARM 아키텍처 코드가 있습니다. x86: 폴더 이름과 같이 인텔 x86 아키텍처 코드가 있습니다. include include에는 커널 코드 빌드에 필요한 헤더 파일이 있습니다. Documentation 커널 기술 문서가 있는 폴더로, 커널 시스템에 대한 기본 동작을 설명하는 문서를 찾을 수 있습니다. 커널 개발자를 대상으로 작성된 문서이기에 커널에 대한 기본 지식이 없으면 이해하기가 조금 어렵습닏. kernel 커널의 핵심 코드가 있는 디렉토리로, 다음과 같은 하위 디렉토리를 확인할 수 있습니다. irq: 인터럽트 관련 코드 sched: 스케..
Memory mapping
Memory mappingMemory mapping 은 파일을 프로세스의 메모리에 매핑하는 것이다. 일반적으로 File에 접근할 때 File I/O system call을 사용하여 접근한다. 매핑을 사용하게 되면 File을 프로세스의 가상 메모리 공간으로 매핑하게 된다. 즉 File I/O system call을 사용하지 않고도 접근이 가능하다.mmap함수를 사용하면 파일을 프로세스의 가상 메모리에 매핑할 수 있다. 메모리에 매핑된 데이터는 파일 입출력 함수를 사용하지 않고 직접 읽고 쓸 수 있다.mmap#includevoid* mmap(void *addr, size_tlength, intprot, intflags, intfd, off_toffset);addr : 매핑할 메모리 주소 hint (일반적으로..
read(), write()
https://rorsi.tistory.com/65 이전 open(), close()에 이어서 이번에는 read(), write()를 구현해 보고자 한다. driver.c #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME "driver" static dev_t device_dev; static struct class *device_class; static struct cdev device_cdev; static char *buffer = NULL; int device_open(struct inode *inode, struct file *filp); int de..
open(), close()
https://rorsi.tistory.com/61 디바이스 드라이버 디바이스 드라이버(Device Driver) 일반적으로 디바이스란 컴퓨터에 물려있는 여러 주변장치들을 뜻한다. 네트워크 어댑터, 오디오, 키보드, 마우스 등이 디바이스에 해당하고, 이러한 디바이스들 rorsi.tistory.com 위 포스트에 이어서 디바이스 드라이버를 만들었다면 이제 그 드라이버를 이용해 open(), close()를 구현해 보고자 한다. driver.c #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME "driver" static dev_t device_dev; stati..