336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


12 process.pdf


13 ipcs.pdf


14 thread.pdf


Embedded Linux 설정(ubuntu)6410Arm.txt


Embedded Linux.pdf


Linux_Basic[1일차].txt

[1일차]

http://kernel.org : 리눅스 커널을 다운로드 받을 수 있는 사이트
Shell : Kernel과 상호 작용하기 위한 통로

 

#Linux 배포판 : Kernel + Shell + Application

 1. Redhat 계열 : Fedora, centOS --> 네트워크 관리, 서버 구축할때 많이 사용함

 2. Debian 계열 : Ubuntu

 

# Embedded Linux 실행 환경 구성

  **Embedded Linux Kernel Porting : zImage

    - 하드웨어 구성에 맞게 혹은 CPU에 맞게 Kernel을 포팅 과정을 통해서 zImage를 만듬

  1. "minicom" 환경 구성 (sudo apt-get install minicom) : 시리얼 포트를 이용한 데이터 송수신 패키지

  2. "TFTP" 이용한 Embedded Linux 실행 환경 구성

 

# Embedded Linux 개발 환경 구성

 1. Cross Compiler 환경 구성 : CPU에 맞게 바이너리를 만들어야 하기 때문에 CPU에서 제공하는 Compiler가 가장 정확함

 2. "NFS" 이용한 작업 공간 구성

 

[Virtual Box 설정]
1. 환경설정
 1.1 일반 > 기본머신 폴더 : D:\ 로 지정
 1.2 확장 : 다운로드 받은 extension pak 설치


2. 파일 > 가상 시스템 가져오기
 : 32bit에서도 64bit 리눅스 설치 가능함


3. 가져온 pack 설정
 3.1. 시스템 : 기본 메모리는 물리 메모리의 50% 사용 : 초록색선까지 움직이고 아래 잘못된 설정이 사라질때까지 맞추도록함
 3.2. 프로세스도 마찬가지로 초록색까지
 3.3. 공유 폴더 : 리눅스 기능이 아니고 Virtual Box 기능임 : 폴더를 Share로 설정함
      : 해당 공유 폴더는 윈도우 시스템으로 여기서 리눅스 프로그램 작성이나 실행은 하지 말고 copy 용도로만 사용


4. 머신/설정
 4.1. USB에서 외부 USB LAN 등록 : ASIX Elec Corp 추가
 4.2. 화면 하단에 USB 아이콘 우측 클릭 > 추가된 USB 장치 선택
 
5. 시리얼 설치
 5.1. Virtual Box 설정 > 직렬 포트 : 포트모트를 호스트 장치로 변경, 포트/파일 경로를 COM1으로 설정


6. Minicom 설치
root@worker-VirtualBox:~# apt-get -f install (apt-get install minicom 실패시 먼저 command를 실행해야 함)
root@worker-VirtualBox:~# apt-get install minicom
root@worker-VirtualBox:~# minicom -s (minicom setup)

 

[Serial port setup]
   A - Serial Device : /dev/ttys0 (USB의 경우에는 /dev/ttypUSB0)

   B - Bps/Par/Bits : 115200 8N1 (보내는 쪽과 받는 쪽의 속도를 맞춰줘야 한다)

   C - Hardware Flow Control : No (실리얼포트는 데이트를 받는 쪽에서 오류 흐름제어를 하지 않음)

 Save setup as dfl

 Exit from Minicom


root@worker-VirtualBox:~# minicom

 

6. TFTP 설치 (UDP 기반의 프로토콜 : 서버 주소만 받으면 다운로드가 가능함)

root@worker-VirtualBox:~# apt-get install xinetd tftpd tftp nfs-kernel-server
root@worker-VirtualBox:~# gedit /etc/xinetd.d/tftp &

 

[새파일 > 저장]
service tftp
{
 protocol = udp
 port = 69
 socket_type = dgram
 wait = yes
 user = nobody
 server = /usr/sbin/in.tftpd
 server_args = /tftpboot   // 앞으로 server로 부터 다운로드 받을 위치 지정
 disable = no
}

 

root@worker-VirtualBox:~# mkdir /tftpboot
root@worker-VirtualBox:~# chmod 777 /tftpboot
root@worker-VirtualBox:~# cp share/zImage /tftpboot/
root@worker-VirtualBox:~# cp share/rootfs_ramdisk.gz /tftpboot/

 

