실험 분석 : https://www.zhihu.com/column/c_142990858
Linux는 오픈 소스 운영 체제입니다. 사용자는 자체 시스템에 따라 커널을 조정하고 수정하여보다 적절한 기능과 더 높은 운영 효율로 시스템을 사용자 정의해야합니다. 따라서 Linux 커널을 컴파일하는 것은 커널 개발에 필요한 기본 기술입니다.
시스템에서 필요에 따라 새 시스템 호출을 추가하는 것은 커널을 수정하는 일반적인 방법입니다. 이 실험을 통해 독자는 Linux 시스템 처리 시스템 호출의 프로세스와 시스템 호출 추가 방법을 이해해야합니다.
(1) 지정된 프로세스의 좋은 값의 수정 또는 읽기 기능을 구현하기 위해 시스템 호출을 추가하고 프로세스의 최신 값과 우선 순위를 반환합니다. 프로토 타입을 다음과 같이 호출하는 것이 좋습니다.
int mysetnice (pid_t pid, int flag, int nicevalue, void __user * prio, void __user * nice);
매개 변수 의미 : PID : 프로세스 ID.
플래그 : 값이 0이면 좋은 값을 읽는 것을 의미합니다. 값이 1이면 좋은 값을 수정하는 것을 의미합니다.
Prio, Nice : 프로세스의 현재 우선 순위와 좋은 가치. 반환 값 : 반환 0 시스템 호출이 성공하면 오류 코드 efault를 반환합니다.
(2) (1)에 추가 된 간단한 응용 프로그램 테스트를 작성하십시오.
(3) 프로그램에서 Linux의 커널 기능이 호출되면 관련 함수의 소스 코드를 깊이 읽어야합니다.
Linux가 제공하는 모듈 메커니즘은 커널을 다시 컴파일하지 않고 Linux 기능을 동적으로 확장 할 수 있으며 Linux 커널의 많은 기능을 구현하는 데 널리 사용되었습니다. 이 실험에서는 모듈의 기본 개념, 원칙 및 구현 기술을 배우고 커널 모듈을 사용하여 프로세스의 기본 정보를 프로그래밍하고 액세스하여 프로세스 개념에 대한 이해를 심화시켜 모듈 프로그래밍 기술을 마스터합니다.
(1) 시스템의 모든 커널 스레드의 프로그램 이름, PID 번호, 프로세스 상태 및 프로세스 우선 순위를 나열 해야하는 모듈을 설계하십시오.
(2) 매개 변수가 프로세스의 PID 번호 인 매개 변수가있는 모듈을 설계하십시오. 이 모듈의 기능은 프로그램 이름 및 부모 프로세스의 PID 번호, 형제 프로세스 및 아동 프로세스를 포함하여 프로세스의 가족 정보를 나열하는 것입니다.
(3) 자신의 상황에 따라 프로그램에 사용 된 관련 커널 기능의 소스 코드 구현을 추가로 읽으십시오.
(1) Linux의 명령 인터페이스에 익숙합니다.
(2) Linux 프로세스 제어를위한 관련 시스템 호출의 프로그래밍 응용 프로그램을 통해 프로세스 개념에 대한 이해를 더욱 심화시키고 프로세스와 프로그램 간의 연결과 차이점을 명확히하고 동시 프로세스 실행의 특정 의미를 이해합니다.
(3) Linux 파이프 라인 통신 메커니즘, 메시지 대기열 통신 메커니즘 및 공유 메모리 통신 메커니즘을 사용하여 다양한 유형의 프로세스 통신 방법에 대한 이해가 심화됩니다.
(4) Linux에서 Posix semaphores의 적용을 통해 Semaphore 동기화 메커니즘의 이해를 심화시킵니다. (5) 자신의 상황에 따라 관련 시스템 호출의 커널 소스 코드 구현을 추가로 읽고 분석하십시오.
(1) 일반적인 Linux 명령에 익숙합니다 : Pwd, UserAdd, Passwd, Who, PS, PSTREE, KILL, LS, LS, CD, MKDIR, RMDIR, CP, RM, MV, CAT, MORE, GREP 등
(2) 시뮬레이션 된 쉘 구현 :
세 가지 다른 프로그램 CMD1.C, CMD2.C 및 CMD3.C를 작성하십시오. 각 프로그램의 기능은 각각 사용자 정의 및 실행 파일 CMD1, CMD2 및 CMD3으로 컴파일됩니다. 그런 다음 쉘 프로그램의 기능을 시뮬레이션하는 프로그램을 작성하십시오. 사용자가 입력 한 문자열 (해당 명령 이름을 나타내는)을 기반으로 해당 명령에 대한 하위 프로세스를 생성하고 해당 프로그램을 실행하도록 할 수 있습니다. 학부모 절차는 자식 과정이 종료 될 때까지 기다린 다음 다음 명령을 받기를 기다립니다. 수신 된 명령이 종료되면 부모 프로세스가 종료됩니다. 수신 된 명령이 잘못된 명령 인 경우 "명령을 찾을 수 없음"이 표시되고 계속 기다립니다.
(3) 파이프 라인 통신 프로그램 구현 :
파이프 라인은 부모 프로세스에 의해 생성 된 다음 3 개의 아동 프로세스가 생성되며,이 세 가지 아동 프로세스는 파이프 라인을 사용하여 부모 프로세스와 통신합니다. 아동 프로세스는 정보를 전송하고 부모 프로세스 및 기타 세 가지 프로세스는 모든 메시지를 보내면 정보를받습니다. 의사 소통의 특정 내용은 자신의 요구에 따라 마음대로 설계 될 수 있으며, 차단 및 쓰기 프로세스의 다양한 상황을 테스트하고 파이프 라인의 기본 크기를 테스트하며 Posix Semaphore 메커니즘을 사용하여 프로세스 간 파이프 라인에 대한 상호 배타적 액세스를 달성해야합니다. 다양한 상황에서 프로세스 및 프로세스 차단 및 상승에 의해 실제 바이트 수를 읽고 쓰는 실제 바이트 수를 관찰하기 위해 프로그램을 실행하십시오.
(4) Linux의 메시지 대기열 통신 메커니즘을 사용하여 두 스레드 간의 통신을 실현합니다.
발신자 스레드와 수신 스레드를 만들기위한 프로그램을 작성합니다. 여기서 발신자 스레드는 메시지 큐를 생성하는 함수 송수신 ()을 실행 한 다음 사용자가 터미널을 통해 문자열을 입력 할 때까지 기다렸다가 사용자가 "종료"에 들어갈 때까지 메시지 스레드를 통해 문자열을 메시지 스레드로 보내도록 기다립니다. 마지막으로 "END"메시지를 수신기 스레드에 보내고 수신자의 답장을 기다립니다. 응답 메시지 후에 터미널 화면에 수신 된 답변 정보를 표시하고 관련 메시지 큐를 삭제하고 프로그램 실행을 종료합니다. 수신자 스레드는 rece 매지 ()를 실행하며, 메시지 큐를 통해 발신자로부터 메시지를 수신하고 "end"가있는 메시지를 수신 할 때까지 터미널 화면에 메시지를 표시합니다. 현재로서는 발신자에게 "Over"답변 메시지를 보냅니다. 프로그램 실행을 종료합니다. 이름없는 세마포르를 사용하여 두 스레드 간의 동기화 및 상호 배제를 달성하십시오.
(5) Linux의 공유 메모리 통신 메커니즘을 사용하여 두 프로세스 간의 커뮤니케이션을 실현합니다.
공유 메모리를 생성하는 프로그램 발신자를 작성한 다음 사용자가 터미널을 통해 문자열을 입력 할 때까지 기다렸다가 공유 메모리를 통해 문자열을 수신기로 보냅니다. 마지막으로 수신자의 답변을 기다립니다. 회신 메시지를 수신 한 후 터미널 화면에 수신 된 응답 정보를 표시하고 공유 메모리를 삭제하고 프로그램 실행을 종료합니다. 공유 메모리를 통해 발신자로부터 메시지를 수신하고 터미널 화면에 메시지를 표시 한 다음 공유 메모리를 통해 "Over"를 "Over"로 보내 프로그램의 실행을 종료합니다. 명명 된 세마포어 또는 시스템 v 세마포어를 사용하여 두 프로세스로 공유 메모리를 상호 배타적이고 동기간으로 사용하십시오.
특정 파일 저장 공간, 파일, 디렉토리 구조 및 파일 작업의 물리적 구조를 통해 파일 시스템의 내부 데이터 구조, 기능 및 구현 프로세스에 대한 이해를 심화시킬 것입니다.
(1) 파일 스토리지 파티션으로 메모리에서 가상 디스크 공간을 열고 다단계 디렉토리를 기반으로 단일 사용자 단일 작업 시스템에서 간단한 파일 시스템을 구현하십시오. 파일 시스템을 종료 할 때 가상 파일 시스템은 파일로 디스크에 저장되어 다음에 메모리의 가상 디스크 공간으로 복원 할 수 있어야합니다.
(2) 파일 저장 공간의 할당은 명백한 링크 할당 또는 기타 방법으로 수행 할 수 있습니다.
(3) 무료 디스크 공간을 관리하기 위해 비트 다이어그램 또는 기타 방법을 선택할 수 있습니다. 비트 맵을 사용하여 파일 저장 공간을 관리하고 명시 적 링크 할당을 사용하는 경우 비트 맵을 지방으로 병합 할 수 있습니다.
(4) 파일 디렉토리 구조는 다단계 디렉토리 구조를 채택합니다. 단순화를 위해 인덱스 노드를 사용할 수 있고, 각 디렉토리 항목에는 파일 이름, 물리적 주소, 길이 등과 같은 정보가 포함되어야하며, 읽기 및 쓰기 파일도 디렉토리 항목을 통해 보호 될 수도 있습니다.
(5) 다음 작업 명령이 필요합니다.