пытаюсь понять, почему qemu не хочет запускать ядро....
MAGIC equ 0x1BADB002
...
grubBoot:
dd MAGIC
dd FLAGS
; dd 0
dd (end_grubBoot - grubBoot)
dd -(MAGIC + FLAGS + (end_grubBoot - grubBoot))
; dd -(MAGIC + 0 + (end_grubBoot - grubBoot))
; dw 0
; dw FLAGS
; dd 8
end_grubBoot:MAGIC equ 0x1BADB002
dd MAGIC
dd FLAGS
dd -(MAGIC + FLAGS)...
Trace 0: 0x7f2a71e084c0 [00000000/000caa1a/0xb0]
----------------
IN:
0x00102060: 9b wait
0x00102061: db e3 fninit
0x00102063: bc 44 23 10 00 movl $0x102344, %esp
0x00102068: 53 pushl %ebx
0x00102069: 50 pushl %eax
0x0010206a: e8 68 00 00 00 calll 0x1020d7
Trace 0: 0x7f2a71e08800 [00000000/00102060/0xb0]
----------------
IN:
0x001020d7: 55 pushl %ebp
0x001020d8: 89 e5 movl %esp, %ebp
0x001020da: 68 00 10 10 00 pushl $0x101000
0x001020df: e8 8d ff ff ff calll 0x102071
Linking TBs 0x7f2a71e08800 [00102060] index 0 -> 0x7f2a71e08a40 [001020d7]
Trace 0: 0x7f2a71e08a40 [00000000/001020d7/0xb0]
----------------
IN:
0x00102071: 55 pushl %ebp
0x00102072: 89 e5 movl %esp, %ebp
0x00102074: 53 pushl %ebx
0x00102075: 83 ec 10 subl $0x10, %esp
0x00102078: c7 45 f4 00 80 0b 00 movl $0xb8000, -0xc(%ebp)
0x0010207f: c7 45 f8 00 00 00 00 movl $0, -8(%ebp)
0x00102086: eb 35 jmp 0x1020bd
Linking TBs 0x7f2a71e08a40 [001020d7] index 0 -> 0x7f2a71e08c80 [00102071]
Trace 0: 0x7f2a71e08c80 [00000000/00102071/0xb0]
----------------
IN:
0x001020bd: 8b 55 f8 movl -8(%ebp), %edx
0x001020c0: 8b 45 08 movl 8(%ebp), %eax
0x001020c3: 01 d0 addl %edx, %eax
0x001020c5: 0f b6 00 movzbl (%eax), %eax
0x001020c8: 0f be c0 movsbl %al, %eax
0x001020cb: 3b 45 f8 cmpl -8(%ebp), %eax
0x001020ce: 7f b8 jg 0x102088
Linking TBs 0x7f2a71e08c80 [00102071] index 0 -> 0x7f2a71e08f00 [001020bd]
Trace 0: 0x7f2a71e08f00 [00000000/001020bd/0xb0]
----------------
IN:
0x00102088: 8b 45 f8 movl -8(%ebp), %eax
0x0010208b: 8d 14 00 leal (%eax, %eax), %edx
0x0010208e: 8b 45 f4 movl -0xc(%ebp), %eax
0x00102091: 01 d0 addl %edx, %eax
0x00102093: 8b 55 f8 movl -8(%ebp), %edx
0x00102096: 8d 0c 12 leal (%edx, %edx), %ecx
0x00102099: 8b 55 f4 movl -0xc(%ebp), %edx
0x0010209c: 01 ca addl %ecx, %edx
0x0010209e: 0f b7 12 movzwl (%edx), %edx
0x001020a1: 89 d3 movl %edx, %ebx
0x001020a3: b3 00 movb $0, %bl
0x001020a5: 8b 4d f8 movl -8(%ebp), %ecx
0x001020a8: 8b 55 08 movl 8(%ebp), %edx
0x001020ab: 01 ca addl %ecx, %edx
0x001020ad: 0f b6 12 movzbl (%edx), %edx
0x001020b0: 66 0f be d2 movsbw %dl, %dx
0x001020b4: 09 da orl %ebx, %edx
0x001020b6: 66 89 10 movw %dx, (%eax)
0x001020b9: 83 45 f8 01 addl $1, -8(%ebp)
0x001020bd: 8b 55 f8 movl -8(%ebp), %edx
0x001020c0: 8b 45 08 movl 8(%ebp), %eax
0x001020c3: 01 d0 addl %edx, %eax
0x001020c5: 0f b6 00 movzbl (%eax), %eax
0x001020c8: 0f be c0 movsbl %al, %eax
0x001020cb: 3b 45 f8 cmpl -8(%ebp), %eax
0x001020ce: 7f b8 jg 0x102088
Linking TBs 0x7f2a71e08f00 [001020bd] index 1 -> 0x7f2a71e091c0 [00102088]
Trace 0: 0x7f2a71e091c0 [00000000/00102088/0xb0]
Linking TBs 0x7f2a71e091c0 [00102088] index 1 -> 0x7f2a71e091c0 [00102088]
Trace 0: 0x7f2a71e091c0 [00000000/00102088/0xb0]
----------------
IN:
0x001020d0: 90 nop
0x001020d1: 83 c4 10 addl $0x10, %esp
0x001020d4: 5b popl %ebx
0x001020d5: 5d popl %ebp
0x001020d6: c3 retl
Linking TBs 0x7f2a71e091c0 [00102088] index 0 -> 0x7f2a71e098c0 [001020d0]
Trace 0: 0x7f2a71e098c0 [00000000/001020d0/0xb0]
----------------
IN:
0x001020e4: 83 c4 04 addl $4, %esp
0x001020e7: eb fe jmp 0x1020e7
Trace 0: 0x7f2a71e09b00 [00000000/001020e4/0xb0]
----------------
IN:
0x001020e7: eb fe jmp 0x1020e7
Linking TBs 0x7f2a71e09b00 [001020e4] index 0 -> 0x7f2a71e09c40 [001020e7]
Trace 0: 0x7f2a71e09c40 [00000000/001020e7/0xb0]
Linking TBs 0x7f2a71e09c40 [001020e7] index 0 -> 0x7f2a71e09c40 [001020e7]
...LDEMU=-melf_i386
kernel: $(CSOURCES) $(NASMSOURCES) $(LDFILE)
$(CC) $(CEMU) -std=c$(CSTD) -c $(CSOURCES) -ffreestanding -nostdlib -nostdinc -fno-pic
$(ASM) $(NASMSOURCES)
$(LD) $(LDEMU) --nmagic -T$(LDFILE) -o kernel *.o При компиляции выдает ошибку
struct SYM* buildTree(struct SYM *psym[], int N) ... void division(struct alphabet *alphabetLetter, int groupCount) { int psysms[256]; ... psysms[i] = &alphabetLetter[i]; ... struct SYM *root = buildTree(psysms, alphabetLen); ... }
e.data.fd = cfd; e.data.ptr = (void*)cfd;
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};в документации сказано, что там должен быть дескриптор серверного сокета
l=[a_1,..,a_n] – некоторый список элементов типа T, а f:T→T, то:
map(f,l)↦[f(a_1 ),..,f(a_n )]
Не понятно что она делает и как ее реализовать.
#include <stddef.h>
struct list {
struct list *next;
};
struct list *map(void f(struct list *p), struct list *l)
{
struct list *i;
for (i = l; i != NULL; i = i->next)
f(i);
return l;
}
struct list_int {
struct list list;
int i;
};
void process_int(struct list *l)
{
struct list_int *p = (struct list_int *)l;
++p->i;
}
int main()
{
struct list_int l[] = {
[0] = {
.list.next = &l[1].list,
.i = 1,
},
[1] = {
.i = 2,
},
};
map(process_int, &l[0].list);
} Из за чего это ?
offsetof(struct my_struct_in, addr) чтобы в этом убедиться.uint32_t addr, если имелся в виду IP адрес). Паковать структуры (если выравнять нельзя), либо располагать поля согласно их натуральному выравниванию. Как на Си вывести флаги в том же формате, что делает команда objdump?
static void
dump_bfd_header (bfd *abfd)
{
char *comma = "";
printf (_("architecture: %s, "),
bfd_printable_arch_mach (bfd_get_arch (abfd),
bfd_get_mach (abfd)));
printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
PF (HAS_RELOC, "HAS_RELOC");
PF (EXEC_P, "EXEC_P");
PF (HAS_LINENO, "HAS_LINENO");
PF (HAS_DEBUG, "HAS_DEBUG");
PF (HAS_SYMS, "HAS_SYMS");
PF (HAS_LOCALS, "HAS_LOCALS");
PF (DYNAMIC, "DYNAMIC");
PF (WP_TEXT, "WP_TEXT");
PF (D_PAGED, "D_PAGED");
PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
printf (_("\nstart address 0x"));
bfd_printf_vma (abfd, abfd->start_address);
printf ("\n");
} void get_disks(char * allDisks[]) { char buf[128]; ... for (char *s = buf; *s; s += strlen(s) + 1) { ... allDisks[i] = s; ... allDisks[7] = "ABC"; allDisks[8] = "DEF"; } }
После прохождения массива функцией get_files список дисков исчезает, но "ABC" и "DEF" остаются.
Подскажите, почему так происходит, куда теряются первые строки и как исправить?
allDisks указатели на стековый массив buf, который разрушается после выхода из функции get_disks. А строчки "ABC" и "DEF" -- константные строчки, существуют всё время выполнения программы.allDisks:void get_disks(char * allDisks[])
{
char buf[128];
int i = 0;
GetLogicalDriveStringsA(sizeof(buf), buf);
for (char *s = buf; *s; s += strlen(s) + 1)
{
if (GetDriveTypeA(s) == 2 || GetDriveTypeA(s) == 3)
{
allDisks[i] = strdup(s);
++i;
allDisks[7] = "ABC";
allDisks[8] = "DEF";
}
}
} почему я неправильно ссылаюсь к указателю в структуре?zmienna_strukt.a=NULL; ... scanf("%s", wsk->a);
struct morgan zmienna_strukt;
struct morgan *wsk;
unsigned char buf[100];
wsk=&zmienna_strukt;
printf("Впиши значение: ");
fflush(stdout);
scanf("%d", &zmienna_strukt.b);
printf("%d \n\n", zmienna_strukt.b);
zmienna_strukt.a=buf;
buf[0] = 0;
printf("%s \n\n", zmienna_strukt.a);
printf("Впиши значение: ");
fflush(stdout);
scanf("%s", wsk->a);
printf("%s \n\n", wsk->a); #include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int cmp_min(const void *a, const void *b)
{
int va = *(const char *)a;
int vb = *(const char *)b;
return va - vb;
}
static int minimize(int v)
{
char str[sizeof(int) * 3 + 1];
int i;
sprintf(str, "%d", v);
qsort(str, strlen(str), 1, cmp_min);
if (str[0] == '0') {
for (i = 0; str[i]; ++i) {
if (str[i] != '0') {
str[0] = str[i];
str[i] = '0';
break;
}
}
}
sscanf(str, "%i", &v);
return v;
}
static int cmp_max(const void *a, const void *b)
{
int va = *(const char *)a;
int vb = *(const char *)b;
return vb - va;
}
static int maximize(int v)
{
char str[sizeof(int) * 3 + 1];
sprintf(str, "%d", v);
qsort(str, strlen(str), 1, cmp_max);
sscanf(str, "%i", &v);
return v;
}
int main()
{
int a, b;
int result_a, result_b;
scanf("%i %i", &a, &b);
result_a = a < 0 ? -minimize(-a) : maximize(a);
result_b = b < 0 ? -maximize(-b) : minimize(b);
printf("%d\n", result_a - result_b);
return 0;
} sum_of = sum(matrix[][]);
sum_of = sum(n, matrix);int sum (int n, int matrix[n][n]) { int sum = 0; for (int j = 0; j < n; ++j){ for (int i = 0; i < n; ++i){ if (j == i){ sum += matrix[j][i]; } } } return sum; }
int sum (int n, int matrix[n][n])
{
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += matrix[i][i];
}
return sum;
} float del (float a, float b)
{
float res;
...
res = ...;
....
return res;
}
....
float result = del (num1, num2);что делает "return res" во втором куске кода? То есть в переменную res записывается деление числа А и Б. А потом оно куда-то там возвращается..
Подскажите как можно реализовать программно текстовый протокол SCPI?
Есть синонимы команд, есть не обязательные параметры, параметры могут быть, могут не быть, может быть сразу несколько. Как это всё обрабатывать и проверять не пытается ли пользовать ввести несуществующую команду?
for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);
for(; *pchar; ++length, ++pchar);for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);
В каком месте может быть ошибка?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char **argv) {
int fd0[2], fd1[2], n;
char c;
pipe(fd0);
pipe(fd1);
if (!fork()) {
close(fd0[0]);
close(fd1[1]);
write(fd0[1], "c", 1);
sleep(1);
if ((n = read(fd1[0], &c, 1)) != 1) {
printf("Дочерний процесс. Результат чтения: %d\n", n);
exit(0);
}
printf("Дочерний процесс прочитал: %c\n", c);
exit(0);
}
close(fd1[0]);
close(fd0[1]);
write(fd1[1], "p", 1);
if ((n = read(fd0[0], &c, 1)) != 1) {
printf("Родительский процесс. Результат чтения: %d\n", n);
exit(0);
}
printf("Родительский процесс прочитал: %c\n", c);
exit(0);
return 0;
}