
문제해결능력)가 되려면 리눅스 커널을 알아야 함리눅스 커널에서 제공하는 표준 API 사용 Device 파일

kenel/fork.c
static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
{
struct task_struct *tsk;
unsigned long *stack;
struct vm_struct *stack_vm_area _maybe_unused;
int err;
if(node == NUMA_NO_NODE)
node = fsk_fork_get_node(orig);
// task descriptor struct 할당
tsk = alloc_task_struct_node(node);
if(!tsk)
return NULL;
// stack 할당
stack = alloc_thread_stack_node(tsk,node);
if(!stack)
goto free_tsk;
stack_vm_Area = task_stack_vm_area(tsk);
err = arch_dup_task_struct(tsk,orig);
tsk->stack = stack;
}
kernel.fork.c
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, int _user *, parent_tidptr, unsigned long, tis, int _user *, child_tidptr)
{
struct kernel_clone_args args = {
.flags = (lower_32_bits(clone_flags) & ~CSIGNAL),
.pidfd = parent_tidptr,
.child_tid = child_tidptr,
.parent_tid = parent_tidptr,
.exit_signal = (lower_32_bits(clone_flags) & CSIGNAL),
.stack = newsp,
.tls = tls,
};
return kernel_clone(&args);
}
kernel/fork.c
static _latent_entropy struct task_struct *copy_process(struct pid *pid, int trace, int node, struct kernel_clone_args *args)
{
p = dup_task_struct(current, node);
if(!p) goto fork_out;
// ...
retval = copy_creds(p, clone_flags);
// ...
/* Perform scheduler related setup. Assign this task to a CPU.*/
retval = sched_fork(clone_flags, p);
// ...
retval = security_task_alloc(p, clone_flags);
// ...
}
| 1단계 | 2단계 | 3단계 | 4단계 | 5단계 | ||||
|---|---|---|---|---|---|---|---|---|
| Spec 확정 | FPGA 검증 | 공정개발 | Packaging | BSP 개발 | ||||
| RTL 설계(VeriLog) | 👣Code Freeze | Back-End 개발 | 👣DB Out | 공정개발 | 👣Sample Out | Bring-up | System | 👣Engineering Sample |
| 합성/검증 | 특성 평가 | Integration |
Intellectual Property의 약자로 재사용 가능하도록 기능을 모듈화해 설계한 Core DesignDigital IP / Mixed IP[1] IP 로직 설계
[2] 파운드리에서 공정 개발
[3] 시스템 소프트웨어 개발
Linux Device Driver를 이용해 IP 제어
잘 보고 갑니다. 감사합니다.