package memory //extern end var end uint32 // link.ld var placement_address uint32 // //extern __unsafe_get_addr func pointer2uint32(pointer *uint32) uint32 // , , func Init() { placement_address = pointer2uint32(&end) // } func kmalloc(size uint32, align int, phys *uint32) uint32 { // if align == 1 && (placement_address&0xFFFFF000) != uint32(0) { // - . placement_address &= 0xFFFFF000 placement_address += 0x1000 } if phys != nil { // - *phys = placement_address } res := placement_address // placement_address += size // return res } func Kmalloc(size uint32) uint32 { // return kmalloc(size, 0, nil) }
package runtime import ( "memory" ) //extern __unsafe_get_addr func pointer2byteSlice(ptr uint32) *[]byte //extern __unsafe_get_addr func pointer2uint32(ptr interface{}) uint32 func memset(buf_ptr uint32, value byte, count uint32) { // memset var buf *[]byte buf = pointer2byteSlice(buf_ptr) for i := uint32(0); i < count; i++ { (*buf)[i] = value } } func memcpy(dst, src uint32, size uint32) { // memcpy var dest, source *[]byte dest = pointer2byteSlice(dst) source = pointer2byteSlice(src) for i := uint32(0); i < size; i++ { (*dest)[i] = (*source)[i] } } func New(typeDescriptor uint32, size uint32) uint32 { // new() // typeDescriptor buf_ptr := memory.Kmalloc(size) // memset(buf_ptr, 0, size) // return buf_ptr // }
;gccgo compability global __go_runtime_error global __go_register_gc_roots __go_register_gc_roots: __go_runtime_error: ret global __unsafe_get_addr ;convert uint32 to pointer __unsafe_get_addr: push ebp mov ebp, esp mov eax, [ebp+8] mov esp, ebp pop ebp ret extern go.runtime.New global __go_new global __go_new_nopointers __go_new: ; go.runtime.New __go_new __go_new_nopointers: call go.runtime.New ret
package kernel import ( "memory" "screen" ) func Load() { memory.Init() screen.Init() screen.Clear() str := new(string) *str = "Habrahabr" screen.PrintStr(*str) }
Source: https://habr.com/ru/post/259839/
All Articles