Страницы

Поиск по вопросам

Показаны сообщения с ярлыком kernel. Показать все сообщения
Показаны сообщения с ярлыком kernel. Показать все сообщения

воскресенье, 9 февраля 2020 г.

Выделить ещё ядер на обработку сети(sysctl)

#linux #сеть #kernel


При нагрузке на сеть(много соединений и дудос) у меня нагружается только ядро №5.
 Как можно распределить нагрузку на все ядра?(настраивал sysctl, irqbalance нет)
    


Ответы

Ответ 1



Для начала, тебе нужно узнать, работает ли на твоем сервере механизм ядра, называющийся RPS: watch -n1 cat /proc/softirqs Если NET_RX и NET_TX прерывания идут только на одно ядро, значит RPS не включен, и его необходимо сконфигурировать, с помощью установки битовых масок в: /sys/class/net/DEVICE/queues/QUEUE/rps_cpus Битовые маски, в HEX формате означают, на каких cpu будут обрабатываться сетевые прерывания, и для каждой системы они будут разные. Статья с примером установки таких масок: https://habrahabr.ru/company/flant/blog/332432/ Подробнее об RPS можно прочитать тут: https://github.com/torvalds/linux/blob/v3.13/Documentation/networking/scaling.txt#L138-L164

Как подписаться на изменение файла в файловой системе?

#php #linux #c #kernel


Хочу создать процесс, который посылал данные из файла, при изменении этих файлов.
На ум приходит только, в цикле на каждом тике проверять время последней модификации
файла, но хотелось бы как-то подписаться на событие файловой системы (чтобы система
сама меня оповещала об этом).
Есть ли какие-либо для этого процедур
    


Ответы

Ответ 1



Штука, которая Вам нужна, называется inotify. А дальше просто гуглением находятся примеры, например это.

четверг, 23 января 2020 г.

Как научится низкоуровневому программированию под linux

#kernel #c #system #linux


Доброго времени суток. Изучаю язык С и учусь работать в Linux. Далее планирую заняться
низкоуровневым программированием под Linux, в частности работой с ядром Linux. Есть
книги по ядру, планирую их изучать, но что делать дальше мне неясно. Пожалуйста посоветуйте
направление развития для данной области. И какие есть специализации в данной области?
Насколько знаю это - написание драйверов, тестирование; вроде и все...     


Ответы

Ответ 1



@1z0, в качестве работы за которую платят деньги? -- Что же касается ответа на заголовок вопроса, то я бы посоветовал начать с чтения файлов в /usr/include и самостоятельного обдумывания, как бы Вы сами это реализовали. Обновление Большинство из них -- к устройству ядра действительно отношения не имеют. Однако, обратите внимание -- низкоуровневое программирование в Linux это по большей части не программирование ядра, а программирование с использованием libc (и опосредовано ядра). По поводу, непосредственно ядра. Почитайте конечно книжки, например, Роберт Лав "Linux. Системное программирование" и "Разработка ядра Linux" и потом потренируйтесь. Скачайте исходники, посмотрите как люди пишут, попробуйте что-нибудь свое придумать и добавить. Обновление 2 Вот небольшой список сайтов: https://www.kernel.org/ наверняка известен Вам, там http://vger.kernel.org/ -- можете подписаться на e-mail рассылку -- место, где размещают важные сообщения и члены сообщества ведут разработку. http://lwn.net/ новости Linux http://kernelnewbies.org/ Linux Kernel Newbies читайте, изучайте.

В чем разница между bintime() и nanotime()?

#freebsd #kernel


В чем разница между nanotime(9) и bintime(9), если возвращаемое значение bintime(struct
bintime) можно конвертировать c помощью bintime2timespec в значение nanotime(timespec)?
    


Ответы

Ответ 1



bintime использует структуры с более натуральными полями, арифметика над которыми значительно проще, и потому их использование более эффетивно. Текущие версии ядра и системных утилит используют именно bintime структуры для операций с отметками времени, переводя в други форматы только при необходимости. Грубо говоря, nanotime реализовано через bintime.

