사용자 모드와 시리즈의 커널을 열고 : 사용자 모드 응용 프로그램 실행 시스템 호출하는 방법을

머리말

일정 기간 전에 커널의 보류 및 응용 프로그램의 특정 측면에서 C에서 좀 더 최근에 개발 ++ 얻을 수 있습니다. 현재의 일상 업무가 일부 성능 분석이 발생, 다른 잠금 API의 문제를 선택, 우리는 발견으로 인해 API 사용자 모드 프로그램, 특히 관계 뒤에 작동 원리 및 사전지도, 커널, 불분명 커널 구현 프로세스를 호출 기대를 분석 할 수 없습니다. 이를 위해, 우리는 다음과 같은 발생하는 작업 문제를 결합하려는 :

  1. 어떻게 사용자 모드 응용 프로그램 실행 시스템 호출;
  2. 기본이되는 구현의 관계와 커널 모드와 사용자 모드 잠금 잠금에게 무엇입니까;
  3. 다른 사용자 모드 잠금 비교 접근 이론적 분석의 비 잠금기구 (스핀 잠금, 잠금, 잠금 상태를 판독);
  4.  어떻게 달성하기 위해 특정의 커널에가 libaio 비동기 IO;
  5.  시스템 호출, 스레드 스케줄링은 CPU 사용에 영향을 미치는 시스템 성능에 각각 중단;

우리는 이러한 기본적인 문제를 통해 상대적으로 가까운 관계를 구축하도록 돕고, 지식의 마음을 얻기 위해 서로 고립되어, 위의 분류 할 수 있기를 바랍니다.

ABC 시스템 호출

시스템 호출 기능

운영 체제의 관점에서, 커널 시스템 호출은 가장 낮은 수준의 사용자 모드 프로그램 운영 소프트웨어 또는 하드웨어 인터페이스를 제공합니다. 리눅스 시스템은 각 하드웨어 시스템 아키텍처는 MIPS 아래의 시스템 호출 테이블로, 자신의 시스템 호출 테이블이 있습니다 :

 EXPORT(sys_call_table)
    PTR sys_read            /* 5000 */
    PTR sys_write
    PTR sys_open
    PTR sys_close
        ....
        PTR sys_statx
    PTR sys_rseq
    PTR sys_io_pgetevents
    .size   sys_call_table,.-sys_call_table

        ...
        NESTED(handle_sys64, PT_SIZE, sp)
#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
    /*
     * When 32-bit compatibility is configured scall_o32.S
     * already did this.
     */
    .set    noat
    SAVE_SOME
    TRACE_IRQS_ON_RELOAD
    STI
    .set    at
        .....

        syscall_common:
    dsubu   t2, v0, __NR_64_Linux
    sltiu   t0, t2, __NR_64_Linux_syscalls + 1
    beqz    t0, illegal_syscall

    dsll    t0, t2, 3       # offset into table
    dla t2, sys_call_table
    daddu   t0, t2, t0
    ld  t2, (t0)        # syscall routine
    beqz    t2, illegal_syscall

    jalr    t2          # Do The Real Thing (TM)

작업 공정 시스템 호출

보기의 호출자의 관점에서 :

(1) 동작 사양 기준 시스템 호출 파라미터, 데이터 준비,
(2) 표준 인터페이스 모드 시스템 호출의 시스템 호출 인터페이스를 통해 호;

볼 수있는 호출자의 관점에서 :

(1) 시스템 사용자 모드에서 일반적인 호 처리 시스템 하드웨어와 커널이 상태로 상기 프로세서의 상태, 중단 과정, 즉 보호 먼저 CPU 환경 후;

시스템 콜에 적절한 처리 루틴으로의 시스템 호출 유형 (2) 분석;

(3) 시스템 콜 처리 서브 루틴이 실행 복구 프로세스 CPU 또는 설정된 새로운 장면이 중단되고, 그 후, 프로세스 또는 Jiong 새로운 프로세스를 인터럽트 복귀 구현을 계속한다.

사용자 모드 응용 프로그램 빠른 시스템 호출

현재 급속한 발전을 위해, 당신은 빨리 다음가 libaio이 빠른 호출을 달성하는 등, 시스템 콜에 의해 호출 할 수 있습니다 :

/* Actual syscalls */
int io_setup(int maxevents, io_context_t *ctxp) {
    return syscall(_io_setup, maxevents, ctxp);
}

int io_destroy(io_context_t ctx) {
    return syscall(__io_destroy, ctx);
}

위의 예에 따르면, 독자는 자신의 시스템 호출을 호출 할 수 있습니다.

추천

출처blog.51cto.com/xiamachao/2434444