zImage(2MB 이내) : Embedded Linux Kernel Image
rootfs_ramdisk.gz : root file system

 

root@worker-VirtualBox:~# /etc/init.d/xinetd restart

root@worker-VirtualBox:~# ifconfig


eth0      Link encap:Ethernet  HWaddr 08:00:27:e6:66:90 
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fee6:6690/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9361 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5414 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11357012 (11.3 MB)  TX bytes:380163 (380.1 KB)

eth1      Link encap:Ethernet  HWaddr 00:50:b6:63:6b:be 
          inet6 addr: fe80::250:b6ff:fe63:6bbe/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:579 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:26634 (26.6 KB)  TX bytes:133060 (133.0 KB)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:242850 errors:0 dropped:0 overruns:0 frame:0
          TX packets:242850 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:28714349 (28.7 MB)  TX bytes:28714349 (28.7 MB)

 

eth1이 실제로 개발보드랑 연결된 ethenet 이다
우분투 상단의 네트워크 아이콘에서 우측 버튼 > 편집 > 유선연결2 (eth1 확인)
 - IPv4설정 > 수동 > 추가 > 192.168.10.3/255.255.255.0/192.168.10.254
위 설정 후에 ifconfig 로 다시 확인

이후에 개발보드 rebooting

Welcome to PJLinux
ARM Linux
pjlinux login: root ----> root 입력

-------------------------------------------------------------------------------------------
---> 여기까지가 embedded linux booting

 

EL6410 # tftp 50008000 zImage
: 50008000 번지수에 커널 이미지를 다운로드 받아라

: 50008000 번지수 결정은 부트로더에서 이미 결정됨

 

EL6410 # tftp 51000000 rootfs_ramdisk.gz

EL6410 # bootm 50008000 (일반적으로는 go linux)


+ 임베디드 리눅스 커널 버전
[root@pjlinux ~]$ uname -r (or cat /proc/version)
2.6.29

+ PC의 우분투 배포판 리눅스 커널 버전
root@worker-VirtualBox:~# uname -r
3.2.0-29-generic

 

** 현재는 보드를 boot를 하면 bootcmd에 아래 command가 들어가 있음으로 네트워크만 연결이 되어 있으면 자동으로 kernerl 과 ramdisk 이미지를 다운로드 받게 된다.

bootcmd=tftp 50008000 zImage;tftp 51000000 rootfs_ramdisk.gz; bootm 50008000

: 실제로 양산시에는 NAND에 올라가 있게 되는데 위에 bootcmd가 NAND command로 변경이 된다 

 

-------------------------------------------------------------------------------------------

 

CPU 랑 RAM 만 직접 연결, RAM은 NAND와 직접 연결됨
ROM에 있는 내용은 RAM으로 옮겨와야 함 (ROM에는 부트로더가 있음)
커널이 동작하려면 기본 파일 시스템이 구성되어 있어야 함
부트로더가 Zimage를 RAM으로 복사하고 RAM의 기본 memory map을 구성하고 kernel을 map에 구성하고 ramdisk를 통해 파일시스템 구조를 만든다.
NAND 메모리는 주소 방식이 아닌 블럭 방식으로 저장, NOR 메모리는 프로그램 실행 가능
초기에는 RAM은 boot만 들어 있음
TFTP로 ZImage를 다운로드 받으면 RAM으로 복사하고 Boot에는 압축해제하는 프로그래밍이 없기때문에 ZImage에는 압축해제하는 기능이 들어 있음
ZImage는 커널만 들어 있고 실제로 ramdisk 를 같이 설치해야 RAM에 파일 시스템의 구조를 만들어야 함
사용화된 제품에는 NAND 에 kernel 이미지와 ramdisk를 가지고 있음
포팅 영역 : RAMDISK 구성

 

-----------------------------------------------------------------------------------------------------
root@worker-VirtualBox:~/work# gcc -o first first.c
root@worker-VirtualBox:~/work# ls -l
ls -l 을 통해서 x가 들어가 있는지 확인
-rwxr-xr-x 1 root root 8432  6월 30 16:40 first
소유자|그룹|기타

 