четверг, 2 января 2020 г.

Загрузка ядра linux

#linux #загрузка #kernel #boot


Здраствуйте, решил себе ради интереса создать linux дистрибутив.

Собрал ядро, создал загрузочный ramdisk, сделал все что мне нужно в ramdisk

В итоге у меня вышла такая структура каталогов:

Папка boot в ней две папки, первая initrd, вторая kernel, в первой лежит main.gz
во второй kernel.lk

Как теперь из этого всего сделать img образ чтоб запустить в эмуляторе? Гугл сказал
что мне нужен загрузчик

Много чего в гугле читал но нормального мануала по установке загрузчика для новичка
не нашел.

Мог бы кто расказать подробнее, 
ибо я новичок: первый раз собрал ядро.
    


Ответы

Ответ 1



Смотря какой эмулятор используете, например Qemu поддерживает прямую загрузку ядра и рамдиска. Используй параметры -kernel bzImage use 'bzImage' as kernel image -append cmdline use 'cmdline' as kernel command line -initrd file use 'file' as initial ram disk или Воспользуйся virt-manager или virt-install - хорошие менеджеры для qemu. На других виртуалках можно воспользоваться GRUB или Syslinux. Для этого создайте образ диска dd if=/dev/zero of=newos.img bs=10M count=10. Потом создадим там раздел и файловую систему $ fdisk ./newos.img Welcome to fdisk (util-linux 2.26.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. На диске не удалось найти таблицу разделов. Created a new DOS disklabel with disk identifier 0xa17f7b6a. Команда (m для справки): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Номер раздела (1-4, default 1): 1 Первый сектор (2048-20479, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-20479, default 20479): Created a new partition 1 of type 'Linux' and of size 9 MiB. Команда (m для справки): w The partition table has been altered. Syncing disks. $ sudo partx -a ./newos.img $ sudo mkfs.ext4 /dev/loop0p1 Смонтируй луп и скопируй туда папочку /boot/ и установим туда grub: grub-install --boot-directory=КАТАЛОГ /dev/loop0 И можно отключить образ $ partx -d ./newos.img В некоторых деталях алгоритм установки скорее всего прийдется подкоректировать. И всеже рекомендую использовать qemu для игр с рамдиском ;)

четверг, 26 декабря 2019 г.

Полное имя вызывающего процесса в модуле ядра linux

#kernel #system #cpp #linux


Есть модуль, осуществляющий хук некоторых системных вызовов, необходимо определить
полный путь к образу процесса, который осуществил системный вызов.
  Сейчас получаю 
current->pid

после чего делаю 
sys_readlink((char*)link, buf, bufsize);

от 
/proc/#PID#/exe

получая почти всегда полный путь, но для некоторых процессов (например, chrome иногда)
вместо полного пути возвращается только имя процесса.
  Есть ли другой способ определить полный путь к образу вызывающего процесса ?    


Ответы

Ответ 1



Есть такая функция proc_pid_cmdline. Я уверен, что либо она сама, либо ее содержимое будет полезно. Однако надо заметить, что получение полного имени процесса не всегда возможно. Скорее всего это врядли получится в контексте обработчика прерывания.

вторник, 10 декабря 2019 г.

Как загрузить ядро системы загрузчиком на fasm?

#c #ассемблер #kernel #os #fasm


Доброе время суток! Недавно начал писать свою ос на FASM и C и застрял на создании
ядра. (пишу в Windows, mingw) 

Вкратце, мне нужно залинковать загрузчик и ядро, но пока ничего не выходит.

Код загрузчика (bootloader.asm):

format binary
; preparation
org 0x7c00
use16

begin:
xor ax, ax
mov ds, ax
mov es, ax

mov [disk], dl ; save disk number for later

mov si, loading16 ; print welcome string
pchar:
 .lp:
  mov al, [si]
  cmp al, 0
  je .exit
 .pch:
  mov ah, 0eh
  int 10h
  add si, 1
  jmp .lp
 .exit:


