Изменение структуры, вырезание ассемблера, добавление работы с аргументами в shell.c
This commit is contained in:
parent
593c5051ac
commit
8535d05433
14
comp_run_iso.sh
Executable file
14
comp_run_iso.sh
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
back=$(pwd)
|
||||||
|
|
||||||
|
cd progs
|
||||||
|
cat files | cpio -H newc -o > init.cpio
|
||||||
|
cd $back
|
||||||
|
|
||||||
|
rm -rf linux-*/arch/x86/boot/image.iso
|
||||||
|
cd linux-*
|
||||||
|
#make isoimage FDARGS="initrd=/init.cpio" FDINITRD="../progs/init.cpio"
|
||||||
|
# \/ \/ Turn off system messages (very annoying)
|
||||||
|
make isoimage FDARGS="initrd=/init.cpio loglevel=0 quiet" FDINITRD="../progs/init.cpio"
|
||||||
|
qemu-system-x86_64 -cdrom arch/x86/boot/image.iso
|
||||||
|
|
||||||
|
cd $back
|
@ -46,4 +46,4 @@ make -j 4
|
|||||||
make isoimage FDARGS="initrd=/init.cpio" FDINITRD="../progs/init.cpio"
|
make isoimage FDARGS="initrd=/init.cpio" FDINITRD="../progs/init.cpio"
|
||||||
# Запуск ISO
|
# Запуск ISO
|
||||||
# -smp 1 - одно ядро, иначе сбивается время
|
# -smp 1 - одно ядро, иначе сбивается время
|
||||||
qemu-system-x86_64 -cdrom arch/x86/boot/image.iso -smp 1
|
qemu-system-x86_64 -cdrom arch/x86/boot/image.iso
|
||||||
|
BIN
progs/echo
Executable file
BIN
progs/echo
Executable file
Binary file not shown.
@ -1 +1,3 @@
|
|||||||
init
|
init
|
||||||
|
ls
|
||||||
|
echo
|
||||||
|
BIN
progs/init
BIN
progs/init
Binary file not shown.
BIN
progs/init.cpio
BIN
progs/init.cpio
Binary file not shown.
BIN
progs/shell
Executable file
BIN
progs/shell
Executable file
Binary file not shown.
@ -1,27 +0,0 @@
|
|||||||
#include <unistd.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
int real_waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options, void*);
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
char command[255];
|
|
||||||
for (;;) {
|
|
||||||
write(1, "# ", 2);
|
|
||||||
int count = read(0, command, 255);
|
|
||||||
// /bin/ls\n -> /bin/ls\0
|
|
||||||
command[count - 1] = 0;
|
|
||||||
pid_t fork_result = fork();
|
|
||||||
if (fork_result == 0) {
|
|
||||||
execve(command, 0, 0);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
// wait
|
|
||||||
//
|
|
||||||
siginfo_t info;
|
|
||||||
real_waitid(P_ALL, 0, &info, WEXITED, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_exit(0);
|
|
||||||
}
|
|
BIN
progs/shell.o
BIN
progs/shell.o
Binary file not shown.
2
progs/src/echo/build.sh
Executable file
2
progs/src/echo/build.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
gcc -static echo.c -o echo
|
||||||
|
cp echo ../../echo
|
BIN
progs/src/echo/echo
Executable file
BIN
progs/src/echo/echo
Executable file
Binary file not shown.
12
progs/src/echo/echo.c
Normal file
12
progs/src/echo/echo.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
if (argc >= 2) {
|
||||||
|
for (int i = 1; i < argc; i++) {
|
||||||
|
printf("%s ", argv[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
2
progs/src/echo/local_run.sh
Executable file
2
progs/src/echo/local_run.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
gcc -static echo.c -o echo
|
||||||
|
./echo test
|
2
progs/src/ls/build.sh
Executable file
2
progs/src/ls/build.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
gcc -static ls.c -o ls
|
||||||
|
cp ls ../../ls
|
2
progs/src/ls/local_run.sh
Executable file
2
progs/src/ls/local_run.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
gcc -static ls.c -o ls
|
||||||
|
./ls
|
BIN
progs/src/ls/ls
Executable file
BIN
progs/src/ls/ls
Executable file
Binary file not shown.
29
progs/src/ls/ls.c
Normal file
29
progs/src/ls/ls.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
|
DIR *dir;
|
||||||
|
struct dirent *entry;
|
||||||
|
if (argc == 2) {
|
||||||
|
const char *path = argv[1];
|
||||||
|
dir = opendir(path);
|
||||||
|
} else {
|
||||||
|
const char *path = ".";
|
||||||
|
dir = opendir(path);
|
||||||
|
}
|
||||||
|
if (dir == NULL) {
|
||||||
|
printf("No such file or directory\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((entry = readdir(dir)) != NULL) {
|
||||||
|
if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
|
||||||
|
printf("%s\n", entry->d_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(dir);
|
||||||
|
return 0;
|
||||||
|
}
|
2
progs/src/shell/build.sh
Executable file
2
progs/src/shell/build.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
gcc -static shell.c -o shell
|
||||||
|
cp shell ../../init
|
2
progs/src/shell/local_run.sh
Executable file
2
progs/src/shell/local_run.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
gcc -static shell.c -o shell
|
||||||
|
./shell
|
BIN
progs/src/shell/shell
Executable file
BIN
progs/src/shell/shell
Executable file
Binary file not shown.
33
progs/src/shell/shell.c
Normal file
33
progs/src/shell/shell.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char command[255];
|
||||||
|
for (;;) {
|
||||||
|
write(1, "# ", 2);
|
||||||
|
int count = read(0, command, 255);
|
||||||
|
command[count - 1] = 0;
|
||||||
|
|
||||||
|
char *argArray[100];
|
||||||
|
char *token = strtok(command, " ");
|
||||||
|
int argCount = 0;
|
||||||
|
while (token != NULL) {
|
||||||
|
argArray[argCount++] = token;
|
||||||
|
token = strtok(NULL, " ");
|
||||||
|
}
|
||||||
|
argArray[argCount] = NULL;
|
||||||
|
|
||||||
|
pid_t fork_result = fork();
|
||||||
|
if (fork_result == 0) {
|
||||||
|
execve(argArray[0], argArray, NULL);
|
||||||
|
_exit(1);
|
||||||
|
} else {
|
||||||
|
int status;
|
||||||
|
waitpid(fork_result, &status, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_exit(0);
|
||||||
|
}
|
BIN
progs/src/shell/shell.o
Normal file
BIN
progs/src/shell/shell.o
Normal file
Binary file not shown.
39
progs/sys.S
39
progs/sys.S
@ -1,39 +0,0 @@
|
|||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
.global write
|
|
||||||
.global read
|
|
||||||
.global fork
|
|
||||||
.global execve
|
|
||||||
.global real_waitid
|
|
||||||
.global _exit
|
|
||||||
|
|
||||||
write:
|
|
||||||
mov rax, 1
|
|
||||||
syscall
|
|
||||||
ret
|
|
||||||
|
|
||||||
read:
|
|
||||||
mov rax, 0
|
|
||||||
syscall
|
|
||||||
ret
|
|
||||||
|
|
||||||
execve:
|
|
||||||
mov rax, 59
|
|
||||||
syscall
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
fork:
|
|
||||||
mov rax, 57
|
|
||||||
syscall
|
|
||||||
ret
|
|
||||||
|
|
||||||
real_waitid:
|
|
||||||
mov rax, 247
|
|
||||||
mov r10, rcx
|
|
||||||
syscall
|
|
||||||
ret
|
|
||||||
|
|
||||||
_exit:
|
|
||||||
mov rax, 60
|
|
||||||
syscall
|
|
Loading…
Reference in New Issue
Block a user