# 파일의 구조 알아보기
root@worker-VirtualBox:~/work# file first
first: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x29ed7e96f1d4e22d79af21c9543b46921467158e, not stripped
 - [ELF] 리눅스의 바이너리 코드의 64비트 파일, executable:실행 파일
 - [x86-64] x86(인텔코어를 기반으로 CPU) -> ARM 코어의 CPU에서 실행해도 동작이 안됨 : 바이너리를 ARM코어에 맞게 만들어야 함
            gcc는 현재 PC용 컴파일러임, 크로스 컴파일러가 아님
   
root@worker-VirtualBox:~/work# ls ~/share/
4.3.2-eabi-arm.tar.gz  crb  mango64_kernel_2010_07_02.tgz  rootfs_ramdisk.gz  zImage
~ 는 사용자의 home
4.3.2-eabi-arm.tar.gz : arm cross compiler

# cross compiler 설치
usr 폴더는 window의 programfiles 와 비슷한 역할
local : 사용자가 임의로 설치하는 폴더

root@worker-VirtualBox:~/work# cd /usr/local/
root@worker-VirtualBox:/usr/local# mkdir arm
root@worker-VirtualBox:/usr/local# cd arm/
root@worker-VirtualBox:/usr/local/arm# tar xvzf ~/share/4.3.2-eabi-arm.tar.gz

root@worker-VirtualBox:/usr/local/arm# ls
4.3.2-eabi-arm
root@worker-VirtualBox:/usr/local/arm# ls 4.3.2-eabi-arm/bin/
arm-generic-linux-gnueabi-addr2line     arm-generic-linux-gnueabi-gcc-4.3.2  arm-generic-linux-gnueabi-populate
arm-generic-linux-gnueabi-ar            arm-generic-linux-gnueabi-gccbug     arm-generic-linux-gnueabi-ranlib
arm-generic-linux-gnueabi-as            arm-generic-linux-gnueabi-gcov       arm-generic-linux-gnueabi-readelf
arm-generic-linux-gnueabi-c++           arm-generic-linux-gnueabi-gdb        arm-generic-linux-gnueabi-run
arm-generic-linux-gnueabi-c++filt       arm-generic-linux-gnueabi-gfortran   arm-generic-linux-gnueabi-size
arm-generic-linux-gnueabi-cc            arm-generic-linux-gnueabi-gprof      arm-generic-linux-gnueabi-sstrip
arm-generic-linux-gnueabi-cpp           arm-generic-linux-gnueabi-ld         arm-generic-linux-gnueabi-strings
arm-generic-linux-gnueabi-ct-ng.config  arm-generic-linux-gnueabi-nm         arm-generic-linux-gnueabi-strip
arm-generic-linux-gnueabi-g++           arm-generic-linux-gnueabi-objcopy
arm-generic-linux-gnueabi-gcc           arm-generic-linux-gnueabi-objdump


arm-generic-linux-gnueabi-gcc : 앞으로 이 파일을 써야 함
---> 기본 pass 설정을 해야 함

root@worker-VirtualBox:/usr/local/arm# gedit /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2-eabi-arm/bin"
:/usr/local/arm/4.3.2-eabi-arm/bin 추가
*** 리눅스에서는 :, 윈도우즈에서는 ;

 

root@worker-VirtualBox:/usr/local/arm# echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
root@worker-VirtualBox:/usr/local/arm# source /etc/environment
root@worker-VirtualBox:/usr/local/arm# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2-eabi-arm/bin

source 명령어를 통해서 스크립트를 다시 실행 하도록 한다.

root@worker-VirtualBox:~/work# arm-generic-linux-gnueabi-gcc -o first first.c
root@worker-VirtualBox:~/work# file first
first: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.20, not stripped
*** ARM 으로 변경되어 있음

root@worker-VirtualBox:~/work# ./first
bash: ./first: 바이너리 파일을 실행할 수 없음
: 바이너리 코드가 현재 CPU에서 실행할 수 없음
---> 임베디드에서 확인 해봐야 함, 보드로 옮겨야 함 (NFS로 이용하도록 하자)

root@worker-VirtualBox:~/work# arm-generic-linux-gnueabi-gcc -o first first.c -static
: 다시 컴파일 (현재 보드에서는 static으로 붙여서 컴파일해야 실행 가능함, 포팅문제임)

아까 apt-get install 을 통해서 이미 nfs 설치함

### NFS 설정
root@worker-VirtualBox:~/work# gedit /etc/exports &