mov ah, 0  ;reset disk
int 13h

; load kernel_entry and kernel from disk
mov ah, 2h     ;read sectors
mov al, 1      ;sectors to read
mov ch, 0      ;cylinder idx
mov dh, 0      ;head idx
mov cl, 2      ;sector idx
mov dl, [disk] ;disk idx
mov bx, 0x1000 ;target pointer
int 13h


; get into pm and jump to KERNEL label
jmp switch_to_pm

jmp $ ; never executed

use32
KERNEL:

jmp 0x1000 ; jump to the actual kernel

jmp $ ; never executed


include './32/gdt.asm'        ; gdt for protected mode
include './32/switch32.asm'   ; code for entering protected mode
include './32/strout32.asm'   ; protected mode print

;; data

disk: rb 1

use16
wc32: db "Welcome to x32!", 0
loading16: db "Loading OS"
osver: db "v.0.0", 0

;bootloader fill
times 510-($-$$) db 0
;magic number
dw 0xaa55

;;;;;;;;;;;;;


./32/gdt.asm:

use16
gdt_start:
    dq 0x0
gdt_code:
    dw 0xFFFF
    dw 0x0
    db 0x0
    db 10011010b
    db 11001111b
    db 0x0
gdt_data:
    dw 0xFFFF
    dw 0x0
    db 0x0
    db 10010010b
    db 11001111b
    db 0x0
gdt_end:

; GDT descriptor
gdt_descriptor:
    dw gdt_end - gdt_start - 1 ; size (16 bit), always one less of its true size
    dd gdt_start ; address (32 bit)

; define some constants for later use
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start


./32/strout32.asm:

use32

VIDEO_MEMORY equ 0xb8000
WHITE_ON_BLACK equ 0x0f ; the color byte for each character

__print_string_label:
    mov edx, VIDEO_MEMORY

.print_string_pm_loop:
    mov al, [ebx] ; [ebx] is the address of our character
    mov ah, WHITE_ON_BLACK

    cmp al, 0 ; check if end of string
    je .print_string_pm_done

    mov [edx], ax ; store character + attribute in video memory
    add ebx, 1 ; next char
    add edx, 2 ; next video memory position

    jmp .print_string_pm_loop

.print_string_pm_done:
    ret

;PRINT MACRO
macro print _str* {
      mov ebx, _str
      call __print_string_label
}


./32/switch32.asm:

use16
switch_to_pm:
    mov ax, 0x2401
    int 15h ;A20

    mov ax, 3h
    int 10h

    cli ; 1. disable interrupts
    lgdt [gdt_descriptor] ; 2. load the GDT descriptor
    mov eax, cr0
    or eax, 0x1 ; 3. set 32-bit mode bit in cr0
    mov cr0, eax
    jmp CODE_SEG:init_pm ; 4. far jump by using a different segment

use32
init_pm: ; we are now using 32-bit instructions
    mov ax, DATA_SEG ; 5. update the segment registers
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    mov ebp, 0x90000 ; 6. update the stack right at the top of the free space
    mov esp, ebp

    call KERNEL ; 7. Call a well-known label with useful code
use16 ;     


Код загрузчика ядра (kernelentr.asm):

format elf
use32
extrn _start
call _start

jmp $        


Ядро (kernel.c):

void start (void) 
{
   unsigned char* vga = (unsigned char*) 0xb8000;
   vga[0] = 'X'; //need to make sure that this is a character
   vga[1] = 0x09; //append the attribute byte
   for(;;); //make sure our kernel never stops, with an infinite loop
}


Мой порядок действий:


Компиляция ядра

gcc -m32 -ffreestanding -nostdlib -c kernel.c -o kernel.o

Линковка получившегося обьекта и загрузчика ядра(?)

ld -T NUL -o kernel.tmp -Ttext 0x1000 kernelentr.o kernel.o

Извлечение бинарного кода из ядра с загрузчиком

objcopy -O binary -j .text  kernel.tmp kernel.bin

Совмещение загрузчика и получившегося бинарника

copy /b bootloader.bin+kernel.bin os.bin



EDIT: Команды брал отсюда - https://stackoverflow.com/questions/25128579/ld-cannot-perform-pe-operations-on-non-pe-output-file-error

После всей процедуры получается файл который, увы, не запускается и вылетает из QEMU
с ошибкой 'Trying to execute code outside RAM or ROM at 0xc6fc458b'

Укажите пожалуйста на ошибку и и скажите как все таки заставить это штуку работать.

UPDATE: Вдруг бинарник таки заработал, но криво - 
Теперь при запуске и правда высвечиваеся синяя буква Х, но экран постоянно меняется
на до х32 (с надписью Loading OS v0.0) и обратно.
При этом эмулятор не крашится...
    


Ответы

Ответ 1



На шаге ld -T NUL -o kernel.tmp -Ttext 0x1000 kernelentr.o kernel.o получается файл с двумя исполняемыми секциями: .flat ("загрузчик ядра") и .text (сишный код): .flat:00000000 ; Segment type: Pure code .flat:00000000 ; Segment permissions: Read/Write/Execute .flat:00000000 _flat segment dword public 'CODE' use32 .flat:00000000 assume cs:_flat .flat:00000000 assume es:nothing, ss:nothing, ds:_flat, fs:nothing, gs:nothing .flat:00000000 call _start .flat:00000005 .flat:00000005 loc_5: ; CODE XREF: .flat:loc_5j .flat:00000005 jmp short loc_5 .flat:00000005 ; --------------------------------------------------------------------------- .flat:00000007 align 200h .flat:00000200 dd 380h dup(?) .flat:00000200 _flat ends .flat:00000200 .text:00001000 ; Section 2. (virtual address FFC01000) .text:00001000 ; Virtual size : 00000020 ( 32.) .text:00001000 ; Section size in file : 00000200 ( 512.) .text:00001000 ; Offset to raw data for section: 00000600 .text:00001000 ; Flags 60300020: Text Executable Readable .text:00001000 ; Alignment : 4 bytes .text:00001000 ; =========================================================================== .text:00001000 .text:00001000 ; Segment type: Pure code .text:00001000 ; Segment permissions: Read/Execute .text:00001000 _text segment dword public 'CODE' use32 .text:00001000 assume cs:_text .text:00001000 ;org 1000h .text:00001000 assume es:nothing, ss:nothing, ds:_flat, fs:nothing, gs:nothing .text:00001000 .text:00001000 ; =============== S U B R O U T I N E ======================================= .text:00001000 .text:00001000 ; Attributes: bp-based frame .text:00001000 .text:00001000 public _start .text:00001000 _start proc near ; CODE XREF: .flat:00000000p .text:00001000 .text:00001000 var_4 = dword ptr -4 .text:00001000 .text:00001000 push ebp .text:00001001 mov ebp, esp .text:00001003 sub esp, 10h .text:00001006 mov [ebp+var_4], 0B8000h .text:0000100D mov eax, [ebp+var_4] .text:00001010 mov byte ptr [eax], 58h ; 'X' .text:00001013 mov eax, [ebp+var_4] .text:00001016 add eax, 1 .text:00001019 mov byte ptr [eax], 9 .text:0000101C nop .text:0000101D leave .text:0000101E retn .text:0000101E _start endp .text:0000101E .text:0000101E ; --------------------------------------------------------------------------- .text:0000101F align 200h .text:00001200 dd 380h dup(?) .text:00001200 _text ends На следующем шаге (objcopy) из этого исполняемого файла извлекается содержимое только секции .text, а код загрузчика ядра по факту никак не используется. Можно убедиться в этом, если с помощью дизассемблера посмотреть содержимое kernel.bin, полученного на шаге objcopy: seg000:00000000 ; Segment type: Pure code seg000:00000000 seg000 segment byte public 'CODE' use32 seg000:00000000 assume cs:seg000 seg000:00000000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing seg000:00000000 push ebp seg000:00000001 mov ebp, esp seg000:00000003 sub esp, 10h seg000:00000006 mov dword ptr [ebp-4], 0B8000h seg000:0000000D mov eax, [ebp-4] seg000:00000010 mov byte ptr [eax], 58h seg000:00000013 mov eax, [ebp-4] seg000:00000016 add eax, 1 seg000:00000019 mov byte ptr [eax], 9 seg000:0000001C nop seg000:0000001D leave seg000:0000001E retn seg000:0000001E ; --------------------------------------------------------------------------- seg000:0000001F align 10h seg000:0000001F seg000 ends Видим только функцию, без кода ее вызова и бесконечного цикла после вызова. Нужно сделать, чтобы при линковке все попало в одну секцию. Можно просто явно указать имя секции в kernelentr.asm: format elf use32 extrn _start section '.text' call _start jmp $ Результат линковки: .text:00001000 ; Segment type: Pure code .text:00001000 ; Segment permissions: Read/Execute .text:00001000 _text segment dword public 'CODE' use32 .text:00001000 assume cs:_text .text:00001000 ;org 1000h .text:00001000 assume es:nothing, ss:nothing, ds:_text, fs:nothing, gs:nothing .text:00001000 .text:00001000 ; =============== S U B R O U T I N E ======================================= .text:00001000 .text:00001000 ; Attributes: noreturn .text:00001000 .text:00001000 public start .text:00001000 start proc near .text:00001000 call _start .text:00001005 .text:00001005 loc_1005: ; CODE XREF: start:loc_1005j .text:00001005 jmp short loc_1005 .text:00001005 start endp .text:00001005 .text:00001005 ; --------------------------------------------------------------------------- .text:00001007 align 4 .text:00001008 .text:00001008 ; =============== S U B R O U T I N E ======================================= .text:00001008 .text:00001008 ; Attributes: bp-based frame .text:00001008 .text:00001008 public _start .text:00001008 _start proc near ; CODE XREF: startp .text:00001008 .text:00001008 var_4 = dword ptr -4 .text:00001008 .text:00001008 push ebp .text:00001009 mov ebp, esp .text:0000100B sub esp, 10h .text:0000100E mov [ebp+var_4], 0B8000h .text:00001015 mov eax, [ebp+var_4] .text:00001018 mov byte ptr [eax], 58h .text:0000101B mov eax, [ebp+var_4] .text:0000101E add eax, 1 .text:00001021 mov byte ptr [eax], 9 .text:00001024 nop .text:00001025 leave .text:00001026 retn .text:00001026 _start endp .text:00001026 .text:00001026 ; --------------------------------------------------------------------------- .text:00001027 align 200h .text:00001200 dd 380h dup(?) .text:00001200 _text ends Листинг содержимого kernel.bin: seg000:00000000 call sub_8 seg000:00000005 seg000:00000005 loc_5: ; CODE XREF: seg000:loc_5j seg000:00000005 jmp short loc_5 seg000:00000005 ; --------------------------------------------------------------------------- seg000:00000007 align 4 seg000:00000008 seg000:00000008 ; =============== S U B R O U T I N E ======================================= seg000:00000008 seg000:00000008 ; Attributes: bp-based frame seg000:00000008 seg000:00000008 sub_8 proc near ; CODE XREF: seg000:00000000p seg000:00000008 seg000:00000008 var_4 = dword ptr -4 seg000:00000008 seg000:00000008 push ebp seg000:00000009 mov ebp, esp seg000:0000000B sub esp, 10h seg000:0000000E mov [ebp+var_4], 0B8000h seg000:00000015 mov eax, [ebp+var_4] seg000:00000018 mov byte ptr [eax], 58h seg000:0000001B mov eax, [ebp+var_4] seg000:0000001E add eax, 1 seg000:00000021 mov byte ptr [eax], 9 seg000:00000024 nop seg000:00000025 leave seg000:00000026 retn seg000:00000026 sub_8 endp Дальше проходим по пунктам из вопроса, в конце запускаем os.bin с помощью QEMU: Стабильно показывает X, картинка не меняется (если не считать мигающего курсора под Х).

среда, 27 ноября 2019 г.

Kernel Panic при загрузке ОС (Red Hat)

#linux #kernel #redhat


Сервер с ОС - Red Hat.
Ядро 2.6.32-279.el6.x86_64

Сервер крутится на VmWare.
Работал нормально, но внезапно, на утро, перестал пускать пользователя. Решил перезагрузить
сервер. После перезагрузки сервер выпал в Kernel Panic.

Конфиг grub.conf

root (hd0,0)
kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=UUID=357f520e-d03a-4990-996b-06b24ac965bb
rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG-en_US.UTF-8 rd_NOMD SYSFONT=latarcyrheb-sun16
crashkernel=auto rd_NO_LVM biosdevname=0rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.x86_64.img


По логам загрузки видно, что проблема с SELinux.  , 

Хотя файл load_policy на месте.

[root@localhost sbin]# ls -la | grep load_
-rwxr-xr-x. 1 root root 11216 Mar 6 06:04 load_policy


Если отключить при загрузке ядра SELinux, то падает в новую ошибку:


Да и по факту, читал, что не имеет смысла отключать SELinux.

Нашел похожую проблему с xen, но я не совсем осознал, как он это решил. Если кто-нибудь
переведет на пальцах, буду благодарен.

Update:


Update2:


Update3:


Update4:

    


Ответы

Ответ 1



Скорее всего файловая система повреждена. Вам нужно любым образом получить доступ к диску не монтируя проблемную ФС, затем: fsck -f /dev/sda2

Ответ 2



В итоге, root раздел по одной папке из образа диска кидался в крашнутую систему.

среда, 17 июля 2019 г.

IO-функции в kernel-space

Env.: macOS, пишу драйвер, компилятор - clang

Пытаюсь использовать ф-ию write, подключаю хэдер unistd.h - компилятор выдает ошибку - файл не найден. Указываю в настройках проекта дополнительный путь, где искать хэдеры - /usr/include - компилятор выдает бесчисленное количество ошибок самого разного содержания. С чем это связано? Я не могу в kernel-space использовать write? Или я должен использовать какие-то другие ф-ии?


Ответ

Я не уверен, что это единственный доступный способ, но он рабочий:
vnode_t vnode = NULLVP; vfs_context_t ctxt = vfs_context_create(0); errno_t errno;
errno = vnode_open(file_name_buf, (O_TRUNC | O_CREAT | O_RDWR), S_IRUSR | S_IWUSR, VNODE_LOOKUP_NOFOLLOW, &vnode, ctxt); if (!errno) { vn_rdwr(UIO_WRITE , vnode , buffer , buf_inf.bytesused , 0 , UIO_SYSSPACE , IO_NOCACHE | IO_NODELOCKED | IO_UNIT , vfs_context_ucred(ctxt) , (int*)0 , vfs_context_proc(ctxt));
vnode_close(vnode, FWASWRITTEN, ctxt); }
Вместо vfs_context_create(0) можно использовать vfs_context_current()

среда, 10 июля 2019 г.

Коммутация трафика к разным серверам