# /etc/exports: the access control list for filesystems which may be exported
#  to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/tftpboot   *(rw,no_root_squash,no_all_squash,async)

/tftpboot   *(rw,no_root_squash,no_all_squash,async) 를 추가함
NFS로 /tftpboot 폴더를 네트워크로 보드에서 자기것처럼 쓸수 있음
* : 모든 권한을 줘라
no_all_squash : 모든 사용자에게 권한
async : 동시접속시 순서대로 쓸수 있게 하라

root@worker-VirtualBox:~/work# /etc/init.d/nfs-kernel-server restart
root@worker-VirtualBox:~/work# cp first /tftpboot/


##### minicom 으로 이동
현재 시스템의 마운트 현황 보기 : df
[root@pjlinux ~]$ df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/root                15863     10688      4356  71% /

[root@pjlinux ~]$ mount -t nfs -o nolock,rsize=1024,wsize=1024 192.168.10.3:/tftpboot /mnt/nfs
mount: RPC: Unable to receive; errno = No route to host
mount: nfsmount failed: Bad file descriptor
mount: Mounting 192.168.10.3:/tftpboot on /mnt/nfs failed: Bad file descriptor

[root@pjlinux ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr C6:C1:F7:F5:E2:52 
          inet addr:192.168.0.165  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:252 (252.0 B)
          Interrupt:112

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:344 (344.0 B)  TX bytes:344 (344.0 B)

inet addr:192.168.0.165 으로 되어 있음 (다시 설정 하도록 함)

 

[root@pjlinux ~]$ ifconfig eth0 down
[root@pjlinux ~]$ ifconfig eth0 192.168.10.4 up
net eth0: SMSC911x/921x identified at 0xc8a00000, IRQ: 112
[root@pjlinux ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr C6:C1:F7:F5:E2:52 
          inet addr:192.168.10.4  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:252 (252.0 B)
          Interrupt:112

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:344 (344.0 B)  TX bytes:344 (344.0 B)

[root@pjlinux ~]$ mount -t nfs -o nolock,rsize=1024,wsize=1024 192.168.10.3:/tftpboot /mnt/nfs
: 이제야 접속됨

[root@pjlinux ~]$ df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/root                15863     10688      4356  71% /
192.168.10.3:/tftpboot 312196880   9352948 287215388   3% /mnt/nfs

: 앞으로는 /mnt/nfs 에 접속하면 /tftpboot 로 접근 가능함

[root@pjlinux ~]$ cd /mnt/nfs/
[root@pjlinux nfs]$ ls -al
drwxrwxrwx    2 root     root         4096 Jun 30  2014 .
drwxr-xr-x    9 1007     500          1024 Apr 14  2008 ..
-rwxr-xr-x    1 root     root       584613 Jun 30  2014 first
-rwxr-xr-x    1 root     root      4440413 Jun 30  2014 rootfs_ramdisk.gz
-rwxr-xr-x    1 root     root      1881576 Jun 30  2014 zImage

---------------------------------------------------------------------------------------------


Linux System Programming
[Application]
1. C 표준 라이브러리 기반 프로그래밍 : 윈도우에서 만든 프로그램을 리눅스에서 다시 컴파일 하면 동작함
2. C 표준 라이브러리 + Linux System call 활용 프로그래밍
   Linux System call : Linux Kernel 기능에 대한 Interface 함수 들의 집합
   Kernel 함수는 Kernel에서만 동작 : Kernel 함수를 직접 호출 못하기 때문에 interface 함수를 통해서 call

 

[    Application   ]  [    Library   ]
----------------------------------------- Linux Kernel
[            System Call             ]
[File System][Memory관리][Process관리]
[  Device Driver  ]  [  Network관리  ]
[          Device Interface          ]
-----------------------------------------
[                Driver              ]

: 위 구조는 kernel 기능을 알아야 한다.

 

[Application]
[Platform/Framework]
[Linux Kernel]
[Driver]
: 위 구조에서는 kernel 기능을 알 필요 없다.

리눅스 커널에서는 Virtual File System 을 사용함

'ⓟrivacy > Linux' 카테고리의 다른 글

[Virtual box] SSH로 Ubuntu 접속 하기  (0) 2018.11.30
블로그 이미지

뚱땡이 우주인

,