Пишу балансировщик нагрузки сети, возник вопрос по поводу работы сети в целом.
Есть два коммутатора, сервер балансировки, клиенты и серверы (допустим, что все серверы идентичны).
Подключено это следующим образом: клиенты подключены к первому коммутатору, сервер балансировки подключен и к первому и ко второму коммутатору (две сетевые карты), серверы подключены ко второму коммутатору.
Сервер балансировки, имея данные о загруженности серверов, изменяет адрес назначения пакета от клиента, пересчитывает контрольную сумму, и отправляет в интерфейс, который смотрит в сторону серверов (второй коммутатор).
Изначально я хотел обрабатывать весь трафик, проходящий к/через сервер балансировки, но после тестов понял, что не хватит мощности сервера для такой работы.
Вопросы:
Возможно ли такое: клиент обращается к серверу балансировки, к примеру обычный tcp-клиент, я изменяю адрес назначения на свободный сервер, далее клиент, получив ответ от сервера, уже общается с сервером напрямую. (я не уверен что так будет работать). Как ещё можно заставить клиента общаться напрямую с нужным мне сервером?


Ответ

например, можно отослать клиенту icmp-пакет redirect с кодом 1 — redirect for host

воскресенье, 14 апреля 2019 г.

Как подписаться на изменение файла в файловой системе?

Хочу создать процесс, который посылал данные из файла, при изменении этих файлов. На ум приходит только, в цикле на каждом тике проверять время последней модификации файла, но хотелось бы как-то подписаться на событие файловой системы (чтобы система сама меня оповещала об этом). Есть ли какие-либо для этого процедур


Ответ

Штука, которая Вам нужна, называется inotify. А дальше просто гуглением находятся примеры, например это

суббота, 16 марта 2019 г.

В чем разница между bintime() и nanotime()?

В чем разница между nanotime(9) и bintime(9), если возвращаемое значение bintime(struct bintime) можно конвертировать c помощью bintime2timespec в значение nanotime(timespec)?


Ответ

bintime использует структуры с более натуральными полями, арифметика над которыми значительно проще, и потому их использование более эффетивно. Текущие версии ядра и системных утилит используют именно bintime структуры для операций с отметками времени, переводя в други форматы только при необходимости. Грубо говоря, nanotime реализовано через bintime

понедельник, 14 января 2019 г.

Загрузка ядра linux

Здраствуйте, решил себе ради интереса создать linux дистрибутив.
Собрал ядро, создал загрузочный ramdisk, сделал все что мне нужно в ramdisk
В итоге у меня вышла такая структура каталогов:
Папка boot в ней две папки, первая initrd, вторая kernel, в первой лежит main.gz во второй kernel.lk
Как теперь из этого всего сделать img образ чтоб запустить в эмуляторе? Гугл сказал что мне нужен загрузчик
Много чего в гугле читал но нормального мануала по установке загрузчика для новичка не нашел.
Мог бы кто расказать подробнее, ибо я новичок: первый раз собрал ядро.


Ответ

Смотря какой эмулятор используете, например Qemu поддерживает прямую загрузку ядра и рамдиска. Используй параметры
-kernel bzImage use 'bzImage' as kernel image -append cmdline use 'cmdline' as kernel command line -initrd file use 'file' as initial ram disk
или Воспользуйся virt-manager или virt-install - хорошие менеджеры для qemu.
На других виртуалках можно воспользоваться GRUB или Syslinux. Для этого создайте образ диска dd if=/dev/zero of=newos.img bs=10M count=10. Потом создадим там раздел и файловую систему
$ fdisk ./newos.img
Welcome to fdisk (util-linux 2.26.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command.
На диске не удалось найти таблицу разделов. Created a new DOS disklabel with disk identifier 0xa17f7b6a.
Команда (m для справки): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Номер раздела (1-4, default 1): 1 Первый сектор (2048-20479, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-20479, default 20479):
Created a new partition 1 of type 'Linux' and of size 9 MiB.
Команда (m для справки): w The partition table has been altered. Syncing disks. $ sudo partx -a ./newos.img $ sudo mkfs.ext4 /dev/loop0p1
Смонтируй луп и скопируй туда папочку /boot/ и установим туда grub: grub-install --boot-directory=КАТАЛОГ /dev/loop0
И можно отключить образ $ partx -d ./newos.img
В некоторых деталях алгоритм установки скорее всего прийдется подкоректировать. И всеже рекомендую использовать qemu для игр с рамдиском